Java NIO和IO是两种处理I/O操作的不同方式,Java NIO提供了一种高效的、基于缓冲区的I/O操作,而传统的Java IO则是基于流式(stream-based)的方式。
以下是Java NIO和IO的几个重要区别:
- 缓冲区(Buffer)与流(Stream)的区别
Java IO是面向流的编程,数据从一个地方流动到另一个地方,通常是通过InputStream和OutputStream。使用Java IO时,我们读或写数据都是直接和流交互。
Java NIO则是面向块(block)或缓冲区(buffer)的编程方式。数据读取到一个缓冲区中,然后从缓冲区中进行处理。使用Java NIO时,我们读或写缓冲区中的数据,并且缓冲区处理方式和数据处理方式可以是不同的。
- 面向不同的通道(channel)
Java IO的FileInputStream和FileOutputStream等是面向字节流的,Reader和Writer是面向字符流的。使用Java IO时,我们使用不同的流来处理不同类型的数据。
Java NIO的通道(channel)则是面向数据块的。通道可以是读的、写的或者双向的,数据总是通过Buffer对象处理。
- 阻塞与非阻塞模式的区别
Java IO是阻塞模式的,也就是在进行输入输出操作时,必须等到操作完成才能继续执行下面的代码。
Java NIO则支持阻塞和非阻塞两种模式。与Java IO不同的是,在使用非阻塞模式时,在进行非阻塞的I/O操作时,如果没有可用的数据,程序可以继续执行下面的代码,而不必等待。
- 选择器(selector)
Java NIO中的选择器提供了一种可以监控多个通道的机制。可以通过一个单独的线程进行监控多个通道的数据请求。
综上,Java NIO比Java IO更加灵活和高效,可以更好地处理大量的数据请求。下面是一个基于NIO的简单示例:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class NIOClient {
public static void main(String[] args) throws IOException, InterruptedException {
InetSocketAddress hostAddress = new InetSocketAddress("localhost", 8899);
SocketChannel client = SocketChannel.open(hostAddress);
String message = "Hello World!";
byte[] messageBytes = message.getBytes("UTF-8");
ByteBuffer buffer = ByteBuffer.wrap(messageBytes);
client.write(buffer);
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
int bytesRead = client.read(readBuffer);
while (bytesRead != -1) {
readBuffer.flip();
while (readBuffer.hasRemaining()) {
System.out.print((char) readBuffer.get());
}
readBuffer.clear();
bytesRead = client.read(readBuffer);
}
client.close();
}
}
上述示例为NIO的客户端,与传统IO的客户端示例区别较大。
同时,下面也给出一个基于传统IO的简单示例:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class IOClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream outputStream = socket.getOutputStream();
String message = "Hello World!";
outputStream.write(message.getBytes("UTF-8"));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String responseString = bufferedReader.readLine();
while (responseString != null) {
System.out.println(responseString);
responseString = bufferedReader.readLine();
}
bufferedReader.close();
outputStream.close();
socket.close();
}
}
两个示例从出发点上都是来请求一个服务端发来的数据,但是却使用了不同的技术方案。通过对比,可以更加直观地了解Java NIO和Java IO的区别。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java NIO和IO的区别 - Python技术站