淘先锋技术网

首页 1 2 3 4 5 6 7

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