You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@harmony.apache.org by Mikhail Loenko <ml...@gmail.com> on 2006/04/25 06:15:23 UTC

relying on 'available()' (was: RE: [jira] Updated: (HARMONY-166) method read() in InputStreamReader failed to read one character)

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


Re: relying on 'available()' (was: RE: [jira] Updated: (HARMONY-166) method read() in InputStreamReader failed to read one character)

Posted by Vladimir Strigun <vs...@gmail.com>.
Mikhail,

OK, I'll prepare new patch. I've found other 2 issues that can affect
InputStreamReader and I'll submit it soon.

Thanks.
Vladimir.

On 4/25/06, Mikhail Loenko <ml...@gmail.com> 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


[humor] Re: [admin] Re: relying on 'available()' (was: RE: [jira] Updated: (HARMONY-166) method read() in InputStreamReader failed to read one character)

Posted by Geir Magnusson Jr <ge...@pobox.com>.
very funny

Mikhail Loenko wrote:
> ops. sorry
> 
> 2006/4/25, Geir Magnusson Jr <ge...@pobox.com>:
>> 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
>>
>>
> 
> ---------------------------------------------------------------------
> 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


[admin] Re: relying on 'available()' (was: RE: [jira] Updated: (HARMONY-166) method read() in InputStreamReader failed to read one character)

Posted by Mikhail Loenko <ml...@gmail.com>.
ops. sorry

2006/4/25, Geir Magnusson Jr <ge...@pobox.com>:
> 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
>
>

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


Re: relying on 'available()' (was: RE: [jira] Updated: (HARMONY-166) method read() in InputStreamReader failed to read one character)

Posted by Geir Magnusson Jr <ge...@pobox.com>.
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