You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Chen (Jira)" <ji...@apache.org> on 2020/03/13 07:27:00 UTC

[jira] [Updated] (CSV-259) printWithEscapes gets StringIndexOutOfBoundsException when value is Reader

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

Chen updated CSV-259:
---------------------
    Description: 
{code:java}
//代码占位符
@Test
public void testPrintWithEscapeReader() throws IOException {
    final StringWriter sw = new StringWriter();
    final CSVFormat format = CSVFormat.DEFAULT.withEscape('!').withQuoteMode(QuoteMode.NONE);
    Reader reader = new FileReader("src/test/resources/testPrintWithReader.txt");
    try (final CSVPrinter printer = new CSVPrinter(sw, format)) {
        printer.print(reader);
        assertEquals("q!,w!,e", sw.toString());
    }
}
{code}
and the values in testPrintWithReader.txt is
{code:java}
//代码占位符
q,w,e
{code}
after tracing the code I think the problem cause by here
{code:java}
//代码占位符
private void printWithEscapes(final Reader reader, final Appendable out) throws IOException {
    int start = 0;
    int pos = 0;

    final char delim = getDelimiter();
    final char escape = getEscapeCharacter().charValue();
    final StringBuilder builder = new StringBuilder(IOUtils.DEFAULT_BUFFER_SIZE);

    int c;
    while (-1 != (c = reader.read())) {
        builder.append((char) c);
        if (c == CR || c == LF || c == delim || c == escape) {
            // write out segment up until this char
            if (pos > start) {
                out.append(builder.substring(start, pos));
                builder.setLength(0);
            }
            if (c == LF) {
                c = 'n';
            } else if (c == CR) {
                c = 'r';
            }

            out.append(escape);
            out.append((char) c);

            start = pos + 1; // start on the current char after this one
        }
        pos++;
    }

    // write last segment
    if (pos > start) {
        out.append(builder.substring(start, pos));
    }
}
{code}
that line 
{code:java}
//代码占位符
builder.setLength(0);
{code}
will cause the exception. After delete that line , the testcase will passed.

is that a bug? may be I could contribute to it

  was:
{code:java}
//代码占位符
@Test
public void testPrintWithEscapeReader() throws IOException {
    final StringWriter sw = new StringWriter();
    final CSVFormat format = CSVFormat.DEFAULT.withEscape('!').withQuoteMode(QuoteMode.NONE);
    Reader reader = new FileReader("src/test/resources/testPrintWithReader.txt");
    try (final CSVPrinter printer = new CSVPrinter(sw, format)) {
        printer.print(reader);
        assertEquals("q!,w!,e", sw.toString());
        System.out.println(sw.toString());
    }
}
{code}
and the values in testPrintWithReader.txt is
{code:java}
//代码占位符
q,w,e
{code}
after tracing the code I think the problem cause by here
{code:java}
//代码占位符
private void printWithEscapes(final Reader reader, final Appendable out) throws IOException {
    int start = 0;
    int pos = 0;

    final char delim = getDelimiter();
    final char escape = getEscapeCharacter().charValue();
    final StringBuilder builder = new StringBuilder(IOUtils.DEFAULT_BUFFER_SIZE);

    int c;
    while (-1 != (c = reader.read())) {
        builder.append((char) c);
        if (c == CR || c == LF || c == delim || c == escape) {
            // write out segment up until this char
            if (pos > start) {
                out.append(builder.substring(start, pos));
                builder.setLength(0);
            }
            if (c == LF) {
                c = 'n';
            } else if (c == CR) {
                c = 'r';
            }

            out.append(escape);
            out.append((char) c);

            start = pos + 1; // start on the current char after this one
        }
        pos++;
    }

    // write last segment
    if (pos > start) {
        out.append(builder.substring(start, pos));
    }
}
{code}
that line 
{code:java}
//代码占位符
builder.setLength(0);
{code}
will cause the exception. After delete that line , the testcase will passed.

is that a bug? may be I could contribute to it


> printWithEscapes gets StringIndexOutOfBoundsException when value is Reader
> --------------------------------------------------------------------------
>
>                 Key: CSV-259
>                 URL: https://issues.apache.org/jira/browse/CSV-259
>             Project: Commons CSV
>          Issue Type: Bug
>          Components: Printer
>    Affects Versions: 1.8
>         Environment: windows 10
>            Reporter: Chen
>            Priority: Major
>
> {code:java}
> //代码占位符
> @Test
> public void testPrintWithEscapeReader() throws IOException {
>     final StringWriter sw = new StringWriter();
>     final CSVFormat format = CSVFormat.DEFAULT.withEscape('!').withQuoteMode(QuoteMode.NONE);
>     Reader reader = new FileReader("src/test/resources/testPrintWithReader.txt");
>     try (final CSVPrinter printer = new CSVPrinter(sw, format)) {
>         printer.print(reader);
>         assertEquals("q!,w!,e", sw.toString());
>     }
> }
> {code}
> and the values in testPrintWithReader.txt is
> {code:java}
> //代码占位符
> q,w,e
> {code}
> after tracing the code I think the problem cause by here
> {code:java}
> //代码占位符
> private void printWithEscapes(final Reader reader, final Appendable out) throws IOException {
>     int start = 0;
>     int pos = 0;
>     final char delim = getDelimiter();
>     final char escape = getEscapeCharacter().charValue();
>     final StringBuilder builder = new StringBuilder(IOUtils.DEFAULT_BUFFER_SIZE);
>     int c;
>     while (-1 != (c = reader.read())) {
>         builder.append((char) c);
>         if (c == CR || c == LF || c == delim || c == escape) {
>             // write out segment up until this char
>             if (pos > start) {
>                 out.append(builder.substring(start, pos));
>                 builder.setLength(0);
>             }
>             if (c == LF) {
>                 c = 'n';
>             } else if (c == CR) {
>                 c = 'r';
>             }
>             out.append(escape);
>             out.append((char) c);
>             start = pos + 1; // start on the current char after this one
>         }
>         pos++;
>     }
>     // write last segment
>     if (pos > start) {
>         out.append(builder.substring(start, pos));
>     }
> }
> {code}
> that line 
> {code:java}
> //代码占位符
> builder.setLength(0);
> {code}
> will cause the exception. After delete that line , the testcase will passed.
> is that a bug? may be I could contribute to it



--
This message was sent by Atlassian Jira
(v8.3.4#803005)