IO/NIO — 输入/输出流

一、流的分类
  • 按流的方向分,可以分为输入流和输出流(以程序运行所在内存角度划分)

  • 按操作单元分,可以分为字节流和字符流(字节流1字节,字符流2字节)

  • 按流的角色分,可以分为节点流和处理流

    节点流:从/向特定的IO设备(磁盘、网络等)读写数据的流,也称低级流

    处理流:对一个已存在的流进行连接或者封装,再实现数据读写功能

二、常用方法
1、InputStream 和 Reader

是所有输入流的抽象基类,所有实现 inputStream 和 Reader 的类,都有如下方法(其中Reader单元是 字符和char[],其他的都一样)

  • read():从输入流中读取单个字节,返回所读取的字节数据
  • read(byte[] b):从输入流中读取数组b长度个字节的数据,并将数据存储在字节数组byte[]中,返回实际读取的字节数
  • read(byte[] b, int off, int len):从输入流最大读取len个字节的数据,并将数据存放到字节数组byte[]中,而且存放位置是从off开始

例如,使用 FileInputStram读取文件:

public static void main(String[] args) throws IOException{
    // 创建字节输入流
    FileInputStream files = new FileInputStream("test.txt");
    // 创建一个数组,批量读取
    byte[] bt = new byte[1024];
    // 用于保存实际读取的字节数
    int readCount = 0;
    
    while((readCount = files.read(bt) > 0){
        // 打印读取一次的字节,转字符串
        System.out.print(new String(bt, 0, readCount));
    }
    // 关闭资源
    files.close();
}
2、OutputStream 和 Writer

是所有输出流的抽象基类,所有实现 OutputStream 和 Writer的类,都有如下方法

  • write(int c):将指定字节输出到输出流中
  • write(byte[] buf):将字节数组中的数据输出到指定输出流中
  • write(byte[] buf, int off, int len):将字节数组从 off 开始,长度为 len的字节输出到输出流中

而且Writer还可以用字符串代替数组,如下

  • write(String str):将指定字符输出到输出流中
  • write(String str, int off, int len):将字符数组从 off 开始,长度为 len的字符输出到输出流中

节点流实现文件复制:

public static void main(String[] args) throws IOException{
    // 创建一个字节输入流,一个字节输出流
    FileInputStream input = new FileInputStream("test.txt");
    FileOutputStream output = new FileOutputStream("newTest.txt");
    
    byte[] bt = new byte[64];
    int readCount = 0;
    
    while((readCount = input.read(bt)) > 0){
        // 每读取一次,写入一次
        output.write(bt, 0, readCount);
    }
    // 关闭资源
    files.close();
}
三、处理流

可以隐藏底层设备上节点的差异,例如和I/O设备、文件的交互,前面两个例子都是节点流(直接以物理IO节点作为构造参数)

  • 处理流和节点流的区别:处理流构造参数不是物理节点,而是流

    例如:

    缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter

    对象流ObjectInputStreamObjectOutputStream

    打印流PrintStreamPrintWriter)等等

  • 缓冲流 BufferedReader 的使用

    其他的缓冲流用法都差不多,先以流为参数构造

    缓存实现文件复制:

    public static void main(String[] args) throws IOException{
        // 创建
        BufferedReader bufr = new BufferedReader(new FileReader("test.txt"));
        BufferedWriter bufw = new BufferedWriter(new FileWriter("newTest.txt"));
        
        String line = null;
        // 一行一行的读取,读到末尾时,返回null
        while((line = buf.readLine()) != null){
            bufw.write(line); // 将读取到的数据写入
            bufw.newLine(); // 写一个行分隔符
            bufw.flush(); // 冲洗流
        }
        bufr.close();
        bufw.close();
    }
    
四、转换流
  • InputStreamReader:将字节输入流转换成字符输入流
  • OutputStreamWriter:将字节输出流转换成字符输出流
// 获取键盘输入内容(键盘输入获取就是 System.in),获取的是字节,转换一下
InputStreamReader reader = new InputStreamReader(System.in);
// 再将 Reader 对象包装成 BufferedReader
BufferedReader br = new BufferedReader(reader);
### 回答1: IO输入输出)是指操作系统与硬件之间进行数据传输的过程。常见的IO操作包括读取和写入文件、网络数据传输等。 NIO (非阻塞IO)是Java中的一种IO编程方式,它支持非阻塞的数据传输,即程序在等待IO操作完成时不会阻塞。这样可以避免程序因等待IO而卡住的问题。NIO提供了异步通道、缓冲区等功能来支持高效的IO操作。 AIO (异步IO)是操作系统提供的另一种IO编程方式,它支持异步的数据传输。AIO允许程序在发起IO请求后立即返回,而不是等待IO操作完成。这样程序可以继续执行其他任务,避免因等待IO而阻塞。AIO在操作系统层面支持异步IO,而NIO是在Java语言层面支持异步IO. ### 回答2: IO,即Input/Output,是指计算机与外部设备之间进行数据传输的过程。传统的IO操作是同步的,即在进行IO操作时,程序会阻塞等待数据的读写完成。这种方式效率较低,因为程序在等待IO操作完成时无法做其他事情。 NIO,即New Input/Output,是Java在JDK1.4版本引入的一种新的IO模型。NIO可以实现非阻塞的IO操作,其核心是通过通道(Channel)和缓冲区(Buffer)来实现数据的读写。NIO通过选择器(Selector)实现了多路复用,一个线程可以同时处理多个通道的IO操作,实现了更高的效率。NIO适用于连接数较多且连接时间较短的场景,例如网络编程中的ServerSocketChannel和SocketChannel。 AIO,即Asynchronous Input/Output,是Java在JDK1.7版本引入的一种新的IO模型。AIO通过回调机制实现异步的IO操作,当IO操作完成后会触发回调函数的执行。AIO适用于连接数较少且连接时间较长的场景,例如网络编程中的AsynchronousServerSocketChannel和AsynchronousSocketChannel。相比于NIO,AIO的优势是在IO操作完成前不需要阻塞线程,可以充分利用线程资源,并且编程模型更简单。 综上所述,IO是传统的同步IO模型,效率较低;NIO是一种非阻塞的IO模型,通过选择器实现了多路复用,效率较高;AIO是一种异步的IO模型,通过回调机制实现了非阻塞的IO操作,适用于连接时间较长的场景。在实际开发中,可以根据具体需求选择适合的IO模型来提高程序的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值