No, Regis. No one will reply you........ On Tue, Jun 23, 2009 at 10:29 AM, Regis <xu.re...@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