Java BufferWriter写文件写不进去或缺失数据的解决

网友投稿 268 2022-12-26

Java BufferWriter写文件写不进去或缺失数据的解决

java BufferWriter写文件之后文件是空的或者数据不全

在编程的过程中,读写文件是非常常见的操作,在这里我问介绍一下最近我遇到的集中写文件写不进去的情况。首先给出完整的代码。

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException {

String filename = "src/data/write.txt";

BufferedWriter bw = new BufferedWriter(new FileWriter(filename));

for (int i = 1; i <= 10; i++) {

bw.write(i + " ");

}

bw.close();

}

}

这个代码是正常的文件写入过程的实现,首先定义BufferedWriter对象指向对应的文件,之后执行写操作,完成之后关闭bw.close();

问题1:在编码的过程中,忘记bw.close(),那么会出现数据写入不全或者为空的问题

这是很常见的错误,这是因为BufferedWriter是采用缓冲区的方式写入,即写入的数据先放到缓冲区,之后等缓冲区满之后一起写到文件中。close()的目的便是强制将缓冲区中的数据写入到文件中,即使缓冲区中的数据还不满。

问题2:即写入文件的格式问题可能导致文件为空

这里我遇到的情况是,打算写几千个数据到txt文本中,放置在一行,之间用空格隔开,会出现空文件,这是因为几千个数据是不能放置在一行中,因为txt等文件格式对文件的行数没有什么要求,但是对列数做出了要求,即一行中的数据不能超过最大值,但是可以写足够多的行。

下面用一个例子说明情况:

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException {

String filename = "src/data/write.txt";

BufferedWriter bw = new BufferedWriter(new FileWriter(filename));

for (int i = 1; i <= 3000; i++) {

bw.write(i + " ");

}

bw.close();

}

}

还是刚才的代码,但是需要的数据是3000个,且写在同一行中,会发现空文件。

而将bw.write(i + " ");换成bw.write(i + "\n");会发现文件成功写入。

BufferedWriter写入文件注意事项

对于文本文件,使用BufferedReader,BufferedWriter进行读写效率更高,原因是使用了缓存区,其工作流程是:先把文本内容读写到缓存区,缓存区满了,自动把缓存区中的内容读写到文件.

问题:

如果读写完的同时缓冲区刚好装满,那么缓冲区会把里面的数据朝目标文件自动进行读或写,这种时候你直接调用close()方法关闭流是不会出现问题 , 但是如果文件在读写完成时,缓冲区没有装满,就直接调用close()方法,这个时候装在缓冲区的数据就不会自动的朝目标文件进行读或写,造成缓冲区中的这部分数据丢失.

解决方法:

在close()之前先调用flush()方法, 手动使缓冲区数据读写到目标文件

eg:

@Test

public void test5(){

BufferedWriter bufferedWriter = null;

BufferedReader bufferedReader = null;

try {

bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("G://reader.txt"),"GBK"));

//写入流,设置缓存区大小为1024K

bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("G://writer.txt"),"UTF-8"),1024);

String line;

while ((line = bufferedReader.readLine()) != null) {

bufferedWriter.write(line);

bufferedWriter.newLine();

}

}catch (Exception e){

log.error("异常:{}",e);

}finally {

if (bufferedWriter != null) {

try {

//刷新缓存区

bufferedWriter.flush();

bufferedWriter.close();

} catch (IOException e) {

log.error("关闭输出流异常:{}", e);

}

}

if (bufferedReader != null) {

try {

bufferedReader.close();

}http:// catch (IOException e) {

log.error("关闭读取流异常:{}", e);

}

}

}

log.info("安全结束");

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用maven实现redis与idea的连接问题
下一篇:使用BufferedReader读取本地文件的操作
相关文章

 发表评论

暂时没有评论,来抢沙发吧~