• java中的IO流(字节流)


    前言必读

    读者手册(必读)_云边的快乐猫的博客-CSDN博客

    一、划分依据

    1.按流的方向分:

    输入流(读)(硬盘👉内存)、输出流(写)(内存👉硬盘)

    2.按流中的数据最小方向分(抽象类):

    字节流(输入:InputStream 、   输出:OutputStream)、

    字符流(输入:Reader 、输出Writer)

    二、具体实现类

    上述四个都是抽象类,不能直接用,要使用对应的实现类去实现,多态形式。

    1.对应的实现类:抽象类前面都加上File就是实现类形式了

    三、其他知识点

    1.常用的就是字符流

    2.输入就是读取存在的文件。输出就是写入数据(可以自动建立文件)。

    3.拷贝文件要手动建立一个文件,并且注意一二级文件(一级目录不能直接写入,二级才能生成写入)

    4.什么类型的IO流就放什么类型的数据。

    5.反斜杠(\\)就用两个。正斜杠就用一个(/)。效果是一样的

    四、具体IO流代码例子:

    1.字节流输入(读取文件数据)

    读取存在的文件就好了

    例子:

    1. package bao;
    2. import java.io.*;
    3. public class Test {
    4. public static void main(String[] args) throws IOException {
    5. //1.创建要读取的文件对象
    6. File file = new File("D:\\java_base\\SE\\src\\bao\\测试.txt");
    7. //2,new输入读取的实现类,这里要使用多态接口
    8. InputStream f = new FileInputStream(file);//会出现异常,抛出就好
    9. //3.定义一个和文件刚好大小的数组来进行读取
    10. byte[] b = new byte[(int) file.length()];
    11. //获取读取了多少个字节
    12. int len = f.read(b);//会出现异常,抛出就好
    13. System.out.println("读取了多少个字节:"+len);
    14. //获取文件的大小
    15. System.out.println(file.length());
    16. //获取文件内容
    17. System.out.println("文件内容为:"+new String(b));
    18. }
    19. }

    运行结果:

    读取了多少个字节:69
    69
    文件内容为:想念真的是压制不住的想念,但是又没有办法。kkk111 

     2.字节输出流(写入文件数据)

    不需要提前创建文件,代码中自动生成

    注意点:这里的是字节输入流,只能放字节类型。 

    例子:

    1. package bao;
    2. import java.io.*;
    3. import java.nio.charset.StandardCharsets;
    4. public class Test {
    5. public static void main(String[] args) throws IOException {
    6. //1.创建要读取的文件对象,会自动生成建立一个文件夹
    7. FileOutputStream os = new FileOutputStream("D:\\java_base\\SE\\src\\bao\\测试.txt");//会覆盖之前的文件内容,要在之前的文件上追加内容可以在加个true。例如:(xx,true)
    8. //2.要传入的数据放入一个数组中,要多少就给到文件中去
    9. byte[] a = {'w', '9','1','5','p'};
    10. //3.整个数组内容写入到文件中去
    11. os.write(a);
    12. //换行
    13. os.write("\r\n".getBytes(StandardCharsets.UTF_8));
    14. //4.中文单独写入到文件夹中
    15. byte[] b="中国人".getBytes(StandardCharsets.UTF_8);
    16. os.write(b);
    17. //关闭流,包含了刷新流(flush)。有了刷新才能运行完成。
    18. os.close();
    19. }
    20. }

    运行结果:

    w515p 中国人

    3.文件拷贝: 

    要提前创建一个放数据的文件夹

    适合做一切文件的拷贝,任何文件的底层都是字节

    用到的素材:

    例子: 

    1. package bao;
    2. import java.io.*;
    3. public class Test {
    4. public static void main(String[] args) throws IOException {
    5. //拷贝这个可能会出现异常,写完全部选中用异常处理快捷键CTRL+alt+t处理就好了。cty catch
    6. try {
    7. //文件拷贝三步走。1.建立输入拷贝源文件地址对象 2.建立输出拷贝到目标的地址对象 3.数组当两者之间的拷贝中介(传输管道)
    8. //1.输入的拷贝对象。注意点:这里要复制的只能一个个文件复制,而不是一整个文件夹复制地址
    9. InputStream in = new FileInputStream("D:\\图片\\壁纸\\巴蛇.jpg");//把图片文件夹全部复制拷贝地址
    10. //2.输出的拷贝对象。注意点:这里要粘贴到哪里也要精确到哪个文件中去(至少两级文件夹)
    11. OutputStream out = new FileOutputStream("E:\\放这里\\这里的名字就是粘贴到的文件名");//粘贴到的地址(一级地址"放这里"要手动先建立好,二级文件是自动生成的)
    12. //3.数组传输中介
    13. byte[] b = new byte[1024];//传输中介大小
    14. int len;//记录每次读取的字节数
    15. //循环来完成读写的闭环传输
    16. //读取数据
    17. while ((len=in.read(b))!=-1){
    18. //写入数据
    19. out.write(b,0,len);
    20. }
    21. System.out.println("复制完成了");
    22. //生成的抛出异常代码
    23. } catch (IOException e) {
    24. throw new RuntimeException(e);
    25. }
    26. }
    27. }

    运行结果:

    复制完成了 

    (复制成功👇) 

    4.强制资源释放 

    1.为什么要用强制资源释放?

    答:在开发中,有可能中间的代码就报错了,执行不到下面的关闭流代码。那么就要有一个好大哥来保证不管中间的运行时代码是否报错(编译异常会报错,只能通过运行时异常),这个强制关闭代码都会关闭流。那就是jvm不死,finally就存在并且优先执行于关闭流close

    2.怎么做?

    把例子3的代码try catch改成 try catch finally(里面代码块记得加上return;)就好了(快捷键ctrl+alt+t

     例子:

    可看可不看的代码,用来对照例子3更改了哪里

    1. package bao;
    2. import java.io.*;
    3. public class Test {
    4. public static void main(String[] args) throws IOException {
    5. //拷贝这个可能会出现异常,写完全部选中用异常处理快捷键CTRL+alt+t处理就好了。cty catch finally(记得加上代码块return;才能生效)
    6. try {
    7. //文件拷贝三步走。1.建立输入拷贝源文件地址对象 2.建立输出拷贝到目标的地址对象 3.数组当两者之间的拷贝中介(传输管道)
    8. //1.输入的拷贝对象。注意点:这里要复制的只能一个个文件复制,而不是一整个文件夹复制地址
    9. InputStream in = new FileInputStream("D:\\图片\\壁纸\\巴蛇.jpg");//把图片文件夹全部复制拷贝地址
    10. //2.输出的拷贝对象。注意点:这里要粘贴到哪里也要精确到哪个文件中去(至少两级文件夹)
    11. OutputStream out = new FileOutputStream("E:\\放这里\\这里的名字就是粘贴到的文件名");//粘贴到的地址(一级地址"放这里"要手动先建立好,二级文件是自动生成的)
    12. //3.数组传输中介
    13. byte[] b = new byte[1024];//传输中介大小
    14. int len;//记录每次读取的字节数
    15. //循环来完成读写的闭环传输
    16. //读取数据
    17. while ((len=in.read(b))!=-1){
    18. //写入数据
    19. out.write(b,0,len);
    20. }
    21. System.out.println("复制完成了");
    22. } catch (IOException e) {
    23. throw new RuntimeException(e);
    24. } finally {
    25. return;
    26. }
    27. }
    28. }

    运行结果:

    复制完成了

    5.字符输入流 (读取文件数据)

    读取存在的文件就好了

    为什么要用到字符流?

    优点:解决字节流可能出现的中文乱码问题。

    缺点: 性能较慢

    例子:

    素材: 

    1. package bao;
    2. import java.io.FileReader;
    3. import java.io.Reader;
    4. public class Test {
    5. public static void main(String[] args) throws Exception {
    6. //创建一个要读文件的对象
    7. Reader f = new FileReader("D:\\java_base\\SE\\src\\bao\\测试.txt");
    8. //new一个中介a进行读取
    9. char[] a = new char[1024];//1k字符
    10. int len;//这个len用来装要读里面的数据
    11. while ((len = f.read(a))!=-1){//把文件数据放到这个中介桶里面。
    12. //开始读
    13. String s = new String(a,0,len);
    14. System.out.println(s);
    15. }
    16. }
    17. }

    马作的卢飞快,弓如霹雳弦惊,ABCabc123,小狗小狗 

    6.字符输出流(写入文件数据)

    不需要提前创建文件,代码中自动生成

    1. package bao;
    2. import java.io.FileWriter;
    3. import java.io.Writer;
    4. public class Test {
    5. public static void main(String[] args) throws Exception {
    6. //创建一个要写文件的对象,该文件可以自动生成,出现异常抛出就好了
    7. Writer f = new FileWriter("D:\\java_base\\SE\\src\\bao\\测试1.txt");//后期需要加入数据就尾部加入true
    8. //例如: Writer f = new FileWriter("D:\\java_base\\SE\\src\\bao\\测试1.txt",true);
    9. //1.写一组数据进去
    10. f.write("6666长安落尽马蹄疾,aa");
    11. //2.写一个数组进去。
    12. char[] c="888一日看尽长安花,bb".toCharArray();
    13. f.write(c);
    14. f.close();//关闭流包含了刷新流。刷新流是flush
    15. }
    16. }

    运行结果:

    6666长安落尽马蹄疾,aa888一日看尽长安花,bb

     

    旁白:主要学习会了字符类型的IO流就好了。每次执行都会覆盖原有的数据,在开始创建对象地址后面加上一个true就不会被覆盖并且可以添加新的数据了,写完一定要记得刷新流或者关闭流才会生效。出现异常是常有的事情,快捷键抛出就好了。

    如果你觉得本篇文章对你有所帮助的,给个一键三连吧!!!

    点赞关注收藏,抱拳了!

  • 相关阅读:
    Pytorch模型量化
    [附源码]SSM计算机毕业设计茶园文化交流平台论文JAVA
    牛客小白月赛#59(A~F)
    看完这篇JavaScript工作中的问题迎刃而解
    Springboot3 + knife4j(springdoc) 框架整合
    用更多的钱买电脑而不是手机
    海量数据中找出前k大数(topk问题),一篇文章教会你
    React基础教程(07):条件渲染
    安卓游戏开发之图形渲染技术优劣分析
    Vue之html中特殊符号的展示
  • 原文地址:https://blog.csdn.net/m0_52861000/article/details/126732301