2011-12-13 90 views
2

Java是否有一个简单的方法来从InputStream中读取一行而不进行缓冲? BufferedReader不适合我的需求,因为我需要通过相同的连接重复传输文本和二进制数据,并且缓冲仅仅是阻碍。从InputStream读取没有缓冲的行

+0

通过二进制数据,你不必行,对吗?如何识别您的数据是文本还是二进制? – belgther

+1

我确实拥有它们。请求以描述它的文本行开始,有时后跟二进制数据。 – Ree

+0

可能的重复:http://stackoverflow.com/questions/25215564/how-to-read-a-line-from-inputstream-without-buffering-the-input –

回答

0

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

然而,这可以缓冲输入,如果没有换行符存在:

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

+0

扫描仪缓冲输入甚至超过换行符:( –

+0

'Scanner'确实缓冲区超过换行符,我有一个'StringR eader'有七条线和'Scanner'将它们全部缓冲在一起。 –

-1

用BufferedReader读取InputStream并将读取的行添加到String中可能会更好。

然后,您可以根据需要操作字符串,而无需担心缓冲。

+1

问题是我无法控制BufferedReader如何读取输入。它可能会读取一行和一大块数据。我不想那样。 – Ree

+0

@Ree,我认为Scanner只向后缓冲,不向前。 – Tudor

4

最终它是直接从InputStream中直接读取byte后的字节,而没有包装InputStream。一切我想,像扫描仪和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; 
}