文件输入输出处理(二)-字节流

博客 分享
0 142
张三
张三 2022-06-19 11:00:43
悬赏:0 积分 收藏

文件输入输出处理(二)-字节流

大佬的理解->《Java IO(三) -- 字节流》 

1、FileInputStream

1.1 初始化

FileInputStream(String name)
FileInputStream(File file)
//直接通过文件地址初始化FileInputStream fis = new ileInputStream("D:/test/test1.txt");//通过File对象初始化File file = new File("D:/test/test1.txt");FileInputStream fis = new FileInputStream(file)

1.2 获取文件大小

available()

FileInputStream fis = new ileInputStream("D:/test/test1.txt");fis.available(); //文件大小

1.3 读取文件内容

read()读取一个字节(返回对应字节的ascii码值)
read(byte b[])根据字节缓冲数组的长度,进行读取(返回读取的字节数)

read()

//文件 D:/test/test1.txt 内容KH96abcdefghijk
FileInputStream fis = new ileInputStream("D:/test/test1.txt"); while (true){     //read() 方法:从输入流对象中,一次读取一个字节(返回的是对应字节的ascii码值,int类型)     int hasRead = fis.read();     //当读取到末尾,返回-1,代表文件读取结束     if(hasRead == -1){         break;     }     System.out.print((char) hasRead);      //打印文件中字符的ascii值     //转化为字符:KH96abcdefghijk } //最后一定要关闭资源 fis.close();

运行结果:

源文件的大小:15KH96abcdefghijk

read(byte b[])

带缓冲字节数,读取文件内容,一次读取就不是一个字节,而是根据字节缓冲数组的长度,进行读取

错误案例

读取时通过read()来判断是否继续循环,读取到错误值

FileInputStream fis = new ileInputStream("D:/test/test1.txt");//带缓冲字节数,根据字节缓冲数组的长度,进行读取byte[] bytes = new byte[5];//容易出错的判断方式:read()方式执行一次,就读取一个字节(没有保存,读完就扔,字节丢失),不可以作为判断条件while(fis.read() != -1){    //循环读取内容    //带缓冲数组的读取,方法返回的是读取的字节数,不是读取的内容    //每次读取的数据,是由缓冲字节数组长度决定,每次都是从上一次读取的位置后开始继续读取,每次都是将读取的内容依次放入缓存数组    int hasRead = fis.read(bytes);    System.out.println("读取的字节数:"+hasRead);    System.out.println(new String(bytes));    System.out.println("读取文件成功");}fis.close();

运行结果:

源文件的大小:15读取的字节数:5H96ab       //K丢失读取文件成功读取的字节数:5defgh        //c丢失读取文件成功读取的字节数:2jkfgh        //i丢失,并且还多出了上一次留下 dgh,这是因为没有读满缓冲字节数组,而造成的读取上一次的值读取文件成功

正确案例

因为带字节缓冲数组返回的时读取到的长度,所以,用读取到的长度来判断是否要继续读取,和要写入多少个字节

FileInputStream fis = new ileInputStream("D:/test/test1.txt");//带缓冲字节数,根据字节缓冲数组的长度,进行读取byte[] bytes = new byte[5];//正确写法int hasRead = 0;while((hasRead = fis.read(bytes)) > 0){    //每次读取的内容    System.out.println(new String(bytes,0,hasRead));}fis.close();

运行结果:

源文件的大小:15KH96abcdefghijk// 没有丢失字节

1.4 资源关闭

close();

? 在使用流资源的时候一定要关闭资源,否则会造成资源浪费;

放在try( ) 里面

? JDK1.7以后,只需将资源初始化放在try()里面就可以不用手动关闭流资源;

2、FileOutputStream

2.1初始化

FileOutputStream(File file)
FileOutputStream(File file, boolean append)
FileOutputStream(String name)
FileOutputStream(String name, boolean append)

与FileInputStream类似,不过写入的文件不一定要存在,如果文件不存在,会自动创建一个空的文件;

2.2 写入方式 boolean append

boolean append 使用否以追加方式方式写入;

false(默认值,覆盖)true(追加)

2.3 写入文件内容

write(byte b[])
write(byte b[], int off, int len)
String string = "KH96班,正在学习文件输出流,输出文件2";//File file = new File("D:/test/test2.txt");//JDK1.7以后,只需将资源初始化放在try()里面就可以不用手动关闭流资源,推荐使用;try(FileOutputStream fos =  new FileOutputStream("D:/test/test2.txt",true)){    //将字符串转成字节数组,写入目标文件    fos.write(string.getBytes());    //手动刷新缓冲区    fos.flush();    }catch (IOException e){    e.printStackTrace();}
posted @ 2022-06-19 10:17 化羽羽 阅读(13) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员