harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Regis <xu.re...@gmail.com>
Subject Re: (HARMONY-6216) problem with reading zero-length file
Date Tue, 23 Jun 2009 02:41:59 GMT
Regis wrote:
> Kyle Cho (JIRA) wrote:
>>     [ 
>> https://issues.apache.org/jira/browse/HARMONY-6216?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12721474#action_12721474

>> ]
>> Kyle Cho commented on HARMONY-6216:
>> -----------------------------------
>>
>> found that the patch breaks the following test case.
>>
>>   public static void main(String args[])
>>   {
>>     BufferedReader reader = new BufferedReader(new 
>> InputStreamReader(System.in));
>>     String line = null;
>>     try {
>>       line = reader.readLine();
>>     } catch (IOException e) {
>>       e.printStackTrace();
>>     }
>>     System.out.println(line);
>>   }
>>
>>> problem with reading zero-length file
>>> -------------------------------------
>>>
>>>                 Key: HARMONY-6216
>>>                 URL: https://issues.apache.org/jira/browse/HARMONY-6216
>>>             Project: Harmony
>>>          Issue Type: Bug
>>>          Components: Classlib
>>>    Affects Versions: 5.0M10
>>>         Environment: RedHat EL 5 x86
>>>            Reporter: Kyle Cho
>>>            Priority: Minor
>>>         Attachments: HARMONY-6216.diff
>>>
>>>
>>> The following test fails:
>>> ----------------------- proc.java starts ------------------
>>> import java.io.*;
>>> class proc {
>>>         public static void main(String args[])
>>>         {
>>>                 String s0 = "cpu";
>>>                 String s = null;
>>>                 String file= "/proc/cpuinfo"; // zero-length special 
>>> file
>>>                 try {
>>>                         BufferedReader br = new BufferedReader(new 
>>> FileReader(new File(file)));
>>>                         do {
>>>                                 if ((s = br.readLine()) == null) {
>>>                                         break;
>>>                                 }
>>>                                 System.out.println("s: "+s);
>>>                         } while (s.indexOf(s0) == -1);
>>>                 } catch (IOException ioe) {
>>>                         ioe.printStackTrace();
>>>                 }
>>>                 System.out.println("s: "+s);
>>>         }
>>> }
>>> ----------------------- proc.java ends -------------------
>>> java.io.IOException
>>>         at 
>>> org.apache.harmony.luni.platform.OSFileSystem.seek(OSFileSystem.java:110) 
>>>
>>>         at java.io.FileInputStream.available(FileInputStream.java:149)
>>>         at java.io.InputStreamReader.read(InputStreamReader.java:249)
>>>         at java.io.BufferedReader.fillbuf(BufferedReader.java:107)
>>>         at java.io.BufferedReader.readLine(BufferedReader.java:318)
>>>         at proc.main(proc.java:11)
>>> s: null
>>
> 
> Hi gays,

Sorry guys, my fingers just out of control, no mean to offend.
Sorry again.....

> 
> I have investigated this issue for a while, but can't find a good way to 
> resolve it :(
> 
> It is started by Harmony can't read zero-length special file in Linux, 
> like file /proc/cpuinfo. Harmony InputStreamReader used available() 
> before reading chars:
> 
> if ((in.available() == 0) && (out.position() > offset)) {
>     // we could return the result without blocking read
>     break;
> }
> 
> but available() can't work with zero-length special file, throws 
> IOException (so do RI). So I removed the whole "if" statement, it break 
> read from stdin, I realized that the "if" is just for stdin.
> 
> For stdin, read will return immediately once has read some bytes, don't 
> need to try to fill the given buffer full. But for FileInputStream, read 
> operation will try its best to fill the buffer. That's different.
> 
> I have no idea how to combine these two behaviors in one read methods 
> without using available(). Anyone have ideas or suggestions?
> 


-- 
Best Regards,
Regis.

Mime
View raw message