目录
Java I/O简介
Java中的I/O(Input/Output)指的是将数据从一个地方传输到另一个地方的过程。在Java中,数据可以来自各种来源,例如网络、文件和用户输入等。I/O是Java应用程序开发的重要部分,可以让我们读取和写入文件、从网络上下载数据等。
Java I/O分类
Java I/O主要分为两类:
字节流和字符流。
字节流以字节作为单位进行操作,而字符流以字符作为单位进行操作。具体来说,字节流是一系列8位字节的顺序组合,而字符流是由16位Unicode字符组成的。
字节流
字节流用于处理二进制数据,例如图片、音频和视频等文件。
在Java中,InputStream和OutputStream是字节流的抽象类。
InputStream定义了用于读取字节的方法,而OutputStream定义了用于写入字节的方法。
下面是一个使用FileInputStream读取文件内容的示例代码:
```
File file = new File("file.txt");
try (FileInputStream inputStream = new FileInputStream(file)) {
int ch;
while ((ch = inputStream.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
```
这段代码打开了一个名为“file.txt”的文件,并使用FileInputStream将其中的内容读取出来。FileInputStream.read()方法将读取一个字节并返回它的值,如果已经到达文件的末尾,则返回-1。
字符流
字符流用于处理文本数据,例如文本文件、HTML文件等。在Java中,Reader和Writer是字符流的抽象类。Reader定义了用于读取字符的方法,而Writer定义了用于写入字符的方法。
下面是一个使用BufferedReader读取文件内容的示例代码:
```
File file = new File("file.txt");
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
```
这段代码打开了一个名为“file.txt”的文件,并使用BufferedReader逐行读取其内容。BufferedReader.readLine()方法将读取一行文本并返回它的值,如果已经到达文件的末尾,则返回null。
Java I/O之NIO
Java NIO(New IO)是Java 1.4引入的一种新的I/O API。与原始的I/O API相比,Java NIO提供了更高效、更灵活的I/O操作方式。在Java NIO中,主要有以下四个核心组件:
1. Buffer(缓冲区):缓冲区是一个对象,用于存储数据。在Java NIO中,所有数据都从缓冲区读取,也都写入到缓冲区。缓冲区使用的是内存块,而不是像传统的I/O一样直接从文件或网络中读取。
2. Channel(通道):通道是可进行读写操作的对象,类似于流。在Java NIO中,提供了各种类型的通道,例如FileChannel、SocketChannel和ServerSocketChannel等。每种通道都有其专门的功能。
3. Selector(选择器):选择器用于监听多个通道的事件(例如连接打开、数据到达等),因此可以使用较少的线程来处理多个通道。这也是Java NIO比原始I/O更快的原因之一。
4. Charset(编码集):Charset用于将字符序列转换为字节序列,反之亦然。Java NIO提供了很多不同的Charset实现,例如UTF-8、GBK和ISO-8859-1等。
Java I/O异常处理
在Java I/O编程中,处理异常是必不可少的。任何一个I/O操作都可能会失败,例如文件不存在、连接超时等情况。因此,在进行I/O操作时应该总是尝试处理可能发生的异常。
下面是一个示例代码:
```
File file = new File("file.txt");
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
System.err.println("File not found: " + file.getPath());
} catch (IOException e) {
e.printStackTrace();
}
```
这段代码读取名为“file.txt”的文件,并在文件不存在或读取出错时打印出错误信息。这里使用了Java的异常处理机制来捕获并处理异常。在这种情况下,如果文件不存在,则抛出FileNotFoundException,而如果读取文件时发生错误,则抛出IOException。
结论
Java I/O是Java应用程序开发中非常重要的一部分。在本文包括Java I/O的基础知识,包括字节流和字符流、Java NIO和异常处理等。