Java中的流(Stream)和通道(Channel)是兩種常見的I/O操作方式,二者具有不同的作用和特點。
流是一種順序讀寫數據的方式,數據是從輸入流中一個一個地讀入,寫入輸出流中也是一個一個地寫出。Java中提供了許多流輸入輸出類,例如FileInputStream、FileOutputStream、BufferedInputStream等等。讀寫操作都是以字節為單位進行的,也可以使用字符流進行讀寫,比如InputStreamReader、OutputStreamWriter等。
try (FileReader fr = new FileReader(new File("test.txt")); BufferedReader br = new BufferedReader(fr)){ String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }
通道則是一種雙向的數據傳輸方式,數據可以從通道中讀取,也可以往通道中寫入。通道的讀寫操作都是以字節緩沖區為單位進行的,可以檢查通道是否打開或關閉、定位通道、以及對通道進行傳輸等操作。Java中提供了java.nio.channels包來進行通道操作。
try (RandomAccessFile outputFile = new RandomAccessFile("output.txt", "rw")) { FileChannel outputChannel = outputFile.getChannel(); ByteBuffer buf = ByteBuffer.allocate(1024); String data = "This is a test data"; buf.put(data.getBytes()); buf.flip(); outputChannel.write(buf); } catch (IOException e) { e.printStackTrace(); }
因為Java的通道是雙向的,所以可以實現高效的數據復制:
try (FileInputStream inputFile = new FileInputStream("input.txt"); FileOutputStream outputFile = new FileOutputStream("output.txt")) { FileChannel inputChannel = inputFile.getChannel(); FileChannel outputChannel = outputFile.getChannel(); long size = inputChannel.size(); inputChannel.transferTo(0, size, outputChannel); } catch (IOException e) { e.printStackTrace(); }
綜上所述,流和通道都是Java中常用的I/O操作方式,二者各具特點。流適用于順序讀寫數據,操作方便,而通道則適用于雙向數據傳輸,提高了數據傳輸的效率。