流的分类
- 按照操作数据单位的不同分为:字节流、字符流
- 按数据流的流向不同分为:输入流、输出流
//OutputStream
//InputStream
//Reader
//Writer
IO流都是从如上4个抽象基类派生的
字符流和字节流的区别
在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。
IO和NIO的区别
Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)
利用FileChannel类的方式进行文件复制
利用fileChannel是很有用的一个方式。它能直接连接输入输出流的文件通道,将数据直接写入到目标文件中去。而且效率更高。
public static void transferMerge(String dstFile, List<File> sourceFiles) throws Exception {
FileOutputStream outputStream = new FileOutputStream(dstFile);
FileChannel dstChannel = outputStream.getChannel();
ByteBuffer elf = ByteBuffer.wrap("\r\n".getBytes()).asReadOnlyBuffer();
for (int i = 0; i < sourceFiles.size(); i++) {
FileInputStream fis = new FileInputStream (sourceFiles.get(i));
FileChannel sourceChannel = fis.getChannel();
sourceChannel.transferTo (0, sourceChannel.size( ), dstChannel);
//dstChannel.write(elf);
//elf.rewind();
sourceChannel.close( );
fis.close( );
sourceFiles.get(i).renameTo(new File(sourceFiles.get(i)+".processed"));
}
elf.clear();
dstChannel.close();
outputStream.close();
}