我遇到了一个问题,有人可以告诉我如何解决这个问题吗?它抛出“java.io.IOException:流已关闭”。我知道我的错误在哪里,但我不知道如何解决。 BufferedReader 从第一个函数关闭,我不知道如何在第二个函数中重置它。函数应使用制表符将文本从一个文本文件格式化为另一个文本文件。谢谢您
import java.io.*;
public class TestClass {
private void prosekStudentKRS(FileReader fr) throws IOException{
BufferedReader reader = null;
int j = 0, vksum = 0;
try{
reader = new BufferedReader(fr);
reader.readLine();
String line;
while((line = reader.readLine()) != null) {
int sum = 0;
j++;
String[] niza = line.split(",");
for(int i = 1; i < niza.length; i ++) {
sum+=Integer.parseInt(niza[i]);
}
vksum += Integer.parseInt(niza[1]);
System.out.printf("Student %d ima prosek %.2f\n", j, (float) sum / 3);
}
System.out.println("Prosek po KRS: " + vksum / (double) j);
} catch (Exception e){
e.printStackTrace();
} finally {
if(reader != null) {
reader.close();
}
}
}
private void TSV(FileReader fr, FileWriter fw) throws IOException {
BufferedReader reader = null;
BufferedWriter writer = null;
StringBuilder sb = null;
try {
reader = new BufferedReader(fr);
writer = new BufferedWriter(fw);
String line;
while ((line = reader.readLine()) != null) {
String[] niza = line.split(",");
sb = new StringBuilder();
for(int i = 0; i < niza.length; i ++) {
sb.append(niza[i] + "\t");
}
writer.write(sb.toString());
writer.newLine();
writer.flush();
}
} finally {
if (reader != null)
reader.close();
if(writer != null) {
writer.flush();
writer.close();
}
}
}
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("C:\\Users\\pc\\IdeaProjects\\LabOS01\\rezultaticsv.txt");
FileWriter fw = new FileWriter("C:\\Users\\pc\\IdeaProjects\\LabOS01\\rezultatitsv.txt");
TestClass filetest = new TestClass();
filetest.prosekStudentKRS(fr);
filetest.TSV(fr, fw);
}
}
最佳答案
要么创建两个不同的 FileReader
对象并向每个方法传递不同的值。
否则您也可以创建 BufferedReader
来自FileReader
在调用方法之前,将其传递给第一个方法,使用 reset()
重置它方法并将其传递给另一个方法。
如果文件不太大,您可以存储在 List<String>
中。每行读取而不是再次读取文件。
这样会更有效率。
关于java - 读取 InputStream 两次会抛出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49070652/