InputStream
InputStream
是 Java I/O 中所有输入流的抽象基类,它定义了读取字节流的基本方法。
InputStream
类提供了许多子类,用于从不同的数据源读取数据,如文件、网络连接、内存等。
InputStream
提供了以下常用的方法:
int read()
: 从输入流中读取下一个字节的数据。如果已经到达流的末尾,则返回 -1。int read(byte[] b)
: 从输入流中读取一定数量的字节,并将其存储到字节数组b
中。返回实际读取的字节数。int read(byte[] b, int off, int len)
: 从输入流中读取最多len
个字节的数据,并将其存储到从偏移量off
开始的字节数组b
中。返回实际读取的字节数。long skip(long n)
: 跳过并丢弃输入流中的n
个字节数据,并返回实际跳过的字节数。int available()
: 返回可以从输入流中读取而不被阻塞的字节数。void close()
: 关闭输入流并释放与之关联的系统资源。
InputStream
是一个抽象类,不能直接实例化,通常通过其具体的子类来实现不同的输入流功能,如 FileInputStream
、ByteArrayInputStream
、BufferedInputStream
等
1 ByteArrayInputStream:这个类允许将内存中的字节数组作为输入流来处理。它的构造函数接受一个字节数组作为参数,并可以从该数组中读取数据。它通常用于在内存中处理二进制数据,比如处理内存中的图片数据或者处理网络数据。
byte[] byteArray = { 1, 2, 3, 4, 5 };
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
2 FileInputStream:这个类用于从文件系统中读取数据。它的构造函数接受一个文件路径作为参数,然后可以从该文件中读取数据。它通常用于读取文件内容,比如读取文本文件、图片文件等。
FileInputStream fileInputStream = new FileInputStream("example.txt");
3 FilterInputStream:这个类是一个抽象类,它提供了对输入流的过滤功能。它本身并不能直接创建实例,而是通过其子类来实现具体的功能。常用的子类包括 BufferedInputStream、DataInputStream 等,它们可以在输入流的基础上添加缓冲、数据格式化等功能。
InputStream inputStream = new FileInputStream("example.txt");
FilterInputStream filterInputStream = new BufferedInputStream(inputStream);
3.1 BufferedInputStream:
BufferedInputStream是InputStream的子类,它提供了缓冲功能,可以提高读取数据的性能。
当你需要从输入流中读取数据时,BufferedInputStream会先将一部分数据读取到内存缓冲区中,然后逐步从缓冲区中读取数据,减少了直接从硬盘或网络读取数据的次数,从而提高了读取效率。
3.2DataInputStream:
DataInputStream是InputStream的子类,它提供了一些方法来读取Java基本数据类型和字符串。
例如,它提供了readInt()、readDouble()、readUTF()等方法,可以用来读取整型、双精度浮点数和UTF-8编码的字符串。
3.3LineNumberInputStream:
LineNumberInputStream是InputStream的子类,它提供了跟踪行号的功能。
当你从一个文本文件中逐行读取数据时,LineNumberInputStream会跟踪当前读取的行号,方便你在需要时获取行号信息。
3.4 PushbackInputStream:
PushbackInputStream是InputStream的子类,它提供了回推功能,允许你将读取的数据推回到输入流中。
这在某些场景下很有用,比如你读取了一些数据但最终决定不使用它们,你可以将这些数据推回到输入流中,以便后续读取
4 ObjectInputStream:用于从输入流中读取 Java 对象。它可以读取通过 ObjectOutputStream 写入的对象,并将它们还原为内存中的对象实例。
FileInputStream fileInputStream = new FileInputStream("object.dat");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
5 PipedInputStream:通过管道进行线程间通信时,可用于接收来自管道输出流的数据。通常与 PipedOutputStream 一起使用。
PipedOutputStream pipedOutputStream = new PipedOutputStream();
PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);
6 SequenceInputStream:用于将多个输入流串联起来,形成一个顺序读取的输入流。它接受两个输入流作为参数,在读取时先从第一个输入流读取数据,当第一个输入流读取结束后再从第二个输入流读取数据,依次类推。
FileInputStream fileInputStream1 = new FileInputStream("file1.txt");
FileInputStream fileInputStream2 = new FileInputStream("file2.txt");
SequenceInputStream sequenceInputStream = new SequenceInputStream(fileInputStream1, fileInputStream2);
7 StringBufferInputStream:已过时的类,用于将字符串转换为输入流。它将一个字符串转换为字节流,但由于它使用的是默认的字符编码,因此可能导致在处理非 ASCII 字符时出现问题。建议使用 ByteArrayInputStream 或 ByteArrayInputStream 代替。
StringBufferInputStream stringBufferInputStream = new StringBufferInputStream("Hello, world!");
OutPutStream
OutputStream
是Java中所有输出流的抽象基类。它定义了一系列用于向目标位置写入数据的方法。OutputStream
本身是一个抽象类,不能直接实例化,而是通过其子类来实现具体的输出流功能。
一些常见的OutputStream
的子类已经在之前提到了,包括FileOutputStream
、ByteArrayOutputStream
等。这些子类都实现了OutputStream
中定义的方法,用于写入数据到不同的目标位置,比如文件、内存、网络等。
一些常见的OutputStream
的方法包括:
write(int b)
:写入一个字节到输出流。write(byte[] b)
:写入一个字节数组到输出流。write(byte[] b, int off, int len)
:写入指定长度的字节数组到输出流,并指定起始位置和长度。flush()
:刷新输出流,将缓冲区中的数据立即写入到目标位置。close()
:关闭输出流,释放相关的资源。
-
ByteArrayOutputStream:
- ByteArrayOutputStream是OutputStream的一个子类,它可以将数据写入到一个字节数组中。
- 当你需要将数据写入到内存中的字节数组时,可以使用ByteArrayOutputStream。它提供了一系列write()方法来写入数据,并且可以通过toByteArray()方法获取写入的字节数组。
-
FileOutputStream:
- FileOutputStream是OutputStream的一个子类,它用于将数据写入到文件中。
- 当你需要将数据写入到文件中时,可以使用FileOutputStream。你可以指定文件路径作为构造函数的参数,然后使用write()方法将数据写入文件。
-
FilterOutputStream:
- FilterOutputStream是OutputStream的一个抽象子类,它可以用于添加一些额外的功能来装饰其他的输出流。
- 你可以通过继承FilterOutputStream并覆写其方法来添加自定义的输出流功能,比如数据加密、压缩等。
-
ObjectOutputStream:
- ObjectOutputStream是OutputStream的一个子类,它用于将Java对象写入到输出流中。
- 当你需要将Java对象序列化成字节流并写入到文件或网络中时,可以使用ObjectOutputStream。它可以序列化对象,并通过writeObject()方法将对象写入输出流。
-
PipedOutputStream:
- PipedOutputStream是OutputStream的一个子类,它和PipedInputStream一起使用来实现线程间的管道通信。
- 你可以将PipedOutputStream连接到一个PipedInputStream,然后在一个线程中写入数据到PipedOutputStream,另一个线程可以从连接的PipedInputStream中读取数据。
Reader
Reader
类是用于读取字符流的抽象类。它是所有字符输入流的父类,提供了一系列用于读取字符数据的方法。Reader
本身是一个抽象类,不能直接实例化,而是通过其子类来实现具体的字符输入流功能
Reader
类中定义了一些常用的方法,包括:
int read()
:读取单个字符并返回其Unicode代码点。int read(char[] cbuf)
:将字符读入数组中,并返回读取的字符数。int read(char[] cbuf, int off, int len)
:将字符读入数组的指定位置,并返回读取的字符数。void close()
:关闭输入流并释放与之关联的系统资源。void mark(int readAheadLimit)
:在当前位置设置标记,以便后续调用reset()
方法时能够返回到该位置。boolean markSupported()
:判断该输入流是否支持标记操作。void reset()
:将输入流的位置重置到最近的标记位置。long skip(long n)
:跳过指定数量的字符。
- FileReader:从文件中读取字符数据的字符输入流。
- BufferedReader:提供了缓冲功能,用于提高读取字符数据的性能。
- CharArrayReader:从字符数组中读取字符数据的字符输入流。
- InputStreamReader:将字节流转换为字符流的字符输入流。
- PipedReader:用于实现线程间通信的字符输入流。
- StringReader:从字符串中读取字符数据的字符输入流。
Writer
Writer
类是用于写入字符流的抽象类。它是所有字符输出流的父类,提供了一系列用于写入字符数据的方法。与Reader
类类似,Writer
也是一个抽象类,不能直接实例化,而是通过其子类来实现具体的字符输出流功能
Writer
类中定义了一些常用的方法,包括:
void write(int c)
:写入单个字符。void write(char[] cbuf)
:将字符数组中的所有字符写入。void write(char[] cbuf, int off, int len)
:将字符数组的指定部分写入。void write(String str)
:将字符串中的所有字符写入。void write(String str, int off, int len)
:将字符串的指定部分写入。void flush()
:刷新该流的缓冲区,将数据写入目的地。void close()
:关闭输出流并释放与之关联的系统资源。
通过这些方法,Writer
及其子类提供了灵活的方式来写入字符数据,可以将数据写入到文件、内存、网络等不同的目的地。
一些常见的Writer
的子类包括:
- FileWriter:向文件中写入字符数据的字符输出流。
- BufferedWriter:提供了缓冲功能,用于提高写入字符数据的性能。
- CharArrayWriter:向字符数组中写入字符数据的字符输出流。
- OutputStreamWriter:将字符流转换为字节流的字符输出流。
- PipedWriter:用于实现线程间通信的字符输出流。
- StringWriter:将字符数据写入到字符串中的字符输出流。