Java IO(Input/Output)和NIO(New Input/Output)是Java編程語(yǔ)言中用于讀寫數(shù)據(jù)的核心API(應(yīng)用程序接口),兩者之間存在一些明顯的差異。
在Java中,IO類庫(kù)主要使用InputStream和OutputStream接口來讀/寫數(shù)據(jù)。這種IO模型被稱為“阻塞I/O”(Blocking I/O),因?yàn)樽x/寫操作時(shí),程序會(huì)阻塞(停頓)直到數(shù)據(jù)完全被讀取或?qū)懭?。這種方式可以保證數(shù)據(jù)準(zhǔn)確性,但是在需要同時(shí)處理多個(gè)連接的情況下,每個(gè)連接的讀取和寫入可能會(huì)花費(fèi)很長(zhǎng)時(shí)間,從而降低整體性能。
// 使用InputStream讀文件 InputStream is = new FileInputStream("file.txt"); byte[] content = new byte[1024]; int bytesRead = is.read(content); String text = new String(content, 0, bytesRead); is.close(); System.out.println(text); // 使用OutputStream寫文件 OutputStream os = new FileOutputStream("file.txt"); String message = "hello world"; os.write(message.getBytes()); os.flush(); os.close();
而NIO則引入了新的方式來處理I/O,稱為“非阻塞I/O”(Non-Blocking I/O)。在NIO中,我們無需等待數(shù)據(jù)讀寫完全完成,可以在數(shù)據(jù)可用的情況下立即讀/寫數(shù)據(jù),而不必等待。
// 使用NIO讀文件 Path filePath = Paths.get("file.txt"); FileChannel channel = FileChannel.open(filePath, StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocate(1024); int bytesRead = channel.read(buffer); channel.close(); buffer.flip(); String text = new String(buffer.array(), 0, bytesRead); System.out.println(text); // 使用NIO寫文件 Path filePath = Paths.get("file.txt"); FileChannel channel = FileChannel.open(filePath, StandardOpenOption.WRITE); String message = "hello world"; ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); channel.write(buffer); channel.close();
在NIO中,我們使用Channel和Buffer來讀寫數(shù)據(jù)。Channel類似于IO中的流,并且可以同時(shí)讀寫數(shù)據(jù)。Buffer是一個(gè)帶有游標(biāo)的數(shù)據(jù)容器,可以存儲(chǔ)和讀寫數(shù)據(jù)。使用Buffer可以避免從底層I/O系統(tǒng)中重復(fù)讀取或?qū)懭霐?shù)據(jù),在I/O操作期間多次使用它,而不會(huì)阻塞程序。