【问题标题】:java BufferedReader & Writer doesn't work as expectedjava BufferedReader 和 Writer 无法按预期工作
【发布时间】:2023-03-05 23:10:01
【问题描述】:

我试图做的是读取一个 mnist 火车文件,并用 11 位数字表示它的第一个数字,并保持其他相同。

所以 3,1,4,6 ... 到 ,0,0,0,1,0,0,0,0,0,0,1,4,6...(一开始有“”位数所以总共 11 位数)

我认为这是一项容易的工作,但事实并非如此。

import java.io.*;
public class T {
public static void main(String[] args){
    File file = new File("./src/dataset/mnist_train.csv");
    File wfile = new File("./src/dataset/conv_mnist_train2.txt");

    try{
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        BufferedWriter fileWriter = new BufferedWriter(new FileWriter(wfile));
        String line;
        String[] numbers;
        int g = 0, cnt = 0, cnt2 = 0;

        while ((line = bufferedReader.readLine()) != null) {
            cnt2++;
            numbers = line.split(",");
            for(String i : numbers){
                if(g == 0){
                    for(int j=0; j<10; ++j) {
                        if(j == Integer.parseInt(i)) fileWriter.write("," + 1);
                        else{ fileWriter.write("," + 0); cnt++;}
                    }
                    g++;
                }
                else {fileWriter.write("," +i); cnt++;}
            }
            fileWriter.newLine();

            System.out.println(numbers.length + " " + cnt + " " + cnt2);
            g = 0; cnt = 0;
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}
} 

g, cnt, cnt2 是我用来调试的数字,但在这里我没有发现任何问题;它自然地将每行 785 个字母转换为 795 个字母的新行。

import java.io.*;

public class Tes {
public static void main(String[] args){
    File file = new File("./src/dataset/conv_mnist_train2.txt");

    try{
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        String line;
        int g = 0;

        while ((line = bufferedReader.readLine()) != null) {
            g++;
            String[] N = line.split(",");
            if(N.length != 795){
                System.out.println(N.length + " " + g);
                for(String i : N) System.out.print(i + " ");
                System.out.println();
            }
        }
    }catch(Exception e){
        e.printStackTrace();
    }

}
}

但是发生的情况是,当我运行不应该打印任何内容的第二个代码时,打印结果并说我的第 59994 行数据仅包含 311 个字母。但是从我的第一个代码中,我确认我的第 59994 行有 795 个字母。我不知道这里发生了什么。

我也尝试使用 FileWriter 和 FileReader 而不是 BufferedWriter & Reader,但它没有解决问题。谁能告诉我发生了什么,以及如何解决这个问题?

【问题讨论】:

  • 你永远不会关闭你的读者和作者。学习使用 try-with-resources 语句:docs.oracle.com/javase/tutorial/essential/exceptions/…
  • 谢谢。我不知道不关闭读者/作者可能会导致这样的严重后果。
  • 缓冲写入器,顾名思义,将你写入它的内容缓冲到内存中。当缓冲区已满或关闭(或刷新)它时,它会写入文件。如果你从不关闭,你会错过文件的某些部分。无论如何,资源必须始终关闭,因为它们是稀缺的。如果您忘记关闭数百个文件资源,您的操作系统将没有足够的文件描述符可用。

标签: java file-io bufferedreader bufferedwriter


【解决方案1】:

问题是我没有关闭读取器/写入器。不知道最终会出现严重错误。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2016-09-30
    • 1970-01-01
    • 2022-10-21
    • 2018-04-20
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多