Java IO及BufferedReader.readline()出现的Bug
程序员文章站
2022-06-24 12:30:47
目录java io及bufferedreader.readline()的bugio流bufferedreader.readline()方法bug源码使用bufferreader类的readline()...
java io及bufferedreader.readline()的bug
io流
流:流是一组有序的,有起点和终点的字节集合,是对计算机中数据传输的总称。即数据在两个设备间的传输称为流,流的本质是数据传输。
bufferedreader.readline()方法bug
错误代码:
file testtxt = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/test.txt"); file file_copy3 = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/test_copy3.txt"); bufferedreader bufferedreader = new bufferedreader(new filereader(testtxt)); bufferedwriter bufferedwriter = new bufferedwriter(new filewriter(file_copy3)); //readline() 每次读取一行 while (bufferedreader.readline() != null){ system.out.println(bufferedreader.readline()); bufferedwriter.write(bufferedreader.readline()); } bufferedwriter.close(); bufferedreader.close();
原文件:
结果:
结果控制台只打印了第二行,最后还报错了空指针异常
原因:
是代码中每次调用readline()方法,就会向下读取一行所以错误代码中表示的是while 判断 的第一行不为null,打印的是第二行 ,然后写入的是第三行,在次while判断的是第四行 有内容,打印的是第五行 为null,写入的是第六行也为null,就导致了空指针异常。
修改后的代码:
string line; while ((line = bufferedreader.readline()) != null){ system.out.println(line); bufferedwriter.write(line); }
结果:
注意:只用readline()复制后的但是和原文件是不同,没有了换行符,如果需要可以在while循环体内加上/r/n
源码
package com.lsh.io; import java.io.*; import java.time.duration; import java.time.instant; /** * @author :liushihao * @date :created in 2021/3/3 11:09 上午 * @desc : 只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。 * */ public class fileio { public static file testtxt = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/test.txt"); public static file catimg = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/cat.jpg"); public static void main(string[] args) throws exception { instant now = instant.now(); system.out.println("开始复制:"+now); // copyfile(); // copybyreaderandwriter1(); copybyreaderandwriter2(); instant end = instant.now(); // duration 期间instant period 时期 localdatetime system.out.println("复制完成:"+end+",耗时:"+ duration.between(now,end)); } /** * 使用fileinputstream、fileoutputstream 与原文件一样 * 将一个文件复制一份 */ public static void copyfile() throws exception { // file file = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/test.txt"); file file_copy1 = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/test_copy.txt"); // file file_copy1 = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/cat_copy.jpg"); fileinputstream fis = new fileinputstream(testtxt); fileoutputstream fos = new fileoutputstream(file_copy1); //byte[] bytes = new byte[1024]; byte[] bytes = new byte[fis.available()]; int read = fis.read(bytes); if (read != -1){ fos.write(bytes); } fis.close(); fos.close(); } /** * 字符流 * 使用fileinputstream、fileoutputstream、inputstreamreader、outputstreamwriter、bufferedreader、bufferedwriter 复制文件 * * readline() 不用while的判断只会输出一行。 */ public static void copybyreaderandwriter1() throws exception { // file testtxt = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/test.txt"); file file_copy2 = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/test_copy2.txt"); fileinputstream fis = new fileinputstream(testtxt); fileoutputstream fos = new fileoutputstream(file_copy2); bufferedreader bufferedreader = new bufferedreader(new inputstreamreader(fis)); bufferedwriter bufferedwriter = new bufferedwriter(new outputstreamwriter(fos)); string line; while ((line = bufferedreader.readline()) != null){ system.out.println(line); bufferedwriter.write(line); } // 注意: fis、fos要在bufferedwriter、bufferedreader关闭之后,否则会报错! bufferedwriter.close(); bufferedreader.close(); fis.close(); fos.close(); } /** * 字符流 * 使用bufferedreader、bufferedwriter、filereader、filewriter复制文件 * @throws exception */ public static void copybyreaderandwriter2() throws exception{ file file_copy3 = new file("/users/liushihao/ideaprojects/netty_demo/src/main/resources/test_copy3.txt"); bufferedreader bufferedreader = new bufferedreader(new filereader(testtxt)); bufferedwriter bufferedwriter = new bufferedwriter(new filewriter(file_copy3)); //readline() 每次读取一行 string line; while ((line = bufferedreader.readline()) != null){ system.out.println(line); bufferedwriter.write(line); } bufferedwriter.close(); bufferedreader.close(); } }
使用bufferreader类的readline()方法注意问题
一、bufferreader类的readline()方法
public string readline()
:直到程序遇到了换行符或者是对应流的结束符,该方法才会认为读到了一行,才会结束其阻塞,让程序继续往下执行。
注意:读取到没有数据时就返回null(因为其它read()方法当读到没有数据时返回-1),而实际上readline()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null。
读取一个文本行,通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
返回:到达流末尾,就返回null。
注意:当循环读取文件内容时,循环条件的结束要注意使用正确。
错误的使用方式:
string valuestring = null; while (bf.readline()!=null){ //这样会造成数据丢失,因为在这里已经调用了readline()方法,已经读取了一行,下次调用时,就会丢失一行。 system.out.println(valuestring); }
正确的解决方法:用一个变量来接收方法的返回值
string valuestring = null; while ((valuestring=bf.readline())!=null){ //通过变量来接收数据,避免数据丢失 system.out.println(valuestring); }
二、datainputstream类的readutf()方法
readutf读取的必须是writeutf()写下的字符串。即dataoutputstream的 writeutf(string str)方法配套使用
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
JAVA-学生管理系统(最简单的SWING+IO读写文件持久化数据)详细代码及步骤
-
Java IO —— 实现文件夹及里面全部内容的复制转移
-
java实现统计字符串中大写字母,小写字母及数字出现次数的方法示例
-
【Bug流水账】安装Gulp中出现Gulp-cli安装失败的问题及解决方法
-
Java IO及BufferedReader.readline()出现的Bug
-
JAVA-学生管理系统(最简单的SWING+IO读写文件持久化数据)详细代码及步骤
-
Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)
-
分享java中出现的一个问题及解决案例
-
java7中出现的Fork/Join介绍及用法
-
总结Java中常见的异常,出现异常的原因及各种解决方法