一、Java输入输出流
-
字节流和字符流:
- Java的输入输出流可以分为字节流和字符流两种类型。字节流以字节为单位读写数据,而字符流以字符为单位读写数据,字符流比字节流多了字符编码的处理,方便处理文本数据。
InputStream
和OutputStream
是所有字节输入输出流的父类。Reader
和Writer
是所有字符输入输出流的父类。
-
文件输入输出流:
FileInputStream
和FileOutputStream
用于读取和写入文件的字节流。FileReader
和FileWriter
用于读取和写入文件的字符流。
-
缓冲输入输出流:
BufferedInputStream
和BufferedOutputStream
提供了缓冲区功能,可以提高读写文件的性能。BufferedReader
和BufferedWriter
也提供了缓冲区功能,用于提高读写字符数据的性能。
-
对象输入输出流:
ObjectInputStream
和ObjectOutputStream
用于读写对象的序列化数据,可以将对象保存到文件中或从文件中读取对象。
-
标准输入输出流:
System.in
是标准输入流,用于从控制台读取用户输入。System.out
和System.err
是标准输出流,用于向控制台输出信息。
-
网络输入输出流:
Socket
类提供了基于TCP协议的网络通信,可以使用getInputStream()
和getOutputStream()
方法获取输入输出流。ServerSocket
类用于创建服务器,接受客户端连接,并获取客户端的输入输出流。
示例代码:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 文件输入输出流示例
FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt");
// 缓冲输入输出流示例
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 标准输入输出流示例
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
// 读取文件内容并写入到另一个文件中
int data;
while ((data = bis.read()) != -1) {
bos.write(data);
}
// 从标准输入读取内容并输出到标准输出
String input;
while ((input = reader.readLine()) != null) {
writer.write(input);
writer.newLine();
writer.flush();
}
// 关闭流
fis.close();
fos.close();
bis.close();
bos.close();
reader.close();
writer.close();
}
}
在示例代码中,展示了如何使用不同类型的输入输出流进行文件操作、标准输入输出操作以及缓冲操作。在实际编程中,根据需求选择合适的输入输出流类型,并注意及时关闭流以释放资源。
二、文件操作
1. 使用 File 类操作文件和目录
Java 中的 java.io.File
类提供了操作文件和目录的基本方法。可以使用 File 类来:
- 创建文件或目录
- 删除文件或目录
- 重命名文件或目录
- 检查文件或目录的属性,如是否存在、是否是文件、是否是目录等
示例代码:
import java.io.File;
public class FileExample {
public static void main(String[] args) {
// 创建文件对象
File file = new File("example.txt");
// 检查文件是否存在
if (file.exists()) {
System.out.println("File exists");
} else {
System.out.println("File does not exist");
}
// 创建新文件
try {
if (file.createNewFile()) {
System.out.println("File created successfully");
} else {
System.out.println("File already exists");
}
} catch (Exception e) {
e.printStackTrace();
}
// 重命名文件
File newFile = new File("new_example.txt");
if (file.renameTo(newFile)) {
System.out.println("File renamed successfully");
} else {
System.out.println("File rename failed");
}
// 删除文件
if (newFile.delete()) {
System.out.println("File deleted successfully");
} else {
System.out.println("File deletion failed");
}
}
}
2. 使用字节流和字符流进行文件读写操作
Java 提供了字节流和字符流两种类型来进行文件读写操作。
- 字节流用于处理二进制文件,如图片、视频等
- 字符流用于处理文本文件,以字符为单位进行读写
常见的字节流类有 FileInputStream
和 FileOutputStream
,常见的字符流类有 FileReader
和 FileWriter
。
示例代码:
import java.io.*;
public class FileReadWriteExample {
public static void main(String[] args) {
try {
// 写入文件
FileWriter writer = new FileWriter("example.txt");
writer.write("Hello, World!");
writer.close();
// 读取文件
FileReader reader = new FileReader("example.txt");
int character;
while ((character = reader.read()) != -1) {
System.out.print((char) character);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 使用缓冲流提高性能
Java 提供了缓冲流来提高文件读写的性能,常见的缓冲流有 BufferedInputStream
和 BufferedOutputStream
用于字节流,以及 BufferedReader
和 BufferedWriter
用于字符流。
示例代码:
import java.io.*;
public class BufferedFileReadWriteExample {
public static void main(String[] args) {
try {
// 写入文件
BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"));
writer.write("Hello, World!");
writer.close();
// 读取文件
BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 序列化与反序列化
Java 提供了对象的序列化和反序列化机制,可以将对象转换为字节流进行保存,或者从字节流中恢复为对象。
- 序列化:将对象转换为字节序列以便保存到文件或网络传输
- 反序列化:从字节序列中恢复对象
示例代码:
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
try {
// 序列化对象
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.ser"));
Person person = new Person("John", 30);
outputStream.writeObject(person);
outputStream.close();
// 反序列化对象
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.ser"));
Person deserializedPerson = (Person) inputStream.readObject();
System.out.println(deserializedPerson.getName() + ", " + deserializedPerson.getAge());
inputStream.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}