目标:将多个非空的文件合并至一个文件中,并删除原来的文件。
使用类FileChannel,FileChannel是Java NIO中的一个连接到文件的通道。
那么,什么是NIO呢?
Java 的NIO是针对原java io所开发出来的一套新的io api接口,Java NIO就是Java NEW IO ,它是从Java 1.4版本开引入的一个新的IO API,替代标准的Java IO API.
NIO与IO有什么区别呢?
区别1:IO是面向流的,每次从流中读一个或者多个字节,直至读完所有的直接,没有缓存;而NIO是面向缓冲区的,数据读到缓冲区后可在缓冲区前后移动,增加了处理过程中的灵活性。
区别2:IO的各种流是阻塞的,即当一个线程调用read()或者write()时,直到读取得一些数据或者数据完全写入,否则该线程一直被阻塞,此期间不能有其他任何动作;而NIO是非阻塞模式,一个线程发送请求时,只是取得当前可用的数据,若当前没有数据可用,不会获取,且在此期间,这个线程可以同时去做别的事情,所以一个单独的线程可以管理多个输入与输出通道。
主要的理解就是这样的,以下是代码示例:
public final int BUFSIZE = 1024 * 32; public void mergeFiles(String outFile, String[] files) { FileChannel outChannel = null; System.out.println("Merge " + Arrays.toString(files) + " into " + outFile); try { outChannel = new FileOutputStream(outFile).getChannel(); for(String f : files){ FileChannel fc = new FileInputStream(f).getChannel(); ByteBuffer bb = ByteBuffer.allocate(BUFSIZE);//创建一个容量为BUFSIZE的缓冲区 while(fc.read(bb) != -1){ bb.flip();//将一个处于存数据状态的缓冲区变成一个处于取数据的状态 outChannel.write(bb); bb.clear();//重置缓冲区的主要索引,而非清空缓冲区 } fc.close(); } System.out.println("Merged!! "); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if (outChannel != null) {outChannel.close();}} catch (IOException ignore) {} } }
删除文件使用file.delete()方法即可。