【java】记一次io输出流的DEBUG

在尝试使用Java Data流处理文件时,遇到一个bug:第二次运行程序时,文件被清空。问题在于先定义了输出流,即使未执行写操作,也会清空文件。通过DEBUG发现,输出流的定义顺序导致文件内容丢失,即使不指定追加模式(true)。解决方案是先读取文件再进行写操作,并在创建输出流时指定追加模式为true,避免文件内容被清除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次的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,不然文件会丢失!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值