harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Geir Magnusson Jr <g...@pobox.com>
Subject Re: relying on 'available()' (was: RE: [jira] Updated: (HARMONY-166) method read() in InputStreamReader failed to read one character)
Date Tue, 25 Apr 2006 11:00:36 GMT
psst... hey, Mikhail... how about a "[classlib]" on this subject line? :)


Mikhail Loenko wrote:
> 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
> 
> 

---------------------------------------------------------------------
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