从流中读取第一行并将其从流中删除

4
我有两个类必须读取一个InputStream,第一个类只需解释流的第一行,但第一行应从流中删除,以便B类可以解释第一行之后的所有内容。当我将我的InputStream传递给BufferedReader并进行readLine()时,这种方法无法实现。
我知道我可以在流上进行读取,直到遇到\b,但也许有更合适的解决方案来完成这项工作?
// Reads the first line from the stream and everything else
public String retrieveFileNameFromTheFirstLineInInputStream(InputStream in) throws IOException {
    InputStreamReader isReader = new InputStreamReader(in);
    BufferedReader reader = new BufferedReader(isReader);
    return reader.readLine();
}
2个回答

4
我认为即使是InputStreamReader也可以缓冲输入,因此Mike L的答案可能会错过输入。
虽然有些尴尬,但您可以使用Apache commons-io中的ReaderInputStream。所以:
BufferedReader reader = new BufferedReader(
    new InputStreamReader(in));
String firstLine = reader.readLine();
InputStream in2 = new ReaderInputStream(reader);
// continue with in2 ..

4
你无法从InputStream中删除任何内容,只能从其中读取。不要使用BufferedReader读取行,因为它肯定会从InputStreamReader(用于填充其缓冲区)中读取比第一行更多的内容,InputStreamReader本身从InputStream中读取。
我建议使用InputStreamReader进行读取,直到达到行的末尾,然后将InputStream实例传递给应该读取它的代码。
顺便说一下,你总是应该指定InputStreamReader使用的编码,否则系统编码将用于将InputStream中的字节转换为字符,这可能因不同的计算机而异。

我已经编辑了我的问题,我的单元测试中有一个错误,但实际上读取器确实读取了所有内容。使用InputStreamReader而不是InputStream本身的优点是什么? - Stijn Vanpoucke
从我尝试这段代码来看,即使是InputStreamReader也可以缓冲输入,因此在使用InputStreamReader后传递InputStream将会错过第一个InputStreamReader缓冲的内容。 - dfrankow

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