Java IO(Input/Output)是Java编程语言中用于处理输入输出的机制。IO包含了读取和写入数据的功能,可以实现文件的读写、网络通信、和各种设备的输入输出操作。在Java中,IO操作主要由输入流(Input Stream)和输出流(Output Stream)两个类别来完成。
Java IO包含了许多类和接口,为了更好地理解和使用Java IO,我们将逐一介绍它们,并附上相关的案例讲解。
- InputStream(输入流) InputStream是抽象类,用于从数据源(如文件或网络)读取字节。常用的子类有FileInputStream和ByteArrayInputStream。
案例:读取文件内容
import java.io.FileInputStream;
import java.io.IOException;
public class ReadFileExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("file.txt")) {
int ch;
while ((ch = fis.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. OutputStream(输出流) OutputStream也是抽象类,用于向数据目标(如文件或网络)写入字节。常用的子类有FileOutputStream和ByteArrayOutputStream。
案例:写入文件内容
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteFileExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("file.txt")) {
String content = "Hello, World!";
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. Reader(读取字符) Reader是用于读取字符的抽象类。与InputStream类似,Reader也有多个子类用于不同的字符输入源。
案例:读取文件内容
import java.io.FileReader;
import java.io.IOException;
public class ReadFileExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("file.txt")) {
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. Writer(写入字符) Writer是用于写入字符的抽象类。与OutputStream类似,Writer也有多个子类用于不同的字符输出目标。
案例:写入文件内容
import java.io.FileWriter;
import java.io.IOException;
public class WriteFileExample {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("file.txt")) {
String content = "Hello, World!";
fw.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
5. InputStream/OutputStream与Reader/Writer的转换 Java提供了InputStreamReader和OutputStreamWriter两个类,用于将字节流转换为字符流,或将字符流转换为字节流。这在处理包含非ASCII字符的文本时很有用。
案例:将文件内容从ISO-8859-1编码转换为UTF-8编码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
public class ConvertEncodingExample {
public static void main(String[] args) {
try (InputStreamReader isr = new InputStreamReader(new FileInputStream("input.txt"), "ISO-8859-1");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), StandardCharsets.UTF_8)) {
int ch;
while ((ch = isr.read()) != -1) {
osw.write(ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
6. BufferedInputStream/BufferedOutputStream与BufferedReader/BufferedWriter Java提供了BufferedInputStream和BufferedOutputStream两个类,用于提高字节流的读写效率。类似地,BufferedReader和BufferedWriter用于提高字符流的读写效率。
案例:使用BufferedInputStream读取文件内容
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadFileExample {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt"))) {
int ch;
while ((ch = bis.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
7. ByteArrayInputStream/ByteArrayOutputStream ByteArrayInputStream和ByteArrayOutputStream是用于处理字节数组的流类。它们不需要实际的数据源或目标,而是将字节数组作为输入和输出。
案例:使用ByteArrayInputStream读取字节数组
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class ReadByteArrayExample {
public static void main(String[] args) {
byte[] data = {72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33};
try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) {
int ch;
while ((ch = bais.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
8. PipedInputStream/PipedOutputStream PipedInputStream和PipedOutputStream是用于实现线程之间管道通信的流类。一个线程可以将数据写入PipedOutputStream,另一个线程可以从PipedInputStream中读取数据。
案例:使用PipedInputStream和PipedOutputStream实现线程间通信
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipeExample {
public static void main(String[] args) {
try {
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
Thread thread1 = new Thread(() -> {
try {
String message = "Hello, World!";
pos.write(message.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
pos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
try {
int ch;
while ((ch = pis.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
pis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread1.start();
thread2.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上是Java IO的基本使用和常见类的介绍及案例讲解,希望对你深入了解Java IO有所帮助。