harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Regis <xu.re...@gmail.com>
Subject (HARMONY-6216) problem with reading zero-length file
Date Tue, 23 Jun 2009 02:29:46 GMT
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,

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