如何在不缓冲输入的情况下从InputStream读取一行?

5

我有一个包含字符串和二进制数据的InputStream。

如果我使用new BufferedReader(new InputStreamReader(inputStream))读取行,那么二进制数据也会被读取并且无法重新读取。

如何在不读取二进制数据的情况下读取一行?

4个回答

4
* 更新:似乎InputStreamReader也会缓冲(预读):(请参见另一个回答以直接从InputStream中读取。)
最终还是手动完成了 :(
我想我错过了很多类似\r和空格的情况。
public static String readLine(InputStream inputStream) throws IOException {
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
    StringBuilder stringBuilder = new StringBuilder();
    int c;
    for (c = reader.read(); c != '\n' && c != -1 ; c = reader.read()) {
        stringBuilder.append((char)c);
    }
    if (c == -1 && stringBuilder.length() == 0) return null; // End of stream and nothing to return
    return stringBuilder.toString();
}

2
除非 StringBuffer 为空,否则不应返回 null。否则,您应该将 StringBuffer 的内容作为部分最终行返回。 - user207421
@EJP,糟糕。感谢您的审查。已经更正。 - AlikElzin-kilaka
似乎InputStreamReader也会缓冲(预读):( 发布另一个答案以直接从InputStream中读取... - AlikElzin-kilaka

1
最终我手动直接从InputStream逐字节读取,而不是包装InputStream。我尝试过的所有方法,如Scanner和InputStreamReader,都会预读(缓冲)输入 :( 我想我错过了一些情况,比如\r。
public static String readLine(InputStream inputStream) throws IOException {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    int c;
    for (c = inputStream.read(); c != '\n' && c != -1 ; c = inputStream.read()) {
        byteArrayOutputStream.write(c);
    }
    if (c == -1 && byteArrayOutputStream.size() == 0) {
        return null;
    }
    String line = byteArrayOutputStream.toString("UTF-8");
    return line;
}

这是 https://dev59.com/3F7Va4cB1Zd3GeqPHz2j#25341618 的副本。 - AlikElzin-kilaka

-1

1
未正确处理文本数据。 - Stephen C
@StephenC,没错。这就是为什么readLine方法被弃用的原因。 - AlikElzin-kilaka

-2
你可以尝试使用Scanner类.... (java.util.Scanner;)
Scanner in = new Scanner(System.in);
String Str = in.nextLine();

1
试过了。扫描器也会缓冲输入 :( - AlikElzin-kilaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接