Java 输入输出(IO)系统提供了一套丰富的类和接口,用于处理文件读写、网络通信、数据序列化等各种数据操作。
IO 操作在任何编程语言中都扮演着重要角色,而 Java 的 IO 系统以其强大的灵活性和扩展性,成为开发者进行数据操作的得力工具。
1. 基本概念
1.1 流(Stream)
流是一个抽象概念,表示数据的有序集合。流分为输入流和输出流:
- 输入流:从数据源(如文件、网络连接)读取数据。
- 输出流:向数据目标(如文件、网络连接)写入数据。
Java 中的流大致分为以下几种类型:
- 字节流(Byte Streams):用于处理原始的字节数据,常用于二进制文件。
- 字符流(Character Streams):用于处理字符数据,适合处理文本文件。
- 缓冲流(Buffered Streams):提供缓冲机制,提高 IO 操作效率。
- 数据流(Data Streams):用于读写 Java 原始数据类型。
- 对象流(Object Streams):用于对象序列化和反序列化。
1.2 字节流
字节流类主要包括 InputStream 和 OutputStream,它们是所有字节流类的基类。
- InputStream:所有字节输入流的超类,常用的子类有 FileInputStream、BufferedInputStream 等。
- OutputStream:所有字节输出流的超类,常用的子类有 FileOutputStream、BufferedOutputStream 等。
1.3 字符流
字符流类主要包括 Reader 和 Writer,它们是所有字符流类的基类。
- Reader:所有字符输入流的超类,常用的子类有 FileReader、BufferedReader 等。
- Writer:所有字符输出流的超类,常用的子类有 FileWriter、BufferedWriter 等。
2. 文件读写
2.1 字节流文件读写
文件读写是最基本的 IO 操作,下面是使用字节流进行文件读写的示例:
文件读取:
import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamReadExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
文件写入:
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamWriteExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("example.txt")) {
String content = "Hello, World!";
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.2 字符流文件读写
字符流处理的是字符数据,更适合用于文本文件的读写。
文件读取:
import java.io.FileReader;
import java.io.IOException;
public class CharStreamReadExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("example.txt")) {
int data;
while ((data = fr.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
文件写入:
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamWriteExample {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("example.txt")) {
String content = "Hello, World!";
fw.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 缓冲流
缓冲流通过增加缓冲区来提高 IO 操作的效率。缓冲区可以减少对底层操作系统的访问频率,从而提升性能。
缓冲字节流:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferedByteStreamReadExample {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("example.txt"))) {
int data;
while ((data = bis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲字符流:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedCharStreamReadExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 数据流
数据流用于读写 Java 的基本数据类型(如 int、double、boolean)和字符串,适合进行数据的存储和传输。
数据输出流:
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataStreamWriteExample {
public static void main(String[] args) {
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) {
dos.writeInt(123);
dos.writeDouble(45.67);
dos.writeBoolean(true);
} catch (IOException e) {
e.printStackTrace();
}
}
}
数据输入流:
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class DataStreamReadExample {
public static void main(String[] args) {
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.dat"))) {
int intValue = dis.readInt();
double doubleValue = dis.readDouble();
boolean booleanValue = dis.readBoolean();
System.out.println("Integer: " + intValue);
System.out.println("Double: " + doubleValue);
System.out.println("Boolean: " + booleanValue);
} catch (IOException e) {
e.printStackTrace();
}
}
}
5. 对象流
对象流用于对象的序列化和反序列化。序列化是指将对象的状态转换为字节流,以便保存到文件或通过网络传输;反序列化是将字节流恢复为对象。
对象序列化:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
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 + "}";
}
}
public class ObjectStreamWriteExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
}
}
对象反序列化:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ObjectStreamReadExample {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
Person person = (Person) ois.readObject();
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
6. 其他 IO 操作
6.1 文件复制
文件复制是常见的 IO 操作,使用缓冲流可以提高效率。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyExample {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("destination.txt"))) {
byte[] buffer = new byte[1024];
int length;
while ((length = bis.read(buffer)) != -1) {
bos.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.2 读取文件行数
使用 BufferedReader 可以方便地逐行读取文件内容。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class LineCountExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
int lineCount = 0;
while (br.readLine() != null) {
lineCount++;
}
System.out.println("Total lines: " + lineCount);
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.3 查找文件中的某个单词
可以结合 BufferedReader 和 String 的 contains 方法实现简单的文本搜索。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class WordSearchExample {
public static void main(String[] args) {
String searchWord = "Java";
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
String line;
int lineNumber = 0;
while ((line = br.readLine()) != null) {
lineNumber++;
if (line.contains(searchWord)) {
System.out.println("Found " + searchWord + " at line " + lineNumber);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java 的 IO 系统通过提供丰富的类和接口,使得开发者可以方便地进行各种数据操作。字节流适用于处理二进制数据,字符流适用于处理文本数据,缓冲流提高了 IO 操作的效率,数据流便于处理基本数据类型,对象流支持对象的序列化和反序列化。此外,Java IO 还提供了许多实用的方法和工具类,简化了文件操作、数据传输等任务。
黑马程序员免费预约咨询