IO流总结

流的分类

  1. 按照操作数据单位的不同分为:字节流、字符流
  2. 按数据流的流向不同分为:输入流、输出流

//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();
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值