IO流基础知识总结

IO流也称为输入输出流,用于读写数据的。

 IO流概述

  • I:即input,是将数据从硬盘读入到内存的过程,称为输入,负责读
  • O:即Output,是将数据从内存写入硬盘的过程,称为输出,负责写

 

 IO流分类

按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)

按数据流的流向不同分为:输入流,输出流

按流的角色的不同分为:节点流,处理流

 下图是io流的分类图

 

 字节输入流

构造器说明
public FileInputStream(File file)创建字节输入流对象与源文件对象接通
public FileInputStream(String pathname)创建字节输入流对象与源文件路径接通

 字节输入流FileInputStream主要方法

返回值方法名详情
intread() 从此输入流中读取一个数据字节。如果字节没有可读的返回-1.
intread(byte[] b)从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果字节没有可读的返回-1.
intread(byte[] b, int off, int len)从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
voidclose()关闭此输入流并释放与该流关联的所有系统资源。

下面代码能更直观的知道如何使用输入流

package com.lyc.lesson;

import java.io.*;

public class Lesson01 {
    public static void main(String[] args) throws IOException {
        //1、获取文件
        File file = new File("C:/Users/ASUS/Desktop/zz2212/aaa/3.txt");
        //2、将文件转化为文件流
        InputStream fis = new FileInputStream(file);
        //3、创建缓冲
        BufferedInputStream bis = new BufferedInputStream(fis);
        //4、创建缓冲区数组
        //new byte[2]  每次读取两个字节
        byte[] bytes = new byte[2];
        //5、将缓冲区的字节存入到数组中
        int read = bis.read(bytes);
        //6、输出数组中的数据
//        System.out.println(new String(bytes,0,read));

        int length = -1;
        while ((length = bis.read(bytes)) != -1){
            System.out.println("-------------");
            System.out.println(new String(bytes,0,length));
        }
        //7、关闭流
        bis.close();
        fis.close();
    }
}

 字节输出流

构造器说明
public FileOutputStream(File file)创建一个字节输出流管道通向目标文件对象
public FileOutputStream(String filePathname)创建一个字节输出流管道通向目标文件路径
public FileOutputStream(File file,boolean append)创建一个追加数据的字节输出流管道通向目标文件对象
public FileOutputStream(String file,boolean append)创建一个追加数据的字节输出流管道通向目标文件路径

字节输出流FileOutputStream主要方法

返回值方法名详情
voidwrite(byte[] b)将 b.length 个字节从指定 byte 数组写入此文件输出流中。
voidwrite(byte[] b, int off, int len)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
voidwrite(int b)将指定字节写入此文件输出流。
voidclose()关闭此输入流并释放与该流关联的所有系统资源。

输出流的使用如下
 

package com.lyc.lesson;

import java.io.*;

public class Lesson04 {
    public static void main(String[] args) throws IOException {
        //获取文件位置
        File file = new File("C:/Users/ASUS/Desktop/zz2212/aaa/1.txt");
        //
        FileOutputStream fos = new FileOutputStream(file);

        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //将字符串转化为字节数组
        String str = "我是帅哥,我好帅";
        byte[] bytes1 = str.getBytes();
        //write(),将字符数组写入缓冲数组中
        bos.write(bytes1,0, bytes1.length);
        //刷新
        bos.flush();
        //关闭流,先创建的流,后关闭;后创建的流,先关闭
        bos.close();
        fos.close();
    }
}

 字符输出流,字符输入流和以上的字节流使用方法很相似,在开发中一般使用字节流。

 文件拷贝

 文件拷贝案例:

需求:把某文件的内容复制到其他目录下
思路:
1、根据数据源创建字节输入流对象
2、根据目标地创建字节输出流对象
3、读写数据,复制内容
4、释放资源

案例解决代码:

package com.zcl.d4_byte_OutputStream;

import java.io.*;

/*
    目标:学会字节流拷贝文件(支持一切的字节流文件)
 */
public class CopyDemo {
    public static void main(String[] args) {

        try {
            // 1、创建一个字节输入流管道与文件接通
            InputStream is = new FileInputStream("D:\\黑马2022java学习路线);
            // 2、创建一个输出管道与目标文件接通
            OutputStream os = new FileOutputStream("D:\\abc.mp4");
            // 3、定义一个字节数组转移数据
            byte[] buffer = new byte[1024];
            int len; // 记录转义的字节数
            while ((len = is.read(buffer)) != -1){
                os.write(buffer,0,len);
            }
            System.out.println("数据读取完成");
            // 完成一定要关闭流
            os.close();
            is.close();
        } catch (Exception e) {
            // 拦截预测
            e.printStackTrace();
        }
    }
}

资源释放

资源释放的方式:try-catch-finally

注意:不管代码是否正常或者异常亦或者rteurn都会执行finally中的代码,开发中不建议在finally中加入return返回数据,很容易出现问题

finally:在异常处理时提供finally块来执行所有清除操作,比如说IO流中释放资源
特点:被finally控制的语句最终一定会执行,除非JVM退出

 格式代码:

package com.zcl.d5_resource;

import java.io.*;

/*
    目标:学会使用finally释放资源
 */
public class TryCatchfinnal {
    public static void main(String[] args) {
        InputStream is = null;
        OutputStream os = null;

        try {
            // 1、创建一个字节输入流管道与文件接通
            is = new FileInputStream("D:\\黑马2022java学习路线\\第1阶段—Java SE基础\\1、Java基础--20天学会Java\\20天学会java—视频\\day14-常用API(常用API、正则表达式、Lambda、算法)\\day14-常用API(常用API、正则表达式、Lambda、算法)\\01、今日课程介绍.mp4");
            // 2、创建一个输出管道与目标文件接通
            os = new FileOutputStream("D:\\abc.mp4");
            // 3、定义一个字节数组转移数据
            byte[] buffer = new byte[1024];
            int len; // 记录转义的字节数
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
            System.out.println("数据读取完成");
        } catch (Exception e) {
            // 拦截预测
            e.printStackTrace();
        } finally {
            // 无论代码释放正常结束还是异常结束都会执行

            // 完成一定要关闭流
            try {
                // 一定要做非空校验
                if (os != null) os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (is != null) is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

很抱歉,作为文本AI助手,我无法绘制思维导图。但是,我可以为您提供一个简要的java IO流知识点总结Java IO流Java中用于处理输入和输出的机制。它提供了一种有效的方式来读取和写入数据,以及与文件、网络和其他设备进行交互。 Java IO流包括字节流和字符流两种类型。字节流以字节为单位进行操作,适用于处理二进制数据。而字符流以字符为单位进行操作,适用于处理文本数据。 常用的字节流包括InputStream和OutputStream类,用于读取和写入字节数据。常用的字符流包括Reader和Writer类,用于读取和写入字符数据。可以通过使用字节流和字符流的组合来实现不同类型数据的读写操作。 在Java IO流中,还有一些特殊的流,如缓冲流、转换流、对象流等。缓冲流提供了缓冲区来提高IO性能。转换流用于处理字符编码和解码。对象流用于对Java对象进行读写操作。 此外,Java IO流还包括一些常用的类和方法,如File类用于处理文件和目录,RandomAccessFile类用于对文件进行随机访问,FileInputStream和FileOutputStream类用于读写文件等。 通过组合和使用不同类型的流和类,您可以实现各种复杂的IO操作,如读写文件、网络通信、序列化对象等。 希望这个简要总结对您有所帮助。如果您有任何更具体的问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)](https://blog.csdn.net/a1405/article/details/116766237)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值