You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@harmony.apache.org by Regis <xu...@gmail.com> on 2009/06/23 04:29:46 UTC

(HARMONY-6216) problem with reading zero-length file

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.

Re: (HARMONY-6216) problem with reading zero-length file

Posted by Regis <xu...@gmail.com>.
Charles Lee wrote:
> No, Regis. No one will reply you........
> 

Please ignore it, I have started another thread.
Very sorry for that....

-- 
Best Regards,
Regis.

Re: (HARMONY-6216) problem with reading zero-length file

Posted by Charles Lee <li...@gmail.com>.
No, Regis. No one will reply you........

On Tue, Jun 23, 2009 at 10:29 AM, Regis <xu...@gmail.com> 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,
>
> 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.
>



-- 
Yours sincerely,
Charles Lee

Re: (HARMONY-6216) problem with reading zero-length file

Posted by Regis <xu...@gmail.com>.
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.