Java—I/O操作

本文详细介绍了Java编程中的I/O操作,包括I/O流的概念、Java提供的各种输入流和输出流(如ByteStreams和CharacterStreams),以及它们在文件复制、文本处理和网络编程中的应用。此外,还比较了BIO、NIO和AIO三种I/O模型的优缺点。
摘要由CSDN通过智能技术生成

Java编程中,I/O(输入/输出)操作是不可避免的。Java提供了丰富而灵活的I/O流操作,使得我们能够有效地处理各种输入和输出。本文将深入探讨Java I/O流的基本概念、不同类型的流以及一些实际应用。

什么是I/O 流?

IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。

Java I0 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 是所有的输入流的基类,InputStream是字节输入流,Reader是字符输入流。

  • OutputStream/Writer: 是所有输出流的基类,OutputStream是字节输出流,Writer是字符输出流。

字节流和字符流的区别

字节流(Byte Streams):以字节为单位进行读写,适用于二进制数据(如图片、视频等)。
字符流(Character Streams):以字符为单位进行读写,适用于文本数据。

字节流(Byte Streams)

Java提供了两个基本的字节流类:InputStream和OutputStream。以下是一些常见的字节流:

FileInputStream 和 FileOutputStream

try (FileInputStream fis = new FileInputStream("input.txt");
     FileOutputStream fos = new FileOutputStream("output.txt")) {
 
    int byteData;
    while ((byteData = fis.read()) != -1) {
        fos.write(byteData);
    }
 
} catch (IOException e) {
    e.printStackTrace();
}


BufferedInputStream 和 BufferedOutputStream

try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
 
    int byteData;
    while ((byteData = bis.read()) != -1) {
        bos.write(byteData);
    }
 
} catch (IOException e) {
    e.printStackTrace();
}


字符流(Character Streams)

Java提供了两个基本的字符流类:Reader和Writer。以下是一些常见的字符流:

FileReader 和 FileWriter
 

try (FileReader reader = new FileReader("input.txt");
     FileWriter writer = new FileWriter("output.txt")) {
 
    int charData;
    while ((charData = reader.read()) != -1) {
        writer.write(charData);
    }
 
} catch (IOException e) {
    e.printStackTrace();
}


BufferedReader 和 BufferedWriter:
 

try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
     BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
 
    String line;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine(); // 换行
    }
 
} catch (IOException e) {
    e.printStackTrace();
}


实际应用场景

文件复制:使用字节流可以轻松实现文件的复制。
文本处理:使用字符流进行文本文件的读写和处理。
网络编程:I/O流在网络编程中起到关键作用,通过Socket可以实现数据在网络间的传输。

BIO、NIO、AIO

  • BIO (Blocking I/O):

    同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
  • NIO (New I/O):

    NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 SocketServerSocket 相对应的 SocketChannelServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
  • AIO (Asynchronous I/O):

    ​​​​​​​AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。
  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值