概念
对文件内容进行读写操作。
Java的IO流通常是基于InputStream、OutputStream、Reader和Writer这四个抽象类实现的。具体的IO流类包括FileInputStream、FileOutputStream、BufferedInputStream等。在使用Java的IO流时,需要注意的是要适时关闭IO流以释放资源。
Java的IO流是Java程序与外部世界之间进行数据交换的重要方式,也是开发Java应用程序时常用的工具之一。掌握Java的IO流相关知识,对于编写高效、灵活、可扩展的Java程序来说是非常重要的。
分类
(1)根据流的方向:
输入流: 程序可以从中读取数据的流
输出流: 程序能向其中写入数据的流
(2)根据流的单位:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
(3)根据功能
节点流: 直接和文件进行交互
处理流: 不是直接作用在文件上
IO流类和接口
InputStream和OutputStream:InputStream和OutputStream是字节流的基本接口。InputStream用于从输入流中读取数据,OutputStream用于将数据写入输出流中。它们都是抽象类,提供了许多方法来读取和写入数据。常用的子类包括FileInputStream、FileOutputStream、ByteArrayInputStream等。
Reader和Writer:Reader和Writer是字符流的基本接口。Reader用于从输入流中读取字符数据,Writer用于将字符数据写入输出流中。它们也都是抽象类,提供了许多方法来读取和写入字符数据。常用的子类包括FileReader、FileWriter、BufferedReader等。
DataInput和DataOutput:DataInput和DataOutput是数据流的基本接口。DataInput用于从数据流中读取基本数据类型和字符串,DataOutput用于将基本数据类型和字符串写入数据流中。常用的子类包括DataInputStream和DataOutputStream等。
import java.io;
public class SimpleIOExample {
public static void main(String[] args) throws IOException {
FileWriter writer = new FileWriter("output.txt");
writer.write("Hello, World!");
writer.close();
FileReader reader = new FileReader("output.txt");
BufferedReader bufferedReader = new BufferedReader(reader);
String line = bufferedReader.readLine();
System.out.println(line);
reader.close();
}
}
IO流缓冲
IO流缓冲指的是在使用IO流进行读写操作时,将数据先缓存在内存中,以减少与磁盘的交互次数,提高数据的读写效率的一种机制。缓冲区是一个临时存储区,它可以暂时存储数据,以便于读取和写入数据。
Java提供了一些缓冲流类,它们在基本的输入/输出类之上提供了缓冲的功能。例如,BufferedReader和BufferedWriter类提供了对字符流的缓冲支持,而BufferedInputStream和BufferedOutputStream类提供了对字节流的缓冲支持。
缓冲流的好处:它们可以提高IO操作的效率。由于磁盘操作通常是一个非常耗时的过程,缓冲流可以将多个读/写操作组合在一起,然后一次性将它们提交给磁盘进行处理,从而减少了磁盘访问的次数,提高了IO操作的效率。
数据流
数据流是指在程序中通过IO流读取或写入的数据在内存中的格式化形式。与传统的文本流不同,数据流可以处理二进制数据,包括整数、浮点数、字符、字节数组等等,且保持数据的二进制形式,不进行编码转换。
在Java中,数据流有两个主要的类:DataInputStream和DataOutputStream。DataInputStream类提供了从底层输入流中读取基本Java数据类型的方法,而DataOutputStream类提供了向底层输出流中写入基本Java数据类型的方法。
使用数据流的好处在于可以实现跨平台的数据交换。由于Java中的数据类型是固定长度的,并且数据流在读取和写入数据时使用的是Java虚拟机规定的固定字节序,因此通过数据流读写的数据在不同的操作系统和编程语言之间都可以被正确地解析和处理。
import java.io.*;
public class DataStreamExample {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("data.bin");
DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
dataOutputStream.writeInt(123);
dataOutputStream.writeDouble(3.14159);
dataOutputStream.writeUTF("Hello, World!");
dataOutputStream.close();
FileInputStream fileInputStream = new FileInputStream("data.bin");
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
int intValue = dataInputStream.readInt();
double doubleValue = dataInputStream.readDouble();
String stringValue = dataInputStream.readUTF();
dataInputStream.close();
System.out.println(intValue);
System.out.println(doubleValue);
System.out.println(stringValue);
}
}
文件操作
文件操作是指程序中对文件的读取、写入、创建、删除、重命名等操作。在Java中,文件操作需要使用到IO流和文件类(File类)。
文件类是Java中用于表示文件和目录的抽象类,它提供了许多方法来操作文件和目录,如创建、删除、重命名等。下面是一些常用的文件类方法:
File(String pathname)
:根据指定的路径名创建一个File对象。boolean exists()
:判断文件或目录是否存在。boolean isFile()
:判断当前File对象是否代表一个文件。
除了文件类外,Java还提供了一些常用的IO流,用于读取和写入文件。常见的IO流有FileInputStream、FileOutputStream等。其中,FileInputStream和FileOutputStream用于读写文件的字节流,而BufferedInputStream和BufferedOutputStream则是在读写字节流的基础上增加了缓冲功能,能够提高读写文件的效率。
import java.io.*;
public class FileExample {
public static void main(String[] args) throws IOException {
// 创建FileOutputStream对象写入数据
FileOutputStream fileOutputStream = new FileOutputStream("data.txt");
String str = "Hello, World!";
fileOutputStream.write(str.getBytes());
fileOutputStream.close();
// 创建FileInputStream对象读取数据
FileInputStream fileInputStream = new FileInputStream("data.txt");
byte[] bytes = new byte[1024];
int len = fileInputStream.read(bytes);
String result = new String(bytes, 0, len);
fileInputStream.close();
System.out.println(result);
}
}
异常
在Java中,IO流操作也可能会出现异常情况,例如文件不存在、文件读写权限不足、磁盘已满等。为了处理这些异常情况,Java中提供了一些IO流相关的异常类,如IOException、FileNotFoundException、EOFException等。
其中,IOException是所有IO异常的基类,其子类包括了许多常见的IO异常,如文件不存在、文件读写权限不足等。FileNotFoundException是IOException的子类,表示文件不存在异常。EOFException是IOException的子类,表示已到达文件末尾异常。
当我们使用IO流进行读写操作时,需要进行异常处理,以保证程序的健壮性。常用的异常处理方式有try-catch语句和throws语句。
import java.io.*;
public class FileExample {
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new FileInputStream("data.txt");
byte[] bytes = new byte[1024];
int len = fileInputStream.read(bytes);
String result = new String(bytes, 0, len);
fileInputStream.close();
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
}
}
补充:
1.转换流:
作用:将字节流与字符流进行转换;
(1)InputStreamReader:字节输入流转换为字符输入流;
(2)OutputStreamWriter:字符输入流转化为字节输入流。
2.对象流:
ObjectInputStream,用于储存和读取基本数据类型或对象的处理流。
可以写入,可以还原。
ObjectOutStream把自定义对象转化成字节序列的形式表示,包含对象的数据和信息,一个序列化的对象可以被写入数据库或文件中,也可以用于网络传输;ObjectInputStream可以把序列后的字节序列恢复成原来的Java对象,是反序列化。
以及Java对象可序列化的条件:(1)实现接口,(2)当前类提供一个全局变量,(3)属性的可序列化。