通过对文件的拷贝来对比传统IO流和NIO流

将底层流封装成处理流以后进行分段读取。

/*将本身源代码拷贝到TXT文件*/
public class TraditionIO {
public static void main(String[] args) {
try(BufferedReader br = new BufferedReader(new FileReader("src/com/ming/test/TraditionIO.java")); //准备输入输出"处理"流
BufferedWriter bw = new BufferedWriter(new FileWriter("TEMP.txt"))){
//缓存数组
char temp[] = new char[1024];
int receive = 0;
while((receive = br.read(temp)) > 0){
bw.write(temp,0,receive); //分段读取
}
}catch (Exception e){
e.printStackTrace();
}
}
}

直接通过InputStream/OutputStream获取Channel,Channel和Buffer进行配合进行拷贝。

public class NIO {
public static void main(String[] args) {
try(FileChannel inFc = (new FileInputStream("src/com/ming/test/NIO.java").getChannel()); //通过节点流来获取管道
FileChannel outFc = (new FileOutputStream("TEMP2.txt")).getChannel()) {
//通过管道获取Buffer,并将源文件数据全部"塞进"Buffer
MappedByteBuffer mbb = inFc.map(FileChannel.MapMode.READ_ONLY,0,new File("src/com/ming/test/NIO.java").length());
//将Buffer里面的数据取出
outFc.write(mbb);
}catch (Exception e){
e.printStackTrace();
}
}
}

NIO的性能比传统IO的要高,使用也更方便。

public class NIO {
/*public static void main(String[] args) {
try(FileChannel inFc = (new FileInputStream("src/com/ming/test/NIO.java").getChannel()); //通过节点流来获取管道
FileChannel outFc = (new FileOutputStream("TEMP2.txt")).getChannel()) {
//通过管道获取Buffer,并将源文件数据全部"塞进"Buffer
MappedByteBuffer mbb = inFc.map(FileChannel.MapMode.READ_ONLY,0,new File("src/com/ming/test/NIO.java").length());
//将Buffer里面的数据取出
outFc.write(mbb);
}catch (Exception e){
e.printStackTrace();
}
}*/
public static void main(String[] args) {
//如果习惯了传统IO的分段读取或者担心Channel对应的文件过大,使用map()方法一次将所有的文件内容映射到内存中引起性能下降,也可以使用Channel和Buffer传统的分段读取
try(FileChannel inFc = (new FileInputStream("src/com/ming/test/NIO.java")).getChannel();){ //通过节点流获取管道
//定义Buffer,相当于传统IO流中的byte[]
ByteBuffer bb = ByteBuffer.allocate(64); //手动定义Buffer,而不是通过管道映射出一个Buffer
while(inFc.read(bb) > 0){ //程序不能直接从Channel中读取数据,必须通过Buffer作为中间变量,就想传统的IO流一样,必须先从输入流中
//读取数据到一个字节数组,然后将字节数组里面的数据写入到输出源
bb.flip(); //为读取数据做准备
System.out.print(new String(bb.array()));
bb.clear(); }
}catch (Exception e){
e.printStackTrace();
}
}
}

Java传统IO流和NIO流的简单对比介绍的更多相关文章

  1. IO流与NIO流

    JAVA IO流最详解   (转自CSDN) IO流上:概述.字符流.缓冲区(java基础)   一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数 ...

  2. JAVA的IO编程:管道流

    掌握线程通讯流(管道流)的使用 管道流的主要作用是可以进行两个线程间的通讯,分为管道输入流(PipeOutputStream)和管道输出流(PipeInputStream). 如果要想进行管道输出,则 ...

  3. Java基础IO类之缓冲流

    首先要明确一个概念: 对文件或其他目标频繁的读写操作,效率低,性能差. 使用缓冲流的好处是:能够高效的读写信息,原理是先将数据先缓冲起来,然后一起写入或者读取出来. 对于字节: BufferedInp ...

  4. Java基础IO类之对象流与序列化

    对象流的两个类: ObjectOutputStream:将Java对象的基本数据类型和图形写入OutputStream ObjectInputStream:对以前使用ObjectOutputStrea ...

  5. Java基础IO类之字符串流(查字符串中的单词数量)与管道流

    一.字符串流 定义:字符串流(StringReader),以一个字符为数据源,来构造一个字符流. 作用:在Web开发中,我们经常要从服务器上获取数据,数据返回的格式通常一个字符串(XML.JSON), ...

  6. Java基础IO类之打印流

    package IODemo; import java.io.*; /* 打印流 : 很方便的进行输出 字节打印流 增强输出功能 字符打印流 */ public class PrintStreamDe ...

  7. Java的IO操作之关闭流

    我们知道,当结束对一个流的操作时,需要调用流的close()方法对其进行释放,这将释放掉与这个流有关的所有资源,包括文件句柄.端口等.如果不关闭流,垃圾回收机制将无法识别你是否已使用完这个文件,读取的 ...

  8. Java文件(io)编程——文件字符流的使用

    案例1: 读取一个文件并写入到另一个文件中,char[] 来中转. 首先要在E盘下创建一个文本文档,命名为test.txt,输入一些字符串. public class Demo_5 { public ...

  9. Java之IO流详解

    IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. ...

随机推荐

  1. python面向对象基础(三)内置方法 __xx__

    __str__和__repr__,__format__ 改变对象的字符串显示__str__,__repr__ 自定制格式化字符串__format__ #_*_coding:utf-8_*_ forma ...

  2. VIDENT iSmart900自动多系统扫描工具OBDII支持ABS / SRS / EPB /传输诊断DPF再生/上油复位编码电池配置

    Vident系列中有许多多功能产品,其中最好的是Vident iSmart 900.购买视频系列后,以下是用户的一些评论 乔:因为我想它很好用.该工具很容易更新.我将公制重量单位的代码放到工具中.很容 ...

  3. 彻底卸载干净docker并且安装docker 指定版本

    yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-la ...

  4. Confluence 6.15 使用附件宏

    希望添加附件宏到一个页面中: 从编辑工具栏中,选择 插入(Insert)   > 其他宏(Other Macros) 找到并且选择需要的宏. 可用使用自动完成加快这个过程:输入 { 然后开始输入 ...

  5. Node.js 安装与开发

    Node.js 简介 Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.Node.js对一些 ...

  6. XOR Guessing

    ​ E. XOR Guessing 第一次做这种交互题,刚开始还看不懂,现在已经差不多可以理解了,清空缓存区用cout<<endl;即可,需要注意的是,如果用fflush(stdout)来 ...

  7. Vue_(基础)商品管理-demo

    实现对商品的增加.删除.数量的修改功能 删除商品可选择直接删除当前商品.删除选中商品.删除所有商品 添加商品时会自动添加日期字段 商品的属性 goods : { id : '', name : '', ...

  8. [清华集训2016]如何优雅地求和——NTT

    题目链接: [清华集训2016]如何优雅地求和 题目大意:给出一个多项式$m+1$个点值$a_{0},a_{1}...a_{m}$(其中$f(i)=a_{i}$),并给出两个数$n,x$,求$Q(f, ...

  9. echarts ajax请求demo

    <body> <!--为ECharts准备一个具备大小(宽高)的Dom--> <div id="main" style="width: 10 ...

  10. 解决Vue在IE中报错出现不支持=>等ES6语法和“Promise”未定义等问题

    在做VUE项目中大家可能会发现除了IE内核浏览器之外项目都能正常显示,但是到IE就萎了,这主要是IE不支持ES6的原因. 要解决这个我们要先引入browser.js,这样你可以使用ES2015(jav ...