在Java中,I/O(输入/输出)流是用于处理输入和输出的机制。I/O流提供了从源(如文件、网络连接、内存等)读取数据或将数据写入目标的方式。Java的I/O流分为字节流和字符流两大类,每类又有输入流和输出流之分。下面我们将详细讲解Java中的I/O流,并通过示例代码来帮助大家更好地理解。
1. 字节流(Byte Stream)
字节流用于处理原始的二进制数据,每次读取或写入一个字节(8位)。字节流主要包括 InputStream
和 OutputStream
及其子类。
1.1 InputStream
InputStream
是所有字节输入流的抽象基类,常见的子类包括 FileInputStream
、ByteArrayInputStream
等。
示例代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamExample {
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("example.txt")) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用 FileInputStream
从文件中读取字节数据,并将其转换为字符输出。
1.2 OutputStream
OutputStream
是所有字节输出流的抽象基类,常见的子类包括 FileOutputStream
、ByteArrayOutputStream
等。
示例代码:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutputStreamExample {
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("example.txt")) {
String text = "Hello, World!";
byte[] bytes = text.getBytes();
outputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用 FileOutputStream
将字符串数据写入文件。
2. 字符流(Character Stream)
字符流用于处理文本数据,每次读取或写入一个字符(16位)。字符流主要包括 Reader
和 Writer
及其子类。
2.1 Reader
Reader
是所有字符输入流的抽象基类,常见的子类包括 FileReader
、BufferedReader
等。
示例代码:
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReaderExample {
public static void main(String[] args) {
try (Reader reader = new FileReader("example.txt")) {
int data;
while ((data = reader.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用 FileReader
从文件中读取字符数据并输出。
2.2 Writer
Writer
是所有字符输出流的抽象基类,常见的子类包括 FileWriter
、BufferedWriter
等。
示例代码:
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterExample {
public static void main(String[] args) {
try (Writer writer = new FileWriter("example.txt")) {
String text = "Hello, World!";
writer.write(text);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用 FileWriter
将字符串数据写入文件。
3. 缓冲流(Buffered Stream)
为了提高I/O操作的效率,Java提供了缓冲流。缓冲流在读取或写入数据时,会先将数据缓存到内存中,然后再一次性读取或写入,从而减少I/O操作的次数。
3.1 BufferedInputStream 和 BufferedOutputStream
示例代码:
import java.io.*;
public class BufferedStreamExample {
public static void main(String[] args) {
try (InputStream inputStream = new BufferedInputStream(new FileInputStream("example.txt"));
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream("copy.txt"))) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用 BufferedInputStream
和 BufferedOutputStream
来读取和写入文件,从而提高I/O操作的效率。
3.2 BufferedReader 和 BufferedWriter
示例代码:
import java.io.*;
public class BufferedWriterExample {
public static void main(String[] args) {
try (Reader reader = new BufferedReader(new FileReader("example.txt"));
Writer writer = new BufferedWriter(new FileWriter("copy.txt"))) {
char[] buffer = new char[1024];
int charsRead;
while ((charsRead = reader.read(buffer)) != -1) {
writer.write(buffer, 0, charsRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用 BufferedReader
和 BufferedWriter
来读取和写入文件,从而提高I/O操作的效率。
4. 数据流(Data Stream)
数据流用于读取和写入基本数据类型和字符串。数据流主要包括 DataInputStream
和 DataOutputStream
。
示例代码:
import java.io.*;
public class DataStreamExample {
public static void main(String[] args) {
try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("data.txt"));
DataInputStream dataInputStream = new DataInputStream(new FileInputStream("data.txt"))) {
dataOutputStream.writeInt(123);
dataOutputStream.writeDouble(123.456);
dataOutputStream.writeUTF("Hello, World!");
int intValue = dataInputStream.readInt();
double doubleValue = dataInputStream.readDouble();
String stringValue = dataInputStream.readUTF();
System.out.println("Int: " + intValue);
System.out.println("Double: " + doubleValue);
System.out.println("String: " + stringValue);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用 DataOutputStream
将基本数据类型和字符串写入文件,并使用 DataInputStream
读取这些数据。
总结
- 字节流:用于处理原始的二进制数据,包括
InputStream
和OutputStream
。 - 字符流:用于处理文本数据,包括
Reader
和Writer
。 - 缓冲流:提高I/O操作的效率,包括
BufferedInputStream
、BufferedOutputStream
、BufferedReader
和BufferedWriter
。 - 数据流:用于读取和写入基本数据类型和字符串,包括
DataInputStream
和DataOutputStream
。
通过以上详细的概念解释和编程示例,相信大家已经对Java中的I/O流有了更深入的理解。在实际编程中,根据具体需求选择合适的I/O流,可以提高程序的性能和可维护性。