【问题标题】:Reading lines from an InputStream without buffering从 InputStream 读取行而不缓冲
【发布时间】:2011-12-13 11:30:13
【问题描述】:

Java 有没有一种简单的方法来从 InputStream 中读取一行而无需缓冲? BufferedReader 不适合我的需要,因为我需要通过同一个连接反复传输文本和二进制数据,而缓冲只是妨碍了。

【问题讨论】:

  • 通过二进制数据,你没有行,对吧?如何识别您的数据是文本还是二进制?
  • 我有。请求以描述它的文本行开头,有时后面是二进制数据。

标签: java inputstream


【解决方案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;
}

【讨论】:

    【解决方案2】:

    你可以试试 Scanner 类:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

    但是,如果没有换行符,这可能缓冲输入:

    由于此方法继续在输入中搜索查找行 分隔符,如果没有,它可能会缓冲所有搜索要跳过的行的输入 存在行分隔符。

    【讨论】:

    • 扫描仪缓冲输入甚至超过换行符:(
    • Scanner 确实缓冲了换行符。我有一个 StringReader 有七行,Scanner 一次性缓冲它们。
    【解决方案3】:

    最好使用 BufferedReader 读取 InputStream 并将读取的行附加到字符串。

    然后您可以随意操作字符串,而不必担心缓冲。

    【讨论】:

    • 问题是我无法控制 BufferedReader 如何读取输入。它可能会读取一行和一大块数据 PAST 它。我不想那样。
    • @Ree,我认为 Scanner 只向后缓冲,而不是向前缓冲。
    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多