harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mikhail Loenko" <mloe...@gmail.com>
Subject relying on 'available()' (was: RE: [jira] Updated: (HARMONY-166) method read() in InputStreamReader failed to read one character)
Date Tue, 25 Apr 2006 04:15:23 GMT
Vladimir,

>Method available() is still used to determine endOfInput parameter.
According to >specification the
>method should be overridden by subclasses.

'should' does not mean 'must' , moreover it might be a user class who
does not care what the spec says. There could be cases when you do not
know how many bytes are available and you have to return 0.

So I think the patch should be modified to avoid 'available()'

Thanks,
Mikhail

>-----Original Message-----
>From: Vladimir Strigun (JIRA) [mailto:jira@apache.org]
>Sent: Monday, April 24, 2006 5:14 PM
>To: harmony-commits@incubator.apache.org
>Subject: [jira] Updated: (HARMONY-166) method read() in
InputStreamReader failed to read one
>character
>
>     [ http://issues.apache.org/jira/browse/HARMONY-166?page=all ]
>
>Vladimir Strigun updated HARMONY-166:
>-------------------------------------
>
>    Attachment: InputStreamReader.java.patch
>
>Mikhail,
>
>please review my patch.  Now method read() is not modified. I just
add decoding operations to
>fillBuf() method.
>Method available() is still used to determine endOfInput parameter.
According to specification the
>method should be overridden by subclasses.
>
>> method read() in InputStreamReader failed to read one character
>> ---------------------------------------------------------------
>>
>>          Key: HARMONY-166
>>          URL: http://issues.apache.org/jira/browse/HARMONY-166
>>      Project: Harmony
>>         Type: Bug
>
>>   Components: Classlib
>>     Reporter: Vladimir Strigun
>>  Attachments: InputStreamReader.java.patch, InputStreamReader.patch.txt,
>InputStreamReaderTest.java
>>
>> I've started to play with harmony-57 contribution and found bug in
InputStreamReader class.
>Method read() should read a single character from input stream but it
works incorrectly for 2
>bytes-per-char charsets. Example below shows that it failed to read
one character in UTF-16
>charset. Sorry for so ugly test, it's just a part of
InputStreamReaderTest from Harmony-57
>contribution.
>> import java.io.*;
>> import junit.framework.TestCase;
>> public class InputStreamReaderTest extends TestCase {
>> public static void main(String[] args) {
>> junit.textui.TestRunner.run(InputStreamReaderTest.class);
>> }
>> public void test_ISR_read() throws Exception {
>> InputStream in;
>> InputStreamReader reader;
>> try {
>> in = new LimitedByteArrayInputStream(0);
>> reader = new InputStreamReader(in, "UTF-16BE");
>> int xx = reader.read();
>> assertTrue("Incorrect byte UTF-16BE", xx == '\u6172');
>> } catch (UnsupportedEncodingException e) {
>> // Can't test without the converter
>> System.out.println(e);
>> } catch (IOException e) {
>> e.printStackTrace();
>> fail("UTF-16BE unexpected 1: " + e);
>> }
>> try {
>> in = new LimitedByteArrayInputStream(0);
>> reader = new InputStreamReader(in, "UTF-16LE");
>> int xx = reader.read();
>> assertTrue("Incorrect byte UTF-16BE", xx == '\u7261');
>> } catch (UnsupportedEncodingException e) {
>> // Can't test without the converter
>> } catch (IOException e) {
>> fail("UTF-16BE unexpected 2: " + e);
>> }
>> try {
>> in = new LimitedByteArrayInputStream(1);
>> reader = new InputStreamReader(in, "UTF-16");
>> assertTrue("Incorrect byte UTF-16BE", reader.read() == '\u7261');
>> } catch (UnsupportedEncodingException e) {
>> // Can't test without the converter
>> } catch (IOException e) {
>> fail("UTF-16BE unexpected 3: " + e);
>> }
>> try {
>> in = new LimitedByteArrayInputStream(2);
>> reader = new InputStreamReader(in, "ISO2022JP");
>> int ch = reader.read();
>> assertTrue("Incorrect byte ISO2022JP 1: " + ch, ch == '\u4e5d');
>> ch = reader.read();
>> assertTrue("Incorrect byte ISO2022JP 2: " + ch, ch == '\u7b2c');
>> } catch (UnsupportedEncodingException e) {
>> // Can't test without the converter
>> System.out.println(e);
>> } catch (IOException e) {
>> fail("ISO2022JP unexpected: " + e);
>> }
>> }
>> static class LimitedByteArrayInputStream extends ByteArrayInputStream {
>> // A ByteArrayInputStream that only returns a single byte per read
>> byte[] bytes;
>> int count;
>> public LimitedByteArrayInputStream(int type) {
>> super(new byte[0]);
>> switch (type) {
>> case 0:
>> bytes = new byte[] { 0x61, 0x72 };
>> break;
>> case 1:
>> bytes = new byte[] { (byte) 0xff, (byte) 0xfe, 0x61, 0x72 };
>> break;
>> case 2:
>> bytes = new byte[] { '\u001b', '$', 'B', '6', 'e', 'B', 'h',
>> '\u001b', '(', 'B' };
>> break;
>> }
>> count = bytes.length;
>> }
>> public int read() {
>> if (count == 0)
>> return -1;
>> count--;
>> return bytes[bytes.length - count];
>> }
>> public int read(byte[] buffer, int offset, int length) {
>> if (count == 0)
>> return -1;
>> if (length == 0)
>> return 0;
>> buffer[offset] = bytes[bytes.length - count];
>> count--;
>> return 1;
>> }
>> public int available() {
>> return count;
>> }
>> }
>> }
>
>--
>This message is automatically generated by JIRA.
>-
>If you think it was sent incorrectly contact one of the administrators:
>   http://issues.apache.org/jira/secure/Administrators.jspa
>-
>For more information on JIRA, see:
>   http://www.atlassian.com/software/jira

---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: harmony-dev-unsubscribe@incubator.apache.org
For additional commands, e-mail: harmony-dev-help@incubator.apache.org


Mime
View raw message