缓冲读取器未返回



>我正在使用Java运行程序并将程序的文本输出读取到缓冲阅读器中。然后我想通过这样做打印出结果:

while((line=input.readLine()) != null){
System.out.println(line);
}

出于某种原因,当这样做时,readLine(( 方法在文本进行到一半时根本不返回,并且程序无限期地等待。然而,当直接从命令行运行此程序时,它的输出完全符合预期,只有 100 行左右的简单文本。什么可能导致 readLine(( 在阅读简单文本时不返回?

如果尚未向流写入任何内容,则可能会发生这种情况。 您可能经常遇到 readLine(( 挂起的情况是当您调用一个应该将错误写入 stderr 的进程时。该过程完成后,您可以尝试通过以下方式读取所有错误:

BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stderr));
while ((line = brCleanUp.readLine()) != null) {
//process the error line
}
brCleanUp.close();

但是,如果什么都没有写入 stderr,上面的 readLine(( 将如您所描述的那样挂起。

避免它的方法是检查是否有任何读取流的意义(我不知道这是否是一个错误,但这对我有用:(

boolean available = stderr.available() >= 1;
if (available) {
BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stderr));
for( ; available && (line = brCleanUp.readLine()) != null; 
available = stderr.available() >= 1) {
System.out.println ("[Stderr] " + line);
}
brCleanUp.close();
}

您需要像这样将文本文档编码为UTF-8,然后使用Scanner

// specify file path
String filePath = "C:/path/path/file-location/file.txt";
// make a scanner with the UTF-8 param
Scanner scanner = new Scanner(new File(filePath),"UTF-8");
// loop through text 
while (scanner.hasNextLine()){
System.out.println(scanner.nextLine());
}

实际上有几种方法可以像这样对文本进行编码,但重要性在于文本编码本身。一旦文档格式正确,您选择读取输入的对象和类将由您自行决定。

什么会导致 readLine(( 在阅读简单文本时中途不返回?

如果您正在读取文件系统中的文件,这可能是由于文件系统的问题;例如,远程文件服务器没有响应。

如果您从套接字读取,则远程服务器(尚未(写入/刷新您尝试读取的数据,或者网络问题阻止数据通过。

如果您正在从管道读取(例如另一个程序的输出(,则另一个程序尚未写入/刷新您尝试读取的数据。

(另一种情况是从"设备文件"或"/proc"文件系统中的文件或环回文件系统中读取。 在这些情况下,可能的原因很难枚举。

最新更新