Java中的I/O(輸入輸出)和NIO(新I/O)是兩種不同的I/O處理方式,但它們的區(qū)別在哪里呢?
Java I/O是一種阻塞的I/O操作,這意味著當(dāng)應(yīng)用程序從文件或網(wǎng)絡(luò)流中讀取數(shù)據(jù)時,該操作將會一直阻塞,直到數(shù)據(jù)可用為止。同樣,當(dāng)應(yīng)用程序向文件或網(wǎng)絡(luò)流中寫入數(shù)據(jù)時,該操作也會阻塞,直到數(shù)據(jù)完全寫入。這種I/O方式需要許多線程來處理I/O,會占用大量系統(tǒng)資源,而且很難進(jìn)行事件驅(qū)動編程。
import java.io.FileInputStream;
import java.io.InputStream;
public class ReadFile {
public static void main(String[] args) throws Exception{
InputStream inputStream = null;
try{
inputStream = new FileInputStream("input.txt");
int data = inputStream.read();
while(data != -1){
System.out.print((char) data);
data = inputStream.read();
}
}finally{
if(inputStream != null){
inputStream.close();
}
}
}
}
相比之下,Java NIO使用非阻塞I/O方法。這意味著當(dāng)應(yīng)用程序從文件或網(wǎng)絡(luò)流中讀取數(shù)據(jù)時,該操作不會一直阻塞,而是立即返回。如果沒有數(shù)據(jù)可用,則該操作將返回0或null(取決于操作的具體實現(xiàn))。同樣,當(dāng)應(yīng)用程序?qū)懭霐?shù)據(jù)時,操作也會立即返回,而不會等待寫入操作的完成。
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class FileLockDemo {
public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("file", "rw");
FileChannel fileChannel = file.getChannel();
FileLock fileLock = fileChannel.tryLock();
if(fileLock != null) {
System.out.println("Got the lock.");
} else {
System.out.println("Unable to get lock.");
}
}
}
Java NIO還提供了一種選擇器(Selector)的概念,使得應(yīng)用程序可以輕松地使用單個線程來處理多個通道的 I/O 事件。 Java NIO 的這些特性使得其在高并發(fā)和高吞吐量的情況下表現(xiàn)更加優(yōu)秀。
Java NIO的缺點是它需要更多的代碼來實現(xiàn)。相比之下,Java I/O提供了更簡單的API,它很容易上手。因此,如果需要處理少量的I/O,或者只需要處理低并發(fā)的 I/O,則可以使用Java I/O。