我根据我在网上为Data Streams找到的一些例子编写了这个类,并且我在每次运行结束时都收到了EOFException。当我查看它时,它说意外地达到了流的结束。它似乎在控制台上工作(至少它会喷出正确的数字序列)。当我在运行后检查内容时,文本文件只是乱码。
public class DataStreamExample {
public static void main(String args[]) {
int choice = 0;
int[] numbers = { 25, 4, 19, 70, 12, 28, 39, 30 };
System.out.println("This program will provide an example on how the Data Stream works.");
System.out.println("Note: Data Streams only work with primative data types.");
System.out.println();
System.out.println();
try {
System.out.println("1. For write Data operation");
System.out.println("2. For read Data operation");
System.out.println("Enter the number for the operation of your choice: ");
BufferedReader buffRead = new BufferedReader(new InputStreamReader(System.in));
choice = Integer.parseInt(buffRead.readLine());
switch(choice){
case 1:
FileOutputStream fileOut = new FileOutputStream("Example.txt");
BufferedOutputStream buffOut = new BufferedOutputStream(fileOut);
DataOutputStream dOutput =new DataOutputStream (buffOut);
for (int i = 0; i < numbers.length; i ++) {
dOutput.writeInt(numbers[i]);
}
System.out.print("writing data ");
dOutput.close();
case 2:
FileInputStream fileIn = new FileInputStream("Example.txt");
BufferedInputStream buffIn = new BufferedInputStream(fileIn);
DataInputStream dInput = new DataInputStream (buffIn);
while (true){
System.out.print(dInput.readInt());
}
default:
System.out.println("Invalid choice");
}
}
catch (Exception e) {
System.err.println("Error in read/write data to a file: " + e);
}
}
}
有没有人有任何建议或意见可以帮助清理这个,所以我不会在文件中得到胡言乱语,所以它没有捕获异常?我该如何结束操作并关闭流?
答案 0 :(得分:1)
对于您的输入操作,您将永远阅读while(true)
,因此循环完成的唯一方法是抛出EOFException
。如果你不希望操作以这种方式完成,你必须知道在开始之前你正在阅读多少个整数(并使用它来限制循环)。
文件看起来像乱码的原因是因为您将值写为二进制文件。如果你想读取文件中的int,你必须把它们写成文本。
另外,你应该在每个案例的末尾加上break;
个陈述。
答案 1 :(得分:0)
有些事情:
当您输入 1 到“写入数据操作”时,您的案例陈述中没有break;
,因此当您尝试写入数据时,整数被写入文件,然后第二个案例被执行,你尝试从中读取。不确定这是不是你的意图。但是您可以添加break
来防止这种情况发生:
case 1:
FileOutputStream fileOut = new FileOutputStream("Example.txt");
BufferedOutputStream buffOut = new BufferedOutputStream(fileOut);
DataOutputStream dOutput =new DataOutputStream (buffOut);
for (int i = 0; i < numbers.length; i ++) {
dOutput.writeInt(numbers[i]);
}
System.out.print("writing data ");
dOutput.close();
break;
当您尝试从数据文件中读取时,无限循环:
while (true){
System.out.print(dInput.readInt());
}
这意味着它将继续尝试读取序列化的整数,直到文件结束。当达到文件末尾时,流会抛出EOFException。您可以尝试将循环更改为此以防止异常:
while (dInput.available()>0){
System.out.print(dInput.readInt());
}
break;
当你打印整数时,它们会变得混乱。
文本文件是乱码,因为它不是文本。当您使用DataOutputStream
时,您在流中写入的对象(或基元)将被处理,以便数据可移植。
答案 2 :(得分:0)
好吧,而不是使用
while (true){
System.out.print(dInput.readInt());
}
你应该使用
while(dInput.available()>0){
System.out.print(dInput.readInt());
}
因为当你使用while(true)时,它总是从Stream读取,包括当流到达EOF(文件结束)
时
毕竟,您应该使用close()方法