【发布时间】: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