`

缓冲区Buffer与通道Channel

 
阅读更多

一、一般来说缓冲区和通道结合在一起使用,写入文件的时候,需要先存放在缓冲区,然后通过通道写入。读取文件的时候也类似,通过通道读取在缓冲区。然后通过缓冲区获取文件内容。

     Buffer针对每一种java基本类型都有实现。Channel针对不同的使用对象也有不同的实现,一般常见的为FileChannel与SocketChannel两类。

    Buffer底层实现为数组,有三个重要的参数,position,limit,capacity,分别代表当前位置,剩余空间,最大容量

    Buffer有两种模式,读模式与写模式。通过方法flip()进入读取模式,clear()方法进入写入模式。

 

二、代码实例:

package nio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * NIO拷贝文件(Buffer与FileChannel的使用实例)
 * 
 * @author 
 * @version $Id: CopyFile.java, v 0.1 2014年3月2日 下午12:34:55  Exp $
 */
public class CopyFile {

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

        String srcFile = "D://1.wmv";
        String targetFile = "D://2.wmv";

        FileInputStream fin = null;
        FileOutputStream fout = null;
        FileChannel finc = null;
        FileChannel foutc = null;

        try {
            fin = new FileInputStream(srcFile);
            fout = new FileOutputStream(targetFile);
            finc = fin.getChannel();
            foutc = fout.getChannel();
            ByteBuffer buffer = ByteBuffer.allocate(1024);

            while (true) {
                buffer.clear();
                int n = finc.read(buffer);
                if (n == -1) {
                    break;
                }

                buffer.flip();
                foutc.write(buffer);
            }

        } catch (Exception e) {
            e.fillInStackTrace();
        } finally {
            if (finc != null) {
                finc.close();
            }
            if (foutc != null) {
                foutc.close();
            }
            if (fin != null) {
                fin.close();
            }
            if (fout != null) {
                fout.close();
            }
        }
    }
}

 

  上面的代码中,通过通道将文件内容读取到缓冲区,然后通过通道写入到文件。Buffer在文件读取之前调用clear,在文件写入之前调用flip。

 

 

 

 

 

 

分享到:
评论

相关推荐

    java nio教程pdf

    标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Asynchronous IO(异步IO) Java NIO可以...

    java NIO 视频教程

    标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Non-blocking IO(非阻塞IO) Java NIO...

    [ Java ] 最通俗易懂的 Java NIO 讲解

    文章目录IO 与 NIO 的比较通道和缓冲区缓冲区(buffer)通道(channel)使用 NIO 完成本地通信使用 NIO 完成网络通信管道 IO 与 NIO 的比较 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented)...

    尚硅谷Java视频_NIO 视频教程

    尚硅谷_NIO_缓冲区(Buffer)的数据存取 ·03. 尚硅谷_NIO_直接缓冲区与非直接缓冲区 ·04. 尚硅谷_NIO_通道(Channel)的原理与获取 ·05. 尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集...

    javasnmp源码-nio-learn:JavaNIO使用示例,NIO的使用,TCP,UDP的简单示例

    nio缓冲区buffer 简介 Buffer是数据的容器,在nio中负责数据的存取,java为不同数据类型提供了相对应的缓冲区类型 如:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 、DoubleBuffer 等...

    ring-channel:环形缓冲区顶部的有界MPMC通道抽象

    环形通道 环形缓冲区顶部的有界MPMC通道抽象。使用RingChannel RingChannel可在上,只需将其添加为Cargo.toml的依赖项Cargo.toml : [dependencies]ring-channel = "0.8"完整的API文档可在上贡献RingChannel是一个...

    C++语音识别开篇

    NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

    24 尚硅谷Java NIO视频

    教程视频:NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中

    java8源码-nio:java8nio使用的总结

    NIO_直接缓冲区与非直接缓冲区 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中 直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率 5. ...

    Java NIO缓冲

    缓冲区(buffer)是从即将写入通道(channel)或刚刚从通道中读出的一段数据。它是一个持有数据,并扮演NIO通道端点的对象。缓冲区为数据访问和读写过程提供正式机制。  它是NIO和老版Java I/O的一个主要区别。...

    Java NIO实战开发多人聊天室

    01-Java NIO-课程简介....17-Java NIO-Buffer-缓冲区分片.mp4 18-Java NIO-Buffer-只读缓冲区.mp4 19-Java NIO-Buffer-直接缓冲区.mp4 21-Java NIO-Selector-概述.mp4 23-Java NIO-Selector-示例代码(客户端).mp4 24

    面试题-丰巢科技篇.zip

    ⽽NIO基于Channel和Buffer(缓冲区)进⾏操作,数据总是从通道读取到缓冲区中,或者从缓冲区写⼊到通道中。 Selector(选择区)⽤于监听多个通道的事件(⽐如:连接打开,数据到达)。因此,单个线程可以监听多个数据...

    JAVA IO-NIO 详解

    NIO的核心组件包括Channel(通道)、Buffer(缓冲区)和Selector(选择器)。Channel是数据传输的通道,它替代了传统IO中的流;Buffer是数据的容器,它可以在Channel和程序之间进行数据的读写操作;Selector则用于...

    Java面试高频知识点总结

    传统 IO 基于字节流和字符流进行操作,而 NIO 基于 Channel 和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据...

    基于Nio的多人聊天Demo

    NIO即non-blocking IO,顾名思义是一种非阻塞模型。...3、Buffer,缓冲区。Buffer底层是一个数组,供Channel实现对数据的读写。Buffer的position、limit、capacity分别指当前索引、读/写上限索引、数组容量。

    精通并发与netty视频教程(2018)视频教程

    80_Netty复合缓冲区详解与3种缓冲区适用场景分析 81_Netty引用计数的实现机制与自旋锁的使用技巧 82_Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 83_AtomicIntegerFieldUpdater实例演练与...

    精通并发与 netty 视频教程(2018)视频教程

    76_Netty项目开发过程中常见且重要事项分析 77_Java NIO Buffer总结回顾与难点拓展 78_Netty数据容器ByteBuf底层数据结构深度剖析 79_Netty的ByteBuf底层实现大揭秘 80_Netty复合缓冲区详解与3种缓冲区适用场景分析 ...

    Java IO 体系.md

    - 缓冲区(Buffer) - 通道(Channel) - 示例:文件拷贝案例 - BIO 和 NIO 拷贝文件的区别 - 操作系统的零拷贝 - 选择器(Selectors) - 选择键(SelectionKey) - 示例:简易的客户端服务器通信 - 总结 ...

    NIO初体验 ╥﹏╥

    文章目录NIO与IO的区别阻塞和非阻塞,同步和异步的概念Buffer(缓冲区)Channel(通道)Selector(选择器) NIO的三个主要组成部分:Buffer(缓冲区)、Channel(通道)、Selector(选择器) NIO与IO的区别 Java NIO...

    2021最新-Java NIO视频教程-视频教程网盘链接提取码下载 .txt

    教程内容涵盖:阻塞和非阻塞IO、Channel通道、Buffer缓冲区、Selector选择器、Pipe管道、FileLock文件锁,以及Path、Files、异步FileChannel和Charset字符编码等,并通过一个多人聊天室的综合案例,把所有的NIO知识...

Global site tag (gtag.js) - Google Analytics