首页 > 其他分享 >NIO学习笔记

NIO学习笔记

时间:2023-02-06 17:13:26浏览次数:39  
标签:NIO des 笔记 学习 source long File new

java的NIO的学习教程,网上一大把,本文只是学习的笔记。

本文参考和复制如下内容:
https://www.cnblogs.com/mikechenshare/p/16587635.html

https://blog.csdn.net/K_520_W/article/details/123454627

https://www.zhihu.com/question/29005375

 

 一、NIO简介

NIO 同步非阻塞IO,多路复用,其目的是提高速度。主要的使用场景是在网络IO。对于传统的文件IO,优势不明显。

NIO是面向缓冲区(Buffer)的。

可简单认为:

IO是面向流的处理,NIO是面向块(缓冲区)的处理

面向流的I/O 系统一次一个字节地处理数据。
一个面向块(缓冲区)的I/O系统以块的形式处理数据。


NIO主要有三个核心部分组成:

buffer缓冲区
Channel管道
Selector选择器

用实际的实例来学习一下把!

 1、NIO复制文件和传统IO复制文件的demo 

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class SimpleFileTransferTest {


    /**
     * 普通的io文件流
     * @param source
     * @param des
     * @return
     * @throws IOException
     */
    private long transferFile(File source, File des) throws IOException {
        long startTime = System.currentTimeMillis();

        if (!des.exists())
            des.createNewFile();

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(des));

        //将数据源读到的内容写入目的地--使用数组
        byte[] bytes = new byte[1024 * 1024];
        int len;
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }

        long endTime = System.currentTimeMillis();
        return endTime - startTime;
    }

    /**
     * nio操作文件流
     * @param source
     * @param des
     * @return
     * @throws IOException
     */
    private long transferFileWithNIO(File source, File des) throws IOException {
        long startTime = System.currentTimeMillis();

        if (!des.exists())
            des.createNewFile();

        RandomAccessFile read = new RandomAccessFile(source, "rw");
        RandomAccessFile write = new RandomAccessFile(des, "rw");

        FileChannel readChannel = read.getChannel();
        FileChannel writeChannel = write.getChannel();


        ByteBuffer byteBuffer = ByteBuffer.allocate(1024 * 1024);//1M缓冲区

        while (readChannel.read(byteBuffer) > 0) {
            byteBuffer.flip();
            writeChannel.write(byteBuffer);
            byteBuffer.clear();
        }

        writeChannel.close();
        readChannel.close();
        long endTime = System.currentTimeMillis();
        return endTime - startTime;
    }



    public static void main(String[] args) throws IOException {
        SimpleFileTransferTest simpleFileTransferTest = new SimpleFileTransferTest();
        File sourse = new File("E:\\VSWork\\spring-plugin-cli-master.rar");
        File des = new File("E:\\VSWork\\spring-plugin-cli-master-io.rar");
        File nio = new File("E:\\VSWork\\spring-plugin-cli-master-nio.rar");

        long time = simpleFileTransferTest.transferFile(sourse, des);
        System.out.println(time + ":普通字节流时间");

        long timeNio = simpleFileTransferTest.transferFileWithNIO(sourse, nio);
        System.out.println(timeNio + ":NIO时间");


    }


}
View Code

 

标签:NIO,des,笔记,学习,source,long,File,new
From: https://www.cnblogs.com/puzi0315/p/17095959.html

相关文章

  • (转)golang学习之--select--case 原理
    原文:https://blog.csdn.net/cyb_17302190874/article/details/108244683Go的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中......
  • 机器学习笔记:回归模型评估指标——MAE、MSE、RMSE、MAPE、R2等
    日常比赛中,常见两种类型:分类和回归。在回归任务中(对连续值的预测),常见的评估指标(metrics)主要包括:平均绝对误差MAE(MeanAbsoluteError)均方误差MSE(MeanSquareError)......
  • 接口测试概述笔记
    接口测试主要是测试系统组件间接口的一种测试,主要用于测试服务器与前端(web浏览器,APP)之间的数据交互接口。测试的重点是要检查接口参数传递的正确性,接口功能实现的正确性,......
  • shell脚本学习教程(全网最全教学)
     1shell概述1.1什么是ShellShell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便远程远程程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚......
  • Redis笔记(2): Linux服务器安装Redis
    1.下载  访问官网地址:Redis官网下载地址进行下载.2.上传安装包到Linux服务器并解压上传文件到/usr/local/src目录下解压安装包tar-zxvfredis-7.0.8.tar.gz查......
  • CMU15-445:Lecture #09 笔记
    Lecture#09:IndexConcurrencyControl本文是对CMU15-445课程第9节笔记的一个粗略总结和翻译。仅供个人(M1kanN)复习使用。目录Lecture#09:IndexConcurrencyCont......
  • 机器学习中入门级必学的算法有哪些?
    文章目录​​一、K-近邻算法​​​​二、线性回归​​​​三、逻辑回归​​​​四、决策树算法​​​​五、集成算法​​​​六、聚类算法​​一、K-近邻算法什么是k-近邻算......
  • Git学习笔记
    Git作为一款分布式版本控制工具,在我们的日常生活中起到了巨大的作用。何为版本控制:举一个简单例子,我们的在做一个设计方案时会经过多次整改,而我们将每一版文档都保存我们的......
  • 自我介绍与学习记录
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzzcxy/2023learning这个作业要求在哪里https://edu.cnblogs.com/campus/fzzcxy/2023learning/homework/1......
  • Acwing - 算法基础课 - 笔记(数学知识 · 四)(补)
    数学知识(四)这一小节讲的是容斥原理和简单博弈论。容斥原理定义最基本的,假设有3个两两相交的圆。那么三个圆所覆盖的面积大小为如果是2个圆的话,那么其所覆盖的面积为如果是4......