IO流知识集锦

各位老铁,我们都知道Java IO(输入/输出)流是Java用于处理数据读取和写入的关键组件,那么具体的内容有哪些呢,让我来带着大家共同学习下吧

1. 字节流(InputStream / OutputStream)

字节流在Java中主要用于处理二进制数据。它们可以用于读写任何类型的数据,如图像,音频,视频等。

  • InputStream:所有字节输入流的超类,定义了基本的读取字节的方法。常用子类有 FileInputStream,用于从文件中读取数据。

  • OutputStream:所有字节输出流的超类,定义了基本的写入字节的方法。常用子类有 FileOutputStream,用于向文件中写入数据。

以下是使用FileInputStream和FileOutputStream的Java代码示例:

2. 字符流(Reader / Writer)

字符流主要用于处理文本数据,它们按字符而非字节进行操作,因此更适合处理文本数据。

  • Reader:所有字符输入流的超类,定义了基本的读取字符的方法。常用子类有 FileReader,用于从文件中读取数据。

  • Writer:所有字符输出流的超类,定义了基本的写入字符的方法。常用子类有 FileWriter,用于向文件中写入数据。

以下是使用FileReader和FileWriter的Java代码示例:

3. 缓冲流(BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter)

缓冲流在读写操作中添加了缓冲区,可以提高IO操作的效率。缓冲区在读取时一次性读取多个字节到内存,或在写入时先将多个字节写入缓冲区,然后一次性写入文件。

  • BufferedInputStream/BufferedOutputStream:字节缓冲流,可以提高字节流的读写效率。

  • BufferedReader/BufferedWriter:字符缓冲流,可以提高字符流的读写效率,同时BufferedReader提供了按行读取文本的方法,方便文本处理。

以下是使用BufferedReader和BufferedWriter的Java代码示例:

4. 数据流(DataInputStream / DataOutputStream)

数据流用于读写Java基本数据类型的数据(如int, float, long等)以及String类型的数据。这些流可以将基本数据类型转换为字节,并以合适的方式存储,以便可以正确地读取。

  • DataInputStream:允许应用程序以机器无关的方式从底层输入流中读取基本Java数据类型的输入流。常用方法有readInt()、readFloat()、readUTF()等。

  • DataOutputStream:允许应用程序以机器无关的方式将基本Java数据类型写入到底层输出流中。常用方法有writeInt()、writeFloat()、writeUTF()等。

以下是使用DataInputStream和DataOutputStream的Java代码示例:

5. 对象流(ObjectInputStream/ObjectOutputStream)

对象流是一种高级流,用于读取或写入对象。这些对象可以是任何实现了 Serializable 接口的对象。

  • ObjectInputStream:用于从源中读取对象。

  • ObjectOutputStream:用于将对象写入目标。

以下是使用ObjectInputStream和ObjectOutputStream的Java代码示例:

注意:序列化时,只对对象的非静态数据成员进行序列化操作,静态数据成员属于类级别的,所以不需要序列化。

6. 打印流(PrintStream / PrintWriter)

打印流是另一种特殊的流,主要用于创建格式化的输出,而不是原始的字节。这种类型的流非常适合打印输出,或者写入文本文件。

  • PrintStream:为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

  • PrintWriter:打印各种格式的表示形式,包括文本、字符数组、数字、日期、时间等。

以下是使用PrintWriter的Java代码示例:

我们详细地介绍了Java IO流的各种类型,及其使用场景和代码示例。理解并熟练掌握这些IO流,将对你进行文件操作、网络通信等方面的开发工作带来极大的便利。

你知道BIO,NIO,AIO么?

BIO (Blocking I/O):同步阻塞I/O 模式,以流的方式处理数据,数据的读取写入必须阻塞在一个线程内等待其完成。适用于连接数目比较小且固定的架构

NIO (New I/O):同时支持阻塞与非阻塞模式,以块的方式处理数据,适用于连接数目多且连接比较短(轻操作)的架构,比如聊天器

AIO ( Asynchronous I/O):异步非阻塞I/O 模型,适用于连接数目多且连接比较长(重操作)的架构

BIO:

这里我们使用java的ServerSocket和Socket来进行学习,BIO即同步并阻塞(传统阻塞型),如果使用BIO,服务端为一个连接就需要开启 一个线程,即一个线程处理一个客户端请求,如果这个连接并没有用来做任何数据的传输,线程依然会一直阻塞等待客户端发送数据,这种方式适用于连接数目比较小且固定的架构,这种方式对服 务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯 一选择,但程序简单易理解

NIO:

Java NIO属于非阻塞式IO,它的作用和原来的BIO完全一致,但使用方式完全不一样,NIO支持面向缓冲区、基于通道的IO操作,传统的IO的read和write只能阻塞执行,线程在阻塞期间不能做其它事情。操作NIO相关的类都在java.nio包下面,NIO有三大核心部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器)。

NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个 线程就可以监听多个客户端通道

AIO:

先由操作系统去读取,只需要调用异步方法read获取write即可

四大基础流:

InputStream : 输入字节流, 也就是说它既属于输入流, 也属于字节流 ,

OutputStream: 输出字节流, 既属于输出流, 也属于字节流

Reader: 输入字符流, 既属于输入流, 又属于字符流

Writer: 输出字符流, 既属于输出流, 又属于字符流

读文本用什么流,读图片用什么流

文本用字符输入流,读图片用字节输入流

字符流和字节流有什么区别

字符流适用于读文本,字节流适用于读图片,视频,文件等。

字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。

字节流默认不使用缓冲区;字符流使用缓冲区。

字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元

BufferedInputStream 用到什么设计模式

主要运用了俩个设计模式,适配器和装饰者模式

带缓冲区的流

BufferedInputStream 带缓冲区的字节输入

BufferedOutputStream 带缓冲区的输出流

BufferedReader : 带缓冲区的字符输入流

BufferedWriter : 带缓冲区的字符输出流

怎么实现一张图片拷贝

需要一个FileInputStream指向读取的文件,然后把它包装到BufferInputStream,使用BufferInputStream#read方法去读byte[],然后创建一个FileOutputStream指向输出文件,然后把它包装到BufferOutputStream,使用BufferOutputStream#write方法写byte[]到另外一个文件

怎么实现文本拷贝

和文件拷贝思路一样,只不过读的时候需要使用BufferedReader和FileReader,使用readline来读 , 写的时候需要BufferedWriter和 FileWriter,用wite来写

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值