NIO

作者: Kevin_Huang54 | 来源:发表于2019-02-15 11:34 被阅读0次
    • NIO与传统IO相比,NIO以块为单位传输,并且有缓存区,而IO流直接通过字节传输
    • 相比之下NIO减少了硬盘读取的次数,而且操作也更方便。

    Buffer和Channel

    • Buffer是一个抽象类,本质上是一个数组,常用子类有ByteBuffer和CharBuffer
    • Buffer有三个参数:capacity、limit、position
    • Buffer没有构造器,通过以下方法获取对象:

    CharBuffer charBuffer = CharBuffer.allocate(int capacity);

    • 重要方法1:flip方法

      • 把position的位置置零,limit的位置设为原先position的位置
      • 一般在写出数据(write)前使用,准备好存在数据的区域供输出
    • 常用方法2:clear方法

      • 把position位置置零,limit位置设为capacity位置
      • 在read前使用,准备好读取区域
    • 应用实例(复制文件)

    //定义一个有限大小的buffer,通过read和write方法多次读取和写入
    File f = new File("E:/文档/物品位置.xlsx");
    File f2 = new File("E:/文档/物品位置2.xlsx");
    //channel必须建立在已有的流上
    try (FileChannel inChannel = new FileInputStream(f).getChannel();
         FileChannel outChannel = new FileOutputStream(f2).getChannel()) {
        //先定义一个有限大小的buffer
        ByteBuffer buffer = ByteBuffer.allocate(100);
        //通过read读取并判断是否有数据
        while(inChannel.read(buffer) != -1) {
            //将position置零,将limit放到数据末端,标记输出终点
            buffer.flip();
            //写出数据
            outChannel.write(buffer);
            //恢复buffer的position和limit位置,准备下一次读取
            buffer.clear();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    Path的用法

    //可以将字符串拼接成路径
    Path path = Paths.get("E:", "计算机科学", "书");
    System.out.println("实际定义的路径:" + path);
    System.out.println("获取绝对路径path.toAbsolutePath():" + path.toAbsolutePath());
    System.out.println("获取根路径path.getRoot():" + path.getRoot());
    
    实际定义的路径:E:\计算机科学\书
    获取绝对路径path.toAbsolutePath():E:\计算机科学\书
    获取根路径path.getRoot():E:\
    

    Files的用法

    //copy方法复制文件,参数是源文件path、目标文件FileOutPutStream
    Files.copy(path, new FileOutputStream(path.getParent() + "/MySQL必知必会.pdf"));
    //readAllLines根据编码读取文本文档的每一行
    List<String> list = Files.readAllLines(path, Charset.forName("UTF-8"));
    //size获取指定文件的字节大小
    System.out.println(Files.size(path));
    //write将List<String>写入文件
    List<String> list = new ArrayList<>();
    list.add("四行");
    list.add("五行");
    Files.write(path, list, Charset.forName("UTF-8"));
    //list放回stream,通过Lambda表达式遍历目录下所有文件
    Files.list(path).forEach(path1 -> System.out.println(path1));
    

    相关文章

      网友评论

          本文标题:NIO

          本文链接:https://www.haomeiwen.com/subject/dolpeqtx.html