java - 读取 InputStream 两次会抛出 IOException

标签 java

我遇到了一个问题,有人可以告诉我如何解决这个问题吗?它抛出“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/

相关文章:

java - 如何在 JUnit 中创建 javax.ws.rs.core.Response?

java - 在Java中实现BFS以找到从数字X到数字Z的最快方法

java - 如何在Java中将字符串转换为字符来填充数组?

java - 将从 C 接收到的字符串转换为 Java 字符串

java - 大表映射到另一个表

java - 如何在 64 位 JRE MOC XOS 中运行 32 位 JAVA Applet

java - 合并 2 个 Spring Data JPA 存储库类的最佳架构选择

applet - Java 7 update25 小程序不适用于 IE10

java - 一种存储用户访问权限的方法

java - 使用 Java 处理来自 postgreSQL 的大量数据