Java I/O输入/输出流 第15章
1.输入/输出流
Java I/O(输入/输出)流是用于在Java程序中处理输入和输出数据的机制。这是与文件、网络连接、键盘、屏幕等各种数据源和数据目标进行交互的重要方式。Java的I/O库提供了一组类来处理各种I/O操作,这些类位于java.io
包中。
Java I/O流主要分为两类:
- 字节流(Byte Streams):这些流以字节为单位进行数据传输,适用于处理二进制数据,如图像、音频、视频等。常见的字节流类包括
FileInputStream
、FileOutputStream
、BufferedInputStream
、BufferedOutputStream
等。 - 字符流(Character Streams):这些流以字符为单位进行数据传输,适用于处理文本数据,如文本文件的读写。字符流会自动处理字符编码和解码,以确保正确的字符转换。常见的字符流类包括
FileReader
、FileWriter
、BufferedReader
、BufferedWriter
等。
1.1输入流
输入流(InputStream)是用于从数据源(通常是文件、网络连接或其他数据源)读取数据的抽象类。输入流提供了各种方法来从数据源中逐个字节或一组字节读取数据。输入流通常用于处理输入数据,如文件读取、网络通信中的数据接收等。
以下是一些常用的Java输入流类和方法:
-
FileInputStream:用于从文件中读取数据。
InputStream input = new FileInputStream("example.txt");
-
ByteArrayInputStream:用于从字节数组中读取数据。
byte[] data = new byte[] { 65, 66, 67, 68 }; InputStream input = new ByteArrayInputStream(data);
-
BufferedInputStream:用于提高性能的缓冲输入流。它包装在其他输入流周围,通过缓冲区一次读取多个字节。
InputStream input = new BufferedInputStream(new FileInputStream("example.txt"));
-
DataInputStream:用于以二进制格式读取基本数据类型。
InputStream input = new DataInputStream(new FileInputStream("data.dat"));
-
ObjectInputStream:用于反序列化对象,从输入流中还原对象。
InputStream input = new FileInputStream("object.dat"); ObjectInputStream objectInput = new ObjectInputStream(input); Object obj = objectInput.readObject();
-
PipedInputStream:用于线程间通信,通过管道传输数据。
PipedInputStream input = new PipedInputStream();
使用输入流时,通常会调用其read
方法来读取数据,并根据读取结果进行处理。输入流的常用方法包括:
int read()
:从输入流中读取下一个字节的数据,返回读取的字节数据,如果到达流的末尾,则返回-1。int read(byte[] buffer)
:从输入流中读取多个字节数据到字节数组中,并返回实际读取的字节数。int read(byte[] buffer, int offset, int length)
:从输入流中读取指定数量的字节到字节数组的指定偏移位置,返回实际读取的字节数。void close()
:关闭输入流,释放相关资源。
以下是一个简单的示例,演示如何使用FileInputStream
读取文件中的数据:
import java.io.*;
public class InputStreamExample {
public static void main(String[] args) {
try {
InputStream input = new FileInputStream("example.txt");
int data;
while ((data = input.read()) != -1) {
System.out.print((char) data);
}
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这个示例使用FileInputStream
从名为"example.txt"的文件中逐个字节读取数据,并将其显示在控制台上。
1.2输出流
输出流(OutputStream)是用于向数据目标(通常是文件、网络连接或其他数据目标)写入数据的抽象类。输出流提供了各种方法来将数据逐个字节或一组字节写入到数据目标中。输出流通常用于处理输出数据,如将数据写入文件、通过网络发送数据等。
以下是一些常用的Java输出流类和方法:
-
FileOutputStream:用于将数据写入文件。
OutputStream output = new FileOutputStream("output.txt");
-
ByteArrayOutputStream:用于将数据写入字节数组。
ByteArrayOutputStream output = new ByteArrayOutputStream();
-
BufferedOutputStream:用于提高性能的缓冲输出流。它包装在其他输出流周围,通过缓冲区一次写入多个字节。
OutputStream output = new BufferedOutputStream(new FileOutputStream("output.txt"));
-
DataOutputStream:用于以二进制格式写入基本数据类型。
OutputStream output = new DataOutputStream(new FileOutputStream("data.dat"));
-
ObjectOutputStream:用于将对象序列化后写入输出流中。
OutputStream output = new FileOutputStream("object.dat"); ObjectOutputStream objectOutput = new ObjectOutputStream(output); objectOutput.writeObject(someObject);
-
PipedOutputStream:用于线程间通信,通过管道传输数据。
PipedOutputStream output = new PipedOutputStream();
使用输出流时,通常会调用其write
方法来写入数据,并根据写入结果进行处理。输出流的常用方法包括:
void write(int b)
:将一个字节写入输出流。void write(byte[] buffer)
:将字节数组中的所有数据写入输出流。void write(byte[] buffer, int offset, int length)
:将字节数组中的指定范围数据写入输出流。void flush()
:将缓冲区中的数据立即刷新到输出流,确保数据被写入。void close()
:关闭输出流,释放相关资源
以下是一个简单的示例,演示如何使用FileOutputStream
将数据写入文件:
import java.io.*;
public class OutputStreamExample {
public static void main(String[] args) {
try {
OutputStream output = new FileOutputStream("output.txt");
String data = "Hello, Java I/O!";
byte[] bytes = data.getBytes();
output.write(bytes);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这个示例使用FileOutputStream
将字符串数据写入名为"output.txt"的文件中
2.File类
File
类是Java中用于操作文件和目录的类,它提供了一种在文件系统中创建、访问、检查和管理文件和目录的方法。File
类的实例可以代表文件或目录的路径,允许你进行文件和目录的各种操作,如创建文件、删除文件、查询文件信息等。
以下是File
类的一些常见操作和用法:
-
创建文件或目录:
File file = new File("example.txt")
:创建一个代表名为"example.txt"的文件的File
对象。File dir = new File("myDirectory")
:创建一个代表名为"myDirectory"的目录的File
对象。file.createNewFile()
:在文件系统中创建一个文件。dir.mkdir()
:在文件系统中创建一个目录。
-
检查文件或目录属性:
file.exists()
:检查文件是否存在。file.isFile()
:检查File
对象是否代表文件。dir.isDirectory()
:检查File
对象是否代表目录。file.getName()
:获取文件或目录的名称。file.getAbsolutePath()
:获取文件或目录的绝对路径。
-
获取文件和目录内容:
dir.list()
:返回目录中的文件和子目录的名称数组。dir.listFiles()
:返回目录中的文件和子目录的File
对象数组。
-
删除文件或目录:
file.delete()
:删除文件。dir.delete()
:删除目录。
-
重命名文件或目录:
file.renameTo(newName)
:重命名文件。dir.renameTo(newName)
:重命名目录。
-
遍历目录内容:
使用递归或循环来遍历目录中的文件和子目录。你可以使用
listFiles()
方法获取File
对象数组,并递归遍历子目录。
例1:在指定盘目录创建文本文件
3.文件输入/输出流
3.1FileInputStream和FileOutputStream类
FileInputStream
和FileOutputStream
是Java中用于文件输入和输出的类,它们分别用于从文件中读取数据和将数据写入文件。这两个类属于字节流,适用于处理二进制数据,如图像、音频、视频以及文本等。以下是关于它们的更详细信息:
- FileInputStream:
FileInputStream
是用于从文件中读取数据的类。- 它继承自
InputStream
类,因此可以使用所有InputStream
提供的方法来读取文件中的字节数据。 - 你可以通过创建一个
FileInputStream
对象,并传递文件路径作为参数来打开一个文件以供读取。 - 通常使用
read()
方法从文件中逐个字节地读取数据。例如,int data = fileInputStream.read();
会返回文件中的下一个字节数据。 - 需要注意的是,在使用完
FileInputStream
后,应该调用close()
方法关闭流,以确保文件句柄和系统资源得到释放。
- FileOutputStream:
FileOutputStream
是用于向文件中写入数据的类。- 它继承自
OutputStream
类,因此可以使用所有OutputStream
提供的方法来写入数据到文件中。 - 你可以通过创建一个
FileOutputStream
对象,并传递文件路径作为参数来打开一个文件以供写入。 - 通常使用
write()
方法将字节数据写入文件。例如,fileOutputStream.write(data)
会将一个字节的数据写入文件。 - 需要注意,在使用完
FileOutputStream
后,应该调用close()
方法关闭流,以确保文件得到保存并释放相关资源。
例2:写入/读取文本内容
3.2FileReader和FileWriter类
FileReader
和 FileWriter
是 Java 中用于读取和写入字符数据的类,它们通常用于处理文本文件。这两个类是字符流,会自动处理字符编码和解码,以确保正确的字符转换。以下是关于它们的更详细信息:
- FileReader:
FileReader
用于从文件中读取字符数据。- 它继承自
InputStreamReader
类,因此可以使用所有Reader
提供的方法来读取字符数据。 - 你可以通过创建一个
FileReader
对象,并传递文件路径作为参数来打开一个文件以供读取。 - 通常使用
read()
方法从文件中逐个字符地读取数据。例如,int data = fileReader.read();
会返回文件中的下一个字符数据。 - 需要注意的是,在使用完
FileReader
后,应该调用close()
方法关闭流,以确保文件句柄和系统资源得到释放。
- FileWriter:
FileWriter
用于向文件中写入字符数据。- 它继承自
OutputStreamWriter
类,因此可以使用所有Writer
提供的方法来写入字符数据到文件中。 - 你可以通过创建一个
FileWriter
对象,并传递文件路径作为参数来打开一个文件以供写入。 - 通常使用
write()
方法将字符数据写入文件。例如,fileWriter.write(data)
会将一个字符的数据写入文件。 - 需要注意的是,在使用完
FileWriter
后,应该调用close()
方法关闭流,以确保文件得到保存并释放相关资源。
例3:字符流读写文本
4.带缓存的输入/输出流
4.1 BufferedInputStream与BufferedOutputStream类
BufferedInputStream
和 BufferedOutputStream
是 Java 中用于提高 I/O 性能的类,它们通过使用内部缓冲区来批量读取和写入数据,从而减少了与底层流的频繁交互。这些类属于字节流,适用于处理二进制数据,如文件、网络连接等。以下是关于它们的更详细信息:
- BufferedInputStream:
BufferedInputStream
用于从输入流中读取数据,并提供了内部缓冲区,可以一次读取多个字节数据。- 你可以通过创建一个
BufferedInputStream
对象,并将其他输入流(如FileInputStream
)作为参数传递给它,以创建一个包装了缓冲功能的输入流。 - 使用
read()
方法来从缓冲区中读取数据,通常一次读取多个字节,然后逐个返回。 BufferedInputStream
对于频繁的小量读取操作特别有用,因为它可以减少与底层流的交互次数,提高读取性能。
- BufferedOutputStream:
BufferedOutputStream
用于向输出流中写入数据,并提供了内部缓冲区,可以一次写入多个字节数据。- 你可以通过创建一个
BufferedOutputStream
对象,并将其他输出流(如FileOutputStream
)作为参数传递给它,以创建一个包装了缓冲功能的输出流。 - 使用
write()
方法来将数据写入缓冲区,通常一次写入多个字节,然后一次性刷新到底层输出流。 BufferedOutputStream
对于频繁的小量写入操作也特别有用,因为它可以减少与底层流的交互次数,提高写入性能。
4.2BufferedReader与BufferedWriter类
BufferedReader
和 BufferedWriter
是 Java 中用于读取和写入字符数据的类,它们提供了缓冲功能,可以一次读取和写入多个字符,从而提高了 I/O 性能。这些类通常用于处理文本数据,如文本文件的读写。以下是关于它们的更详细信息:
- BufferedReader:
BufferedReader
用于从字符输入流中读取数据,并提供了内部缓冲区,可以一次读取多个字符数据。- 你可以通过创建一个
BufferedReader
对象,并将其他字符输入流(如FileReader
或InputStreamReader
)作为参数传递给它,以创建一个包装了缓冲功能的字符输入流。 - 使用
read()
方法来从缓冲区中读取数据,通常一次读取多个字符,然后逐个返回。 BufferedReader
对于频繁的小量读取操作特别有用,因为它可以减少与底层流的交互次数,提高读取性能。另外,它还提供了一些方便的方法用于读取行。
- BufferedWriter:
BufferedWriter
用于向字符输出流中写入数据,并提供了内部缓冲区,可以一次写入多个字符数据。- 你可以通过创建一个
BufferedWriter
对象,并将其他字符输出流(如FileWriter
或OutputStreamWriter
)作为参数传递给它,以创建一个包装了缓冲功能的字符输出流。 - 使用
write()
方法来将数据写入缓冲区,通常一次写入多个字符,然后一次性刷新到底层输出流。 BufferedWriter
对于频繁的小量写入操作也特别有用,因为它可以减少与底层流的交互次数,提高写入性能。另外,它还提供了一些方便的方法用于写入行。
例题4
5数据输入/输出流
数据输入流和数据输出流(DataInputStream 和 DataOutputStream)是 Java 中用于以二进制格式读写基本数据类型的类。它们是字节流,通常用于处理二进制数据,如将整数、浮点数等写入文件并读取它们。
以下是关于数据输入流和数据输出流的更详细信息:
DataInputStream:
DataInputStream
是用于以二进制格式从输入流中读取基本数据类型的类。- 你可以通过创建一个
DataInputStream
对象,并将其他输入流(如FileInputStream
或SocketInputStream
)作为参数传递给它,以创建一个包装了二进制数据读取功能的输入流。 - 使用
readInt()
,readDouble()
,readBoolean()
, 等方法从输入流中读取基本数据类型的数据。 - 通常与
DataOutputStream
配合使用,以确保写入和读取的数据格式一致。
DataOutputStream:
DataOutputStream
用于以二进制格式向输出流中写入基本数据类型的类。- 你可以通过创建一个
DataOutputStream
对象,并将其他输出流(如FileOutputStream
或SocketOutputStream
)作为参数传递给它,以创建一个包装了二进制数据写入功能的输出流。 - 使用
writeInt()
,writeDouble()
,writeBoolean()
, 等方法将基本数据类型的数据写入输出流。 - 通常与
DataInputStream
配合使用,以确保写入和读取的数据格式一致。