Java NIO(New I/O)和IO(舊的I/O)是兩種不同的Java I/O API。在Java 1.4產(chǎn)生之前,Java的I/O只能使用InputStreams/OutputStreams和Readers/Writers這些類進(jìn)行,這些類都是阻塞式的,非常不好用。而Java NIO在Java 1.4版本之后開始流行,并且在Java 7中,有了Java NIO 2。
Java NIO具有非阻塞I/O的特點(diǎn),并且可以使用緩沖區(qū)。與傳統(tǒng)的Java IO不同,Java NIO中的數(shù)據(jù)集合既可以被讀取,又可以被寫入元素,還可以進(jìn)行緩存、數(shù)據(jù)轉(zhuǎn)換等操作。而IO則是阻塞性的,沒有緩沖區(qū)概念,無法實(shí)現(xiàn)非阻塞I/O。
使用Java NIO的代碼最重要的一件事就是緩沖區(qū)。緩沖區(qū)本質(zhì)上是一個(gè)可以讀寫數(shù)據(jù)的內(nèi)存塊,可以被Java NIO用于讀取和寫入數(shù)據(jù)。這種數(shù)據(jù)處理方式極大地提高了I/O操作的效率,但是代碼的復(fù)雜度略微增加。
下面是一個(gè)使用IO進(jìn)行操作的代碼:
FileInputStream fis = new FileInputStream("example.txt"); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader br = new BufferedReader(isr); String line = br.readLine(); System.out.println(line);
而下面是一個(gè)使用NIO實(shí)現(xiàn)同樣功能的的代碼:
RandomAccessFile aFile = new RandomAccessFile("example.txt", "r"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf); while (bytesRead != -1) { buf.flip(); while (buf.hasRemaining()) { System.out.print((char) buf.get()); } buf.clear(); bytesRead = inChannel.read(buf); } aFile.close();
總之,Java NIO是現(xiàn)代化的I/O API,可以大幅度提高運(yùn)行效率,而IO卻略顯笨重,逐漸被忽略和拋棄。希望大家都能盡快轉(zhuǎn)向使用Java NIO。