通过对文件的拷贝来对比传统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. Hadoop-No.12之数据采集的时效性

    数据采集的时效性,指的是可进行数据采集的时间与Hadoop中工具可访问数量的时间之间的间隔.采集架构的时间分类会对存储媒介和采集方法造成很大的影响. 一般来说,在设计应用的采集构架之前建议使用以下分类 ...

  2. Bootloader - Main system - Recovery的三角关系

    原文地址:http://blog.csdn.net/myarrow/article/details/8115610 一.MTD分区:BOOT:        boot.img,Linux kernel ...

  3. Spring——注解

    一.IOC注解 1.用于向Spring容器中注入bean: @Component:向Spring容器中注入bean @Repository:用于标注Dao层 @Service:用于标注Service业 ...

  4. AtCoder AGC004E Salvage Robots (DP)

    题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_e 题解 本题的难度不在于想到大体思路,而在于如何把代码写对.. 首先我们可以不让机器人动,让 ...

  5. 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题

        方法使用前需了解: 来自”和“小编的小提示: 首先打印一下this.$refs[formName],检查是否拿到了正确的需要验证的form. 其次在拿到了正确的form后,检查该form上添加 ...

  6. CSP2019游(AFO?)记

    Day 1 不知道为啥一看到\(T1\)就想到\(longlong\)可能存不下,试了下果然. \(T2\)想了半个小时胡出个\(O(n)\)算法,但是假了.冷静了一下,做了前缀和之后,合法的子区间\ ...

  7. Centos-Redhat下远程桌面的方法 & Redhat改Centos源

    折腾了好几天才搞定,Redhat下远程桌面的方法,首先保证本身已经装了桌面,并且可以ssh访问 由于系统中自带python2环境,装了anaconda以及它带的python3环境,这个必须存在(前提) ...

  8. SVN如何处理包含@2x or @3x的图片文件

    一般iOS图片文件都会包含@2x,@3x之类的字符比如icon@2x,icon@3x,当你在svn命令行中add或是delete的时候总是报错说file does not exit之类的错误,其实之类 ...

  9. 将maven项目发布到私服

    1.局域网私服 首先保证已经安装配置好了局域网的私服(具体私服的搭建可以查看相关资料) 私服页面访问地址:http://192.168.0.110:8081/nexus,使用admin登录,默认的用户 ...

  10. How to Fix Grub error: no such partition Grub Rescue

    错误信息: error: no such partition Entering rescue mode... grub rescue> _ 错误原因: grub找不到文件normal.mod 解 ...