从方法返回时 BufferedReader 关闭
BufferedReader is closed when returned from method
我正在编写代码来读取文件并对其进行处理,并且我正在将逻辑拆分为许多小方法。所以我有一个方法来读取文件和 return BufferedReader 以及另一个用 returned BufferedReader 对象做逻辑的方法。但是当我尝试在第二种方法中从 BufferedReader 对象读取行时,它给了我 [java.io.IOException: Stream Closed].
我读取文件的方法和returnBufferedReader
private static BufferedReader readFile(String file) {
try (FileInputStream fileInputStream = new FileInputStream(file)) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
System.out.println(bufferedReader.readLine()); // this line is working successfully
return bufferedReader;
} catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
知道为什么会发生这种情况以及如何解决吗?
您正在使用 try-with-resources:
try (FileInputStream fileInputStream = new FileInputStream(file)) {
此行正在创建一个 FileInputStream
,它可以在您的 try
块中使用。一旦您离开 try
块,就会在流中调用 close()
方法。因此,如果您 return 流或其 BufferedReader
,则流将已经关闭。你不应该使用 try-with-resources 甚至更好,return 无论你需要从流而不是流本身。
很明显,这里的问题出在try-with-resources和AutoCloseable接口的使用上。但是,我想指出您读取文件的方式是“老式”方式。我们现在有了文件、路径和流 类 以方便读取文件。这使用 java NIO,returns 一个 Stream 并且整体上更好:
Files.lines(Paths.get(pathToFile))
此外,这里不需要关闭任何内容
我正在编写代码来读取文件并对其进行处理,并且我正在将逻辑拆分为许多小方法。所以我有一个方法来读取文件和 return BufferedReader 以及另一个用 returned BufferedReader 对象做逻辑的方法。但是当我尝试在第二种方法中从 BufferedReader 对象读取行时,它给了我 [java.io.IOException: Stream Closed].
我读取文件的方法和returnBufferedReader
private static BufferedReader readFile(String file) {
try (FileInputStream fileInputStream = new FileInputStream(file)) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
System.out.println(bufferedReader.readLine()); // this line is working successfully
return bufferedReader;
} catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
知道为什么会发生这种情况以及如何解决吗?
您正在使用 try-with-resources:
try (FileInputStream fileInputStream = new FileInputStream(file)) {
此行正在创建一个 FileInputStream
,它可以在您的 try
块中使用。一旦您离开 try
块,就会在流中调用 close()
方法。因此,如果您 return 流或其 BufferedReader
,则流将已经关闭。你不应该使用 try-with-resources 甚至更好,return 无论你需要从流而不是流本身。
很明显,这里的问题出在try-with-resources和AutoCloseable接口的使用上。但是,我想指出您读取文件的方式是“老式”方式。我们现在有了文件、路径和流 类 以方便读取文件。这使用 java NIO,returns 一个 Stream 并且整体上更好:
Files.lines(Paths.get(pathToFile))
此外,这里不需要关闭任何内容