NIO复制文件
public class NIOTest {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("d:/input.txt");
FileOutputStream fos = new FileOutputStream("d:/output.txt");
FileChannel inputChannel = fis.getChannel();
FileChannel outputChannel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(5);
while(true){
buffer.clear();//如果注释掉该行会发生什么情况?
int read = inputChannel.read(buffer);
System.out.println("read=" + read);
if(read == -1){
break;
}
buffer.flip();
outputChannel.write(buffer);
}
inputChannel.close();
outputChannel.close();
}
}
input.txt内容
123456
正常运行结果
read=5
read=1
read=-1
Process finished with exit code 0
output.txt内容:
123456
注释掉9行运行结果
read=5
read=0
read=0
read=0
……
如果不停止程序,output.txt大小一直增长。
不注释掉9行代码分析
第一次循环
ByteBuffer buffer = ByteBuffer.allocate(5); //分配了5个字节的ByteBuffer
while(true){
buffer.clear(); //position=0,limit = capacity = 5
int read = inputChannel.read(buffer); //先读入了5个字节,12345
//position = 5,limit = capacity = 5
System.out.println("read=" + read); //read=5
if(read == -1){
break;
}
buffer.flip(); //position=0, limit = capacity = 5
outputChannel.write(buffer); //position = limit = capacity = 5
}
第二次循环
while(true){
buffer.clear(); //position=0,limit = capacity = 5
int read = inputChannel.read(buffer); //先读入了1个字节,6
//position = 1,limit = capacity = 5
System.out.println("read=" + read); //read=1
if(read == -1){
break;
}
buffer.flip(); //position=0, limit = 1, capacity = 5
outputChannel.write(buffer); //position = limit = 1,capacity = 5
}
第三次循环read = 1,break。
注释掉9行代码分析
第一次循环
ByteBuffer buffer = ByteBuffer.allocate(5); //分配了5个字节的ByteBuffer
//position = 0,limit = capacity = 5
while(true){
int read = inputChannel.read(buffer); //先读入了5个字节,12345
//position = 5,limit = capacity = 5
System.out.println("read=" + read); //read=5
if(read == -1){
break;
}
buffer.flip(); //position=0, limit = capacity = 5
outputChannel.write(buffer); //position = limit = capacity = 5
}
第二次循环
while(true){
//此时继续第一次循环position = limit = capacity = 5
int read = inputChannel.read(buffer); //由于position = limit ,无法继续读入字节,read=0
System.out.println("read=" + read); //read=0
if(read == -1){
break;
}
buffer.flip(); //position=0, limit = capacity = 5
outputChannel.write(buffer); //position = limit = capacity = 5
}
第N次循环和第N-1次循环相同。