各位老铁,我们都知道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来写