Java 数据流捕获异常
我根据在网上找到的一些数据流示例编写了这个类,每次运行结束时都会得到一个EOFEException。当我查它时,它说出人意料地到达了小溪的尽头。它似乎在控制台上工作(至少它能说出正确的数字顺序)。不过,当我在运行后检查内容时,文本文件只是乱七八糟Java 数据流捕获异常,java,data-stream,Java,Data Stream,我根据在网上找到的一些数据流示例编写了这个类,每次运行结束时都会得到一个EOFEException。当我查它时,它说出人意料地到达了小溪的尽头。它似乎在控制台上工作(至少它能说出正确的数字顺序)。不过,当我在运行后检查内容时,文本文件只是乱七八糟 public class DataStreamExample { public static void main(String args[]) { int choice = 0; int[] numbers =
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);
}
}
}
公共类数据流示例{
公共静态void main(字符串参数[]){
int-choice=0;
int[]数字={25,4,19,70,12,28,39,30};
System.out.println(“该程序将提供一个关于数据流如何工作的示例”);
System.out.println(“注意:数据流仅适用于primative数据类型。”);
System.out.println();
System.out.println();
试一试{
System.out.println(“1.用于写入数据操作”);
System.out.println(“2.用于读取数据操作”);
System.out.println(“输入所选操作的编号:”);
BufferedReader buffRead=新的BufferedReader(新的InputStreamReader(System.in));
choice=Integer.parseInt(buffRead.readLine());
开关(选择){
案例1:
FileOutputStream fileOut=新的FileOutputStream(“Example.txt”);
BufferedOutputStream buffOut=新的BufferedOutputStream(fileOut);
DataOutputStream dOutput=新的DataOutputStream(buffOut);
for(int i=0;i
是否有人有任何建议或意见,可以帮助清理这个文件,这样我就不会在文件中胡言乱语,这样它就不会捕获异常?我应该如何结束操作并关闭流?一些事情:
中断因此,在case语句中,当您尝试写入数据时,整数被写入文件,然后执行第二个case,您尝试从中读取。不确定这是否是你的意图。但您可以添加一个中断
,以防止这种情况发生:
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;
这意味着它将继续尝试读取序列化整数,直到到达文件末尾。当到达文件末尾时,流抛出一个EOFEException`。您可以尝试将循环更改为此,以防止出现异常:
while (dInput.available()>0){
System.out.print(dInput.readInt());
}
break;
DataOutputStream
时,将处理写入流中的对象(或原语),以便数据可移植嗯,不是用
while (true){
System.out.print(dInput.readInt());
}
你应该使用
while(dInput.available()>0){
System.out.print(dInput.readInt());
}
因为当您使用while(true)时,它总是从流中读取,包括流到达EOF(文件末尾)时的数据毕竟,您应该使用close()方法关闭所有流。对于您的输入操作,您将永远读取
,而(true)
,因此完成循环的唯一方法是抛出EOFEException
。如果不希望操作以这种方式完成,则必须在开始之前知道正在读取多少整数(并使用该整数限制循环)
文件看起来像乱七八糟的原因是您正在将值写入二进制文件。如果要读取文件中的int,则必须将它们作为文本写入
另外,你应该把
break代码>每个案例结尾处的语句。InputStream.available()是一种可怕的方法,永远不应该使用。@jtahlborn您能详细解释一下吗?它最多也不可靠。e、 g.我相信GZIPInputStream的available()
方法返回1,直到流关闭,然后返回0。归根结底,使用该方法从来都不是一个好的理由。如果使用available()方法精确计算剩余的字节数,则是正确的。但该方法用于“估计”剩余字节数,而不是准确估计剩余字节数。所以我想我没有理由不使用这个方法不。available()不返回可用字节数或估计值。当仍有千兆字节需要读取时,它可以返回零。这与EOS的条件无关。请参阅Javadoc-1InputStream.available()是一个糟糕的方法,永远不应该使用。@Jon Lin感谢这真的很有帮助。最后,我在循环中放入了一个print语句,以指示写入文件的数字,效果非常好。(也就是说,除了您的建议之外)具体来说,available()>0作为EOS的测试是完全不正确的,正如它在Javadoc中所说的。您是建议在案例开始时进行计数,还是最好在分配数组时将其完全放在输入之前?
while(dInput.available()>0){
System.out.print(dInput.readInt());
}