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操作方式,二者各具特点。流适用于顺序读写数据,操作方便,而通道则适用于双向数据传输,提高了数据传输的效率。