`
天边一朵雲
  • 浏览: 34516 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java新输入/输出(nio)记录

    博客分类:
  • JAVA
阅读更多

NIO中两个核心对象为Channel(通道)和Buffer(缓冲)

Buffer,ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer,MappedByteBuffer(ByteBuffer的子类)

实例化Buffer的方法(MappedByteBuffer除外):

ByteBuffer bb = ByteBuffer.allocate(capacity);


capacity为缓冲区容量。

对Buffer属性的一系列操作:

    public static void BufferTest() {
        //创建普通的buffer
        ByteBuffer bb = ByteBuffer.allocate(8);
        //创建直接buffer和普通buffer对比是创建成本高,I/O操作较快
        ByteBuffer bb2 = ByteBuffer.allocateDirect(8);
        //buffer的三属性 关系为    容量cap>=界限lim>=位置pos
        //容量
        bb.capacity();
        //界限
        bb.limit();
        //位置
        bb.position();
        /*
         * 向普通buffer中存入元素,position随添加的元素而增涨初始为0
         * pos=0 lim=8 cap=8
         */
        bb.put((byte) 'a');
        bb.put((byte) 'b');
        /*
         * pos=2 lim=8 cap=8
         * buffer为非空调用flip()为输出做准备 
         * 执行flip()后 limit指到有效长度position指到0的位置
         */
        bb.flip();
        /*
         * pos=0 lim=2 cap=8
         * 输出数据结束后调用clear()为下次输入做准备 
         * 执行clear()后 limit指到capacity位置position指到0位置 
         */
        bb.clear();
        /*
         * pos=0 lim=8 cap=8
         * 如果再添加c元素到buffer 这时的position应该向后+1,并且覆盖掉原来的a
         */
        bb.put((byte) 'c');
        //pos=1 lim=8 cap=8
    }


Channel类

通过下面这个方法来了解:

    /**
     * 传统的IO效率不高因为是依赖与字节来处理
     * nio是依赖于映射内存区块来处理处理效率高
     * 该方法典型的就是oc.write(mbbuffer);
     * mbbuffer是Struts2Test.java的缓冲区块,这里是直接整块写出
     * 传统的一般会类似:
     * String str = "";
     * while(str = buffer.readLine() != null) {
     *     xxx.write(str);
     * }
     */
    public static void channelTest() throws IOException {
    	/*
    	 * Channel的实现类有:
    	 * java.nio.channels包下
    	 * DatagramChannel,FileChannel,SelectableChannel
    	 * ServerSocketChannel,SocketChannel(支持tcp网络通信的管道)
    	 * java.nio.channels.Pipe包下
    	 * SinkChannel,SourceChannel(线程之间的通信管道)
    	 */
    	//创建Channel实例 一般通过节点流创建Channel
    	File fileIn = new File("F:"+File.separator+"testSource"+File.separator+"Struts2Test.java");
    	File fileOut = new File("F:"+File.separator+"testSource"+File.separator+"nioTest.txt");
    	//创建节点流
    	FileInputStream fis = new FileInputStream(fileIn);
    	FileOutputStream fos = new FileOutputStream(fileOut);
    	//创建Channel
    	FileChannel ic = fis.getChannel();
    	FileChannel oc = fos.getChannel();
    	//Channel常用三方法map write read
    	//通过map方法把Channel包装成Buffer
    	MappedByteBuffer mbbuffer = ic.map(MapMode.READ_ONLY, 0, fileIn.length());
    	//Channel只能与buffer交互不能直接访问Channel的数据
    	oc.write(mbbuffer);
    	mbbuffer.clear();
    	ic.close();
    	oc.close();
    }


Channel的read类似write操作

如果在noiTest.txt文件末尾追加Struts2Test.java的内容,可以在上面代码中

26行改为

//追加到文件末尾
FileOutputStream fos = new FileOutputStream(fileOut, true);

32、33行之间加入

oc.position(fileOut.length());


结合Buffer的position属性不难推知这句代码的含义

 

编码解码就是ByteBuffer和CharBuffer之间的转换

Char转Byte为编码 反之为解码

下面代码简单说明了编码和解码:

	public static void main(String[] args) throws CharacterCodingException {

		//Encode编码(Char->Byte) Decode解码(Byte->Char)
		//获取Charset
		Charset cs = Charset.forName("GBK");
		//实例化普通Buffer
		CharBuffer cb =CharBuffer.allocate(8);
		cb.put("牛");
		cb.put("羊");
		cb.put("马");
		cb.flip();
		//Charset自带编码
		ByteBuffer bb = cs.encode(cb);
		for(int i=0;i<bb.capacity();i++) {
			System.out.println(bb.get(i)+"\t");
		}
		System.out.println();
		//Charset自带解码
		CharBuffer cbNext = cs.decode(bb);
		System.out.println(cbNext);
		//编码 nio
		CharsetEncoder ce = cs.newEncoder();
		ByteBuffer niobb = ce.encode(cbNext);
		for(int i=0;i<niobb.capacity();i++) {
			System.out.println(niobb.get(i)+"\t");
		}
		//解码 nio
		CharsetDecoder cd = cs.newDecoder();
		CharBuffer niocb = cd.decode(niobb);
		System.out.println(niocb);
	}
}


上面代码分别说明了两种编码和解码

转自:www.itlanguageexpress.info

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java开源包4

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包101

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包11

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包6

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包9

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包5

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包8

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包10

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 ...11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1 数据传递的类...

    java开源包1

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包3

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java7源码-java-convert-example:本项目记录一些常见对象转换的方法,例如:文件转换、日期时间转换、stream流转换、

    平时的java项目中会存在各种对象的互相转换的情况,本项目记录一些常见对象转换的方法,例如:文件转换、日期时间转换、stream流转换、集合对象转换等 文件 Java 为文件操作设计了很多的类,有数据相关的 IO Stream ...

    java开源包2

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    Java资源包01

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包7

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    j2se项目源码及介绍_last指令

    Last指令的实现 一、 背景描述 在Unix系统中,有一个last指令可以查看用户登录...b) 什么时候使用NIO作为输入/输出。 c) IO,NIO与解码的关系。 d) 程序中是边匹配边显示,还是处理完成以后再一起显示。 六、 效果

    txt文档阅读器

    import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.text.DecimalFormat; import java.util.Vector; import android.graphics.Bitmap; import android.graphics.Canvas; import...

Global site tag (gtag.js) - Google Analytics