zoukankan      html  css  js  c++  java
  • Java_NIO基础分析-1

    1.在java_nio中,channel和buffer是非常关键的概念,先来看看channel&buffer在类的体系结构中的位置和主要属性和方法

    在下面完成的文件拷贝过程,会发现所有的数据都是先进入到buffer中,之后channel会按照业务逻辑对buffer进行操作。

    import java.io.*;
    import java.nio.*;
    import java.nio.channels.*;
    
    public class CopyFile {
        public static void main(String args[]) throws Exception {
            if (args.length < 2) {
                System.err.println("Usage: java CopyFile infile outfile");
                System.exit(1);
            }
    
            String infile = args[0];
            String outfile = args[1];
            //得到输入流和输出流
            FileInputStream fin = new FileInputStream(infile);
            FileOutputStream fout = new FileOutputStream(outfile);
            //得到输入channel和输出channel
            FileChannel fcin = fin.getChannel();
            FileChannel fcout = fout.getChannel();
            //new一个ByteBuffer对象
            //Buffer对象有四个非常重要的数据position,limit,capacity,mark,他们共同完成了复杂的内部读写的转换,重置等操作,设计的非常精妙。
            ByteBuffer buffer = ByteBuffer.allocate(1024);
    
            while (true) {
                //开始读之前先调用clear,设置position = 0;limit = capacity;mark = -1;
                buffer.clear();
                //从输入channel读取数据到buffer中
                int r = fcin.read(buffer);
                //读到-1表示读文件结束了。
                if (r == -1) {
                    break;
                }
                //从写模式转换到读模式中,设置limit = position;position = 0;mark = -1;
                buffer.flip();
                //把buffer中的内容写入到输出channel中
                fcout.write(buffer);
            }
        }
    }

    通过图和代码例子可以对NIO中的channel,buffer有一个基本的了解!

  • 相关阅读:
    C#——面向对象,常用类
    C#——基础
    C#——winform
    Oracle——PL/SQL,存储过程/函数,java连接Oracle操作存储过程/函数,触发器
    Oracle——数据处理(增删改查),创建表与管理表,视图,索引,同义词
    Oracle——集合运算
    PoisonTap
    在Ubuntu上安装LAMP(Apache、Mysql、Php)
    "Unable to locate package lrzsz"的解决办法
    OtterCTF
  • 原文地址:https://www.cnblogs.com/asletian/p/3811997.html
Copyright © 2011-2022 走看看