这次的Bug真的让我头大,话不多说,先上让我遇到问题的题目:
(Data 流)利用Data 流,完成下面操作:
1)判断当前目录下是否存在一个“test.dat”的文件,如果该文件不存在,则往该文件
中写入一个long 类型的数值:10000L
2)如果该文件存在,则从该文件中读出数值,并把该数值加1 之后,再存回文件中。
本来我是刚学习完IO流不过关于Data流还不了解,不过我自己也事先看一了遍api文档,感觉和其他的流在使用上也没啥区别,而且他还有readLong()和WriteLong()方法,所以也没多想,直接就开始撸,撸完的代码:
package chp13;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Test10 {
public static void main(String[] args) throws IOException {
String dest = "e:" + File.separator + "a" + File.separator + "test.dat";
File file = new File(dest);
InputStream in;
DataInputStream dis;
OutputStream out;
DataOutputStream dos;
if (!file.exists()) {
out = new FileOutputStream(file);
dos = new DataOutputStream(out);
dos.writeLong(10000);
dos.close();
} else {
out = new FileOutputStream(file);
dos = new DataOutputStream(out);
in = new FileInputStream(file);
dis = new DataInputStream(in);
Long l = dis.readLong();
dos.writeLong(l + 1);
System.out.println(l + 1);
dis.close();
dos.close();
}
}
}
第一次运行,什么问题都没有,检查硬盘也确实出现了该文件,然后在我执行第二遍,对文件夹的数据进行加一的时候出现了问题了,也就是说我的else语句块有问题,并且是那句读取操作有问题。
Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readLong(DataInputStream.java:416)
at chp13.Test10.main(Test10.java:32)
这是控制台报的异常。然后我查看API文档,发现报异常是因为文件没有读取到八个字节,而且我打开我的文件发现文件里面啥都没有了。然后通过查询其他资料以及DEBUG发现我的出错原因是输出流与输入流的定义的问题,不是语法的问题而是定义顺序的问题,我是先定义的输出流,虽然我没有对文件进行输出操作,也没有在构造输出流时加true让它在写操作时在文件末尾追加。
然后我把代码简化,想找出问题的根本。
public class Test {
public static void main(String[] args) throws IOException {
String dest = "e:" + File.separator + "a" + File.separator + "test.dat";
OutputStream os = new FileOutputStream(dest, true);
InputStream is = new FileInputStream(dest);
int num = 0;
byte[] b = new byte[1024];
while ((num = is.read(b)) != -1) {
os.write(b, 0, num);
System.out.println(new String(b));
}
is.close();
os.close();
System.out.println("操作完成");
}
}
这里我是不会有任何异常的,但是应该是读一下然后写进去,文件内容应该不会有任何变化才是,**可是!**我打开文件又是被清空了!跟尼玛见鬼了一样。
然后我再进一步简化代码!
public class Test {
public static void main(String[] args) throws IOException {
String dest = "e:" + File.separator + "a" + File.separator + "test.dat";
OutputStream os = new FileOutputStream(dest, true);
os.close();
System.out.println("操作完成");
}
}
我就只定义了一遍输出流,然后关了,结果真的我的文件就还是会被清空,然后得到模糊的概念,对文件进行输出流定义,不加第二个参数,会默认从文件首进行写入,可是我明明没有进行写入操作啊…
好像只要定义不管你写不写都会先清空文件…
具体原因还没找到,要是有大神看见了,并且知道原因,可以私聊我一下,感激不尽!!!!!
记住了!对文件的操作一定要先读后写!!!(就算你没进行写入操作,也不要先定义!)
然后文件有内容构建输出流时一定要加第二个参数true,不然文件会丢失!