[ 
https://issues.apache.org/jira/browse/IO-277?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Niall Pemberton resolved IO-277.
--------------------------------

       Resolution: Fixed
    Fix Version/s: 2.1
         Assignee: Niall Pemberton

I have implemented your suggestion to replace unmappable characters so that 
behaviour is consistent with WriterOutputStream. Also I have added constructors 
to ReaderInputStream/WriterOutputStream that take CharsetEncoder/CharsetDecoder 
respectively so that if this is not the desired behaviour, then people can 
define their own. Thanks for reporting this and the test case. 

> ReaderInputStream enters infinite loop when it encounters an unmappable 
> character
> ---------------------------------------------------------------------------------
>
>                 Key: IO-277
>                 URL: https://issues.apache.org/jira/browse/IO-277
>             Project: Commons IO
>          Issue Type: Bug
>          Components: Streams/Writers
>    Affects Versions: 2.0.1
>            Reporter: Mike Thomas
>            Assignee: Niall Pemberton
>             Fix For: 2.1
>
>         Attachments: TestReaderInputStreamLoop.java
>
>
> The ReaderInputStream.read(byte[] b, int off, int len) method enters an 
> infinite loop when its CharsetEncoder encounters an unmappable character in 
> the input buffer.
> When its CharsetEncoder encounters an unmappable character, the value of 
> CoderResult lastCoderResult.isUnmappable() == true, and Reader.read() is not 
> invoked on the underlying Reader ever again.
> Attaching source file that reproduces this behavior.
> One fix to consider is to call 
> CharsetEncoder.onUnmappableCharacter(CodingErrorAction) in the 
> ReaderInputStream constructor with a value other than the default 
> CodingErrorAction.REPORT. e.g.:
> public ReaderInputStream(Reader reader, Charset charset, int bufferSize) {
>             this.reader = reader;
>             encoder = charset.newEncoder();
>             encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
> ...
> By replacing the unmappable character with encoder's default replacement 
> character, this effectively prevents the infinite loop from occurring. I'm 
> not sure if that's the ideal behavior, but it seems fairly consistent with 
> what org.apache.commons.io.output.WriterOutputStream does.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to