Java IO(Input/Output)流是Java语言中用于处理输入输出操作的重要部分。这些流可以是文件、网络连接、内存块等。Java IO流主要分为字节流和字符流,它们各自具有不同的用途和特性。
一、字节流
字节流主要用于处理二进制数据,如图像、音频、视频等。Java提供了两个基本的字节流类:InputStream和OutputStream。
- InputStream:这是所有字节输入流的超类。主要的子类有FileInputStream、BufferedInputStream等。
- OutputStream:这是所有字节输出流的超类。主要的子类有FileOutputStream、BufferedOutputStream等。
下面是一个简单的使用字节流读写文件的例子:
java
java复制代码
import java.io.*;
public class ByteStreamExample {
public static void main(String[] args) {
File file = new File("example.txt");
try (FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream("output.txt")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们创建了一个FileInputStream来读取"example.txt"文件,然后创建了一个FileOutputStream来写入"output.txt"文件。我们通过一个字节数组作为缓冲区,从输入流中读取数据,然后写入到输出流中。
二、字符流
字符流主要用于处理文本数据。Java提供了两个基本的字符流类:Reader和Writer。
- Reader:这是所有字符输入流的超类。主要的子类有FileReader、BufferedReader等。
- Writer:这是所有字符输出流的超类。主要的子类有FileWriter、BufferedWriter等。
下面是一个简单的使用字符流读写文件的例子:
java
java复制代码
import java.io.*;
public class CharStreamExample {
public static void main(String[] args) {
File file = new File("example.txt");
try (FileReader fr = new FileReader(file);
FileWriter fw = new FileWriter("output.txt")) {
char[] buffer = new char[1024];
int charsRead;
while ((charsRead = fr.read(buffer)) != -1) {
fw.write(buffer, 0, charsRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们创建了一个FileReader来读取"example.txt"文件,然后创建了一个FileWriter来写入"output.txt"文件。我们通过一个字符数组作为缓冲区,从输入流中读取数据,然后写入到输出流中。
三、缓冲流
为了提高IO操作的效率,Java提供了缓冲流。缓冲流会将数据先读入到缓冲区中,然后再从缓冲区中读取或写入数据。这可以减少IO操作的次数,提高性能。
Java提供了BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter等类来实现缓冲流。
在上面的例子中,我们已经使用了缓冲流。通过try-with-resources语句,我们可以自动关闭流,这可以避免资源泄露的问题。
总的来说,Java IO流提供了一种灵活且强大的方式来处理输入输出操作。通过理解和使用这些流,我们可以更好地处理文件、网络数据等。四、转换流
转换流主要用于在字节流和字符流之间进行转换。Java提供了两个主要的转换流类:InputStreamReader和OutputStreamWriter。
- InputStreamReader:这是一个桥接器,将字节流转换为字符流。它读取字节,并使用指定的字符集将其解码为字符。
- OutputStreamWriter:这也是一个桥接器,将字符流转换为字节流。它接收字符,并使用指定的字符集将其编码为字节。
以下是一个使用转换流的示例:
java
import java.io.*;
public class ConversionStreamExample {
public static void main(String[] args) {
File file = new File("example.txt");
try (FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
FileWriter fw = new FileWriter("output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fw, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw)) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 写入换行符
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们使用InputStreamReader
将FileInputStream
转换为BufferedReader
,以便按行读取文本文件。同样,我们使用OutputStreamWriter
将FileWriter
转换为BufferedWriter
,以便按行写入文本到文件中。我们指定了字符集为"UTF-8"以确保正确处理所有字符。
五、数据流
数据流(Data Streams)用于处理基本数据类型。Java提供了DataInputStream
和DataOutputStream
类来读取和写入基本数据类型。
java
import java.io.*;
public class DataStreamExample {
public static void main(String[] args) {
File file = new File("data.bin");
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
DataInputStream dis = new DataInputStream(new FileInputStream(file))) {
// 写入数据
dos.writeInt(123);
dos.writeDouble(3.14);
dos.writeUTF("Hello, Java IO!");
// 读取数据
int value = dis.readInt();
double pi = dis.readDouble();
String message = dis.readUTF();
System.out.println("Value: " + value);
System.out.println("Pi: " + pi);
System.out.println("Message: " + message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们创建了一个DataOutputStream
来写入基本数据类型的值到二进制文件,然后创建了一个DataInputStream
来从该文件中读取这些值。DataStreams
特别适用于将复杂的数据结构序列化为二进制格式,并随后进行反序列化。
六、对象流
对象流(Object Streams)允许我们直接写入和读取对象。Java提供了ObjectOutputStream
和ObjectInputStream
类来实现对象序列化与反序列化。
java
import java.io.*;
public class ObjectStreamExample {
public static void main(String[] args) {
File file = new File("object.dat");
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
// 写入对象
String str = "Hello, Java IO!";
oos.writeObject(str);
// 读取对象
Object obj = ois.readObject();
if (obj instanceof String) {
String readStr = (String) obj;
System.out.println("Read String: " + readStr);
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们创建了一个ObjectOutputStream
来写入一个字符串对象到文件,然后创建了一个ObjectInputStream
来从该文件中读取这个对象。注意,为了成功读取对象,被读取的对象必须实现Serializable
接口,这是因为对象序列化要求对象可以被转换为字节流。
总结:
Java IO流是Java编程中处理输入输出操作的重要工具。通过理解不同流类型的特性和用途,我们可以根据需要选择合适的流来处理文件、网络数据等。