1. 引言
在Java开发中,IO(Input/Output)流是处理输入输出操作的核心机制。IO流提供了丰富的API,用于读取和写入数据,支持多种数据类型和操作方式。本文将通过几个具体的案例,详细介绍Java IO流的使用方法和应用场景。
2. Java IO流概述
Java IO流主要分为两大类:字节流和字符流。字节流用于处理二进制数据,字符流用于处理文本数据。每种流又分为输入流和输出流,分别用于读取和写入数据。
2.1 字节流
-
InputStream:字节输入流,用于读取二进制数据。
-
OutputStream:字节输出流,用于写入二进制数据。
2.2 字符流
-
Reader:字符输入流,用于读取文本数据。
-
Writer:字符输出流,用于写入文本数据。
3. 常用IO流类
3.1 文件操作
-
FileInputStream:用于从文件中读取字节数据。
-
FileOutputStream:用于向文件中写入字节数据。
-
FileReader:用于从文件中读取字符数据。
-
FileWriter:用于向文件中写入字符数据。
3.2 缓冲流
-
BufferedInputStream:带缓冲的字节输入流,提高读取效率。
-
BufferedOutputStream:带缓冲的字节输出流,提高写入效率。
-
BufferedReader:带缓冲的字符输入流,提高读取效率。
-
BufferedWriter:带缓冲的字符输出流,提高写入效率。
3.3 数据流
-
DataInputStream:用于读取基本数据类型的数据。
-
DataOutputStream:用于写入基本数据类型的数据。
3.4 对象流
-
ObjectInputStream:用于读取对象。
-
ObjectOutputStream:用于写入对象。
4. 使用案例
4.1 文件读写操作
4.1.1 读取文件内容
java复制
import java.io.FileInputStream;
import java.io.IOException;
public class FileReadExample {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("example.txt");
int content;
while ((content = fis.read()) != -1) {
System.out.print((char) content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.1.2 写入文件内容
java复制
import java.io.FileOutputStream;
import java.io.IOException;
public class FileWriteExample {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("example.txt");
String content = "Hello, World!";
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.2 缓冲流的使用
4.2.1 缓冲输入流
java复制
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferedInputStreamExample {
public static void main(String[] args) {
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream("example.txt"));
int content;
while ((content = bis.read()) != -1) {
System.out.print((char) content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.2.2 缓冲输出流
java复制
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedOutputStreamExample {
public static void main(String[] args) {
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream("example.txt"));
String content = "Hello, World!";
bos.write(content.getBytes());
bos.flush(); // 确保数据写入文件
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.3 数据流的使用
4.3.1 读取基本数据类型
java复制
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class DataInputStreamExample {
public static void main(String[] args) {
DataInputStream dis = null;
try {
dis = new DataInputStream(new FileInputStream("data.dat"));
int i = dis.readInt();
double d = dis.readDouble();
String s = dis.readUTF();
System.out.println("Int: " + i);
System.out.println("Double: " + d);
System.out.println("String: " + s);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.3.2 写入基本数据类型
java复制
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataOutputStreamExample {
public static void main(String[] args) {
DataOutputStream dos = null;
try {
dos = new DataOutputStream(new FileOutputStream("data.dat"));
dos.writeInt(123);
dos.writeDouble(98.6);
dos.writeUTF("Hello, World!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.4 对象流的使用
4.4.1 序列化对象
java复制
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.IOException;
class Person implements Serializable {
private static final long serialVersionUID = 1L;
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 ObjectOutputStreamExample {
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("person.ser"));
Person person = new Person("Alice", 30);
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.4.2 反序列化对象
java复制
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
public class ObjectInputStreamExample {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream("person.ser"));
Person person = (Person) ois.readObject();
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.5 综合案例:文件复制
4.5.1 使用字节流复制文件
java复制
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyExample {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("source.txt");
fos = new FileOutputStream("destination.txt");
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
fos.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.5.2 使用字符流复制文件
java复制
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileCopyCharExample {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("source.txt");
fw = new FileWriter("destination.txt");
char[] buffer = new char[1024];
int length;
while ((length = fr.read(buffer)) != -1) {
fw.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
5. 注意事项和最佳实践
5.1 关闭流资源
在使用IO流时,务必在操作完成后关闭流资源,以释放系统资源。可以使用try-with-resources语句自动关闭资源:
java复制
try (FileInputStream fis = new FileInputStream("example.txt")) {
// 使用fis进行操作
} catch (IOException e) {
e.printStackTrace();
}
5.2 异常处理
在进行IO操作时,可能会抛出IOException异常。需要合理地捕获和处理异常,避免程序崩溃。可以使用try-catch语句块进行异常处理:
java复制
try {
// IO操作
} catch (IOException e) {
e.printStackTrace();
}
5.3 缓冲流的使用
对于频繁的读写操作,建议使用缓冲流(如BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter),以提高IO操作的效率。
5.4 选择合适的流类型
根据实际需求选择合适的流类型。如果处理二进制数据,使用字节流;如果处理文本数据,使用字符流。同时,根据操作方式选择输入流或输出流。
6. 总结
Java IO流是处理输入输出操作的重要工具,提供了丰富的API和灵活的操作方式。通过合理使用IO流,可以高效地进行文件读写、数据传输等操作。在实际开发中,要注意关闭流资源、处理异常、使用缓冲流等最佳实践,以确保程序的稳定性和性能。
标签:Java,io,java,try,IOException,IO,import,catch,概述 From: https://blog.csdn.net/m0_37649480/article/details/145138312