一、IO基本概念
IO是Input(输入)和Output(输出)的缩写,主要指在程序运行过程中,进行数据的输入和输出操作。Java的IO流是Java输入输出系统的核心,用于读取和写入数据。通过IO流,程序可以从外部数据源(如文件、网络)读取数据,或将数据写入外部数据源。
二、File文件类介绍
java.io.File
类是Java中用于表示文件或目录路径的类,它提供了操作文件和目录的多种方法。以下是一些常用方法:
exists()
:判断文件或目录是否存在。isDirectory()
:判断是否为目录。isFile()
:判断是否为文件。createNewFile()
:创建一个新文件。mkdir()
:创建一个新目录。delete()
:删除文件或目录。list()
:列出目录下的文件和目录名称。
三、IO流种类及特性
Java的IO流按照流的方向和功能可以分为四大类:
- 字节流(Byte Streams):用于处理字节数据,主要类有
InputStream
和OutputStream
及其子类。FileInputStream
和FileOutputStream
:用于文件的字节输入和输出。BufferedInputStream
和BufferedOutputStream
:提供缓冲功能,提高读写效率。
- 字符流(Character Streams):用于处理字符数据,主要类有
Reader
和Writer
及其子类。FileReader
和FileWriter
:用于文件的字符输入和输出。BufferedReader
和BufferedWriter
:提供缓冲功能,提高读写效率,并提供按行读取功能。
- 数据流(Data Streams):用于读写基本数据类型的数据,主要类有
DataInputStream
和DataOutputStream
。- 可以读写Java的基本数据类型,如
int
、float
、double
等。
- 可以读写Java的基本数据类型,如
- 对象流(Object Streams):用于读写Java对象,主要类有
ObjectInputStream
和ObjectOutputStream
。- 可以实现对象的序列化和反序列化,即将对象转换为字节流,以便存储或传输。
四、IO流中的路径分隔符
在Java中,文件路径的分隔符因操作系统而异:
- Windows系统使用反斜杠(
\\
)。 - Unix/Linux系统使用正斜杠(
/
)。
为了编写跨平台的代码,Java提供了File.separator
来获取系统的默认路径分隔符。此外,File
类还提供了File.separatorChar
和File.pathSeparator
等常量。
五、面试集合知识点汇总及解答
- IO流的分类及特性:
- 字节流和字符流的区别?
- 字节流处理的是字节(8位),可以处理任何类型的数据(如图片、视频)。
- 字符流处理的是字符(16位),专门用于处理文本数据,自动处理字符编码问题。
- 字节流和字符流的区别?
- 缓冲流的作用:
- 提高IO操作的效率,减少读写次数。
- 对象流如何实现对象的序列化和反序列化:
- 通过实现
Serializable
接口,将对象转换为字节流存储或传输。
- 通过实现
- 常见的IO异常及其处理:
FileNotFoundException
:文件未找到。IOException
:输入输出过程中的异常。
六、各类IO流的实际应用场景举例
- 文件拷贝:
import java.io.*;
public class FileCopy {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("source.txt");
FileOutputStream fos = new FileOutputStream("destination.txt");
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
fos.write(buffer, 0, length);
}
fis.close();
fos.close();
}
}
2.文件拷贝:
import java.io.*;
public class ReadFileByLine {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
}
3.对象的序列化和反序列化:
import java.io.*;
public class SerializeDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
oos.writeObject(new Person("John", 30));
oos.close();
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"));
Person person = (Person) ois.readObject();
ois.close();
System.out.println(person);
}
}
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}