当前位置: 移动技术网 > IT编程>开发语言>Java > NIO FileChannel通道+ByteBuffer完成文件复制

NIO FileChannel通道+ByteBuffer完成文件复制

2020年07月22日  | 移动技术网IT编程  | 我要评论

NIO FileChannel通道

在这里插入图片描述

File接口:
在这里插入图片描述

源码:

public interface Channel extends Closeable {

    /**
     * Tells whether or not this channel is open.
     *
     * @return <tt>true</tt> if, and only if, this channel is open
     */
    public boolean isOpen();

    /**
     * Closes this channel.
     *
     * <p> After a channel is closed, any further attempt to invoke I/O
     * operations upon it will cause a {@link ClosedChannelException} to be
     * thrown.
     *
     * <p> If this channel is already closed then invoking this method has no
     * effect.
     *
     * <p> This method may be invoked at any time.  If some other thread has
     * already invoked it, however, then another invocation will block until
     * the first invocation is complete, after which it will return without
     * effect. </p>
     *
     * @throws  IOException  If an I/O error occurs
     */
    public void close() throws IOException;

可以从顶层的Channel接口看到,该接口只提供了两个方法,通道是否打开、关闭通道,所有的附加功能石油它的实现类和子类完成。

先看看之前的普通IO是如何读取数据的

在电脑D 盘某文件下新建一个文件
在这里插入图片描述

看看之前普通io是怎么复制文件的

public static void main(String[] args) throws Exception{
        File file = new File("D:\\hufan","love.txt");
        File outFile = new File("D:\\hufan","fan.txt");
        if(!file.exists()){
            try {
                file.createNewFile();
                outFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //普通IO
        //输入流(由于文件中存的是中文,所以用了字节流,避免乱码)
        FileInputStream fileInputStream = new FileInputStream(file);
        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream(outFile);
        String s = null;
        byte[] bytes = new byte[1024];
        while (fileInputStream.read(bytes,0,1024) != -1){
             s = new String(bytes,0,1024);
             fileOutputStream.write(bytes,0,1024);
        }
        //关闭流
        fileInputStream.close();
        fileOutputStream.close();
        System.out.println(s);

    }

看看输出效果:
在这里插入图片描述
可见输出流是没有问题的,再看看文件是否复制成功

在这里插入图片描述
在这里插入图片描述
用之前普通IO完成了复制功能,接下来用NIO完成,直接上代码:

public static void main(String[] args) throws Exception{
        File file = new File("D:\\hufan","love.txt");
        File file1 = new File("D:\\hufan","hu.txt");
        file.createNewFile();
        file1.createNewFile();
        FileChannel fileChannel = FileChannel.open(file.toPath());
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        //创建通道
        FileChannel write = FileChannel.open(file1.toPath(), StandardOpenOption.WRITE);
        while (fileChannel.read(byteBuffer) != -1){
            //由读改为写
            byteBuffer.flip();
            write.write(byteBuffer);
            //清空缓存区
            byteBuffer.clear();
        }
        //关闭通道
        fileChannel.close();
        write.close();

    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文地址:https://blog.csdn.net/weixin_43481793/article/details/107494671

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网