`
天边一朵雲
  • 浏览: 36311 次
  • 性别: 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 NIO核心概念总结篇

    - **基本概念**:缓冲区是指在内存中预先分配的一段连续的空间,用于暂时存储输入/输出数据。 - **作用**:缓冲区作为 I/O 操作的数据中转站,提高了数据处理效率。 - **类型**:根据数据类型的不同,Java 提供了...

    Java输入输出流.pptx

    Java输入输出流是Java编程语言中的重要组成部分,用于处理数据的输入和输出操作。Java的I/O机制基于数据流的概念,涉及数据从源到目的地的传输。数据流分为两种主要类型:输入数据流(Input Stream)和输出数据流...

    JAVA核心知识点整理,涵盖JAVA基础、集合类、JVM、IO/NIO、多线程、Spring原理等知识

    Java中的输入输出流(I/O)是处理数据输入输出的关键技术。 - **阻塞I/O(Blocked I/O)**:传统的输入输出方式,读取或写入数据时会阻塞当前线程。 - **非阻塞I/O(Non-blocking I/O)**:也称为NIO,提供了一种非阻塞的...

    Java NIO介绍

    Java NIO(New Input/Output)是一种改进的输入输出处理方式,它在JDK 1.4中被引入。与传统的面向流的I/O模型相比,NIO主要关注于提高I/O操作的速度,并提供了一种面向块的数据处理方法。NIO通过引入新的API,如`...

    java nio 详解

    为了解决这些问题,在JDK 1.4中引入了一个全新的输入/输出库——NIO(New Input/Output),它提供了高速、面向块的I/O操作,极大地提高了网络编程的效率。 #### 二、NIO核心概念介绍 NIO的核心概念包括缓冲区...

    Java I/O文件读写/删除/复制等

    Java I/O 文件操作是Java编程中的重要组成部分,它允许开发者处理输入和输出,涉及文件的创建、读取、写入、删除以及复制等任务。在Java中,这些操作主要是通过java.io包提供的类来实现的。下面将详细介绍这些知识点...

    一款基于Java设计的文件传输系统,其中包含了源码以供大家参考

    在Java中,文件传输可以利用多种API,如Java IO(输入/输出)和NIO(非阻塞输入/输出)。IO API包括File类、InputStream和OutputStream等,用于读写文件和网络流;NIO提供更高效的数据传输方式,适合处理大量并发...

    javaAPI文档.rar

    Java API文档是Java开发者不可或缺的参考资料,它详细记录了Java平台标准版(Java SE)的各种类库、接口、方法和常量,为编程者提供了全面的API信息。这份"javaAPI文档.rar"压缩包文件包含了Java 1.6版本的官方API...

    JAVA核心面试知识点整理.pdf

    Java的I/O和NIO(New I/O)是Java对输入/输出操作进行管理的两种方式。传统的I/O是阻塞式IO模型,而NIO提供了非阻塞式IO模型、多路复用IO模型、信号驱动IO模型和异步IO模型等。Java NIO核心组件包括通道(Channel)...

    全面总结java IO体系

    Java IO体系是Java编程语言中用于处理输入输出操作的核心组件,它允许程序与各种数据源(如文件、网络、内存缓冲区等)进行交互。在Java中,输入输出操作是通过流(Stream)的概念来实现的,流是数据传输的通道,可以...

    iocn-io.zip

    Java I/O库主要由java.io包提供,后来在Java NIO(非阻塞I/O)和Java NIO.2(新I/O API,也称为NIO.2或Java 7的File API)中进行了扩展,提供了更高效和灵活的I/O操作。 1. 基本I/O:如InputStream和OutputStream...

    Java流NIO

    Java NIO,全称为New Input/Output,是Java平台中用于处理输入输出操作的重要部分,自Java 1.4版本引入。NIO的核心目标是提供一种更高效、更灵活的I/O模型,以应对高性能应用的需求。传统的Java IO API基于流(Stream...

    JAVA核心知识点.pdf

    Java I/O和NIO(New I/O)是处理输入/输出操作的两种方式。I/O模型包括阻塞IO模型、非阻塞IO模型、多路复用IO模型、信号驱动IO模型和异步IO模型。Java NIO提供了基于通道(Channel)和缓冲区(Buffer)的IO操作方式...

    java-ppt.rar_java .ppt_java ppt_java基础 ppt_java基础 ppt_ppt jav

    8. **输入/输出流**:理解I/O流的概念,包括文件读写,字节流和字符流,以及缓冲区的概念。 9. **多线程**:线程的创建(Thread类和Runnable接口),同步机制(synchronized关键字,wait(), notify(), notifyAll()...

    唯品会Java开发手册.zip

    5. **IO与NIO**:Java的输入/输出系统支持流式操作,而NIO(非阻塞I/O)提供了更高效的I/O模型。理解这两种模式并选择合适的场景使用,对优化数据传输至关重要。 6. **网络编程**:Java的Socket编程接口允许创建...

    Java 开发所需的所有API文档

    3. **IO与NIO**:`java.io`包提供了传统输入/输出流,而`java.nio`包则引入了非阻塞I/O,提高了数据传输效率。 4. **网络编程**:`java.net`包包含了进行网络通信所需的所有类和接口,如Socket和ServerSocket,用于...

    java IO流精讲 JAVA IO流实例开发

    Java IO流是Java平台中用于处理输入/输出操作的核心组件,它允许程序与各种数据源(如文件、网络连接、内存缓冲区等)进行交互。Java IO流的精讲涵盖了许多概念和技术,包括流的分类、流的方向、缓冲区的使用、字符...

    java网络通信新系统

    一旦连接建立,双方就可以通过输入输出流进行数据交换。 其次,Java的NIO框架为高性能网络通信提供了可能。与传统的IO模型不同,NIO是非阻塞的,这意味着当数据不可用时,读取操作不会阻塞,而是返回一个状态。`...

    Java解惑 中文版

    5. **IO与NIO**:输入/输出和非阻塞IO在Java中扮演着重要角色。这部分将探讨如何有效利用流、缓冲区以及NIO的优势进行数据传输。 6. **反射与注解**:Java的反射机制允许程序在运行时检查类和接口的信息,而注解则...

Global site tag (gtag.js) - Google Analytics