Java中的I/O流是Java程序与外部环境(如文件,网络,终端设备等)进行通信的主要方式之一。I/O流最基本的概念就是流,它是一种数据的传输方式,将数据从一个地方传递到另一个地方。在Java中,I/O流主要分为字节流和字符流两种,其中字节流可以用于读写任何类型的数据,而字符流则更适用于读写文本数据。下面将详细介绍Java的I/O流。
1.字节流
字节流的主要类有InputStream
和OutputStream
,分别表示从数据源读取字节和向数据源写入字节。
1.1 InputStream
InputStream
是字节输入流的抽象基类,其常见子类有FileInputStream
、ByteArrayInputStream
、PipedInputStream
等。常用方法有:
int read()
:从输入流中读取一个字节并返回,如果已经到达流的末尾,则返回-1。int read(byte[] b)
:从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。返回实际读取的字节数。
1.2 OutputStream
OutputStream
是字节输出流的抽象基类,其常见子类有FileOutputStream
、ByteArrayOutputStream
、PipedOutputStream
等。常用方法有:
void write(int b)
:将指定的字节写入输出流。void write(byte[] b)
:将b.length个字节从指定的字节数组写入此输出流。
2.字符流
字符流可以用于读写文本数据,其主要类有Reader
和Writer
。
2.1 Reader
Reader
是字符输入流的抽象基类,其常见子类有FileReader
、InputStreamReader
、StringReader
等。常用方法有:
int read()
:读取单个字符并返回,如果已经到达流的末尾,则返回-1。int read(char[] cbuf)
:将字符读入到数组cbuf中,并返回实际读取的字符数。
2.2 Writer
Writer
是字符输出流的抽象基类,其常见子类有FileWriter
、OutputStreamWriter
、StringWriter
等。常用方法有:
void write(int c)
:将指定字符写入输出流。void write(char[] cbuf)
:将cbuf.length个字符从指定的字符数组写入此输出流。
3.缓冲流
缓冲流是I/O流的一个重要概念,主要分为BufferedInputStream
、BufferedOutputStream
、BufferedReader
和BufferedWriter
。缓冲流可以提高I/O操作的效率,减少读写操作对底层资源的频繁访问。缓冲流的用法与字节流和字符流类似。
4.对象流
对象流可以用于读写Java对象,其主要类有ObjectInputStream
和ObjectOutputStream
。在使用对象流读写Java对象时,要求对象必须实现Serializable
接口。其中,ObjectInputStream
的常用方法有readObject()
,可用于读取Java对象;ObjectOutputStream
的常用方法有writeObject(Object obj)
,可用于将Java对象写入输出流中。
5.转换流
转换流可以将字节流转换为字符流和字符流转换为字节流,其主要类有InputStreamReader
和OutputStreamWriter
。常用方法有:
InputStreamReader(InputStream in)
:创建一个新的InputStreamReader,允许读取指定的字节输入流。InputStreamReader(InputStream in, Charset cs)
:创建一个新的InputStreamReader,使用指定的字符集从指定的字节输入流读取数据。OutputStreamWriter(OutputStream out)
:创建一个新的OutputStreamWriter,允许指定的字节输出流。OutputStreamWriter(OutputStream out, Charset cs)
:创建一个新的OutputStreamWriter,使用指定的字符集将流写入指定的字节流。
6. NIO
Java NIO(New IO)是JDK 1.4引入的新I/O API,它提供了一种用于读和写数据的非阻塞方式。NIO核心的部分是通道和缓冲区,通道表示实体连接,如文件或套接字,缓冲区是一个可以写入数据和从中读取数据的内存块。NIO还提供了选择器(Selector)等工具,使得可以同时处理多个通道的I/O操作。
以上是Java的I/O流的详细介绍,从字节流、字符流、缓冲流、对象流、转换流到NIO的内容都被涵盖了。I/O流是Java编程中非常重要的一部分,它可以用于读写各种数据类型和各种数据源。对于Java的I/O流,了解其原理和使用方法对于编写高质量的Java代码非常有帮助。