通过对文件的拷贝来对比传统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. HDU-3613-Best Reward(Manacher, 前缀和)

    链接: https://vjudge.net/problem/HDU-3613 题意: After an uphill battle, General Li won a great victory. ...

  3. pro git 读书笔记 1

    Git 1 - Getting Started Git 的特点 Git 存储每个版本的快照:其他 VCS(版本控制系统) 存储两个版本的变化之处 好处参考 Git 分支章节 Git 几乎所有操作都是本 ...

  4. 数据类型之字符串类型与Number类型

    ㈠字符串类型 ⑴在JS中字符串需要使用引号引起来 ⑵使用双引号或单引号都可以,但是不要混着用 ⑶引号不能嵌套,双引号不能放双引号,单引号不能放单引号 ⑷在字符串中,可以使用“\”作为转义字符,当表示一 ...

  5. HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)

    HYSBZ - 3813奇数国 中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的.所 ...

  6. HZOJ 20190727 T2 单(树上dp+乱搞?+乱推式子?+dfs?)

    考试T2,考试时想到了40pts解法,即对于求b数组,随便瞎搞一下就oxxk,求a的话,很明显的高斯消元,但考试时不会打+没开double挂成10pts(我真sb),感觉考试策略还是不够成熟,而且感觉 ...

  7. POJ2176 Folding

    POJ2176 Folding 描述 给定一个长度不超过100的字符串,求其"压缩"后长度最短的字符串.如有多个,输出任意即可. 其中对于一个字符串\(str\)的"压缩 ...

  8. DelayQueue实现延迟队列

    public class Q { public static void main(String[] args) throws Exception { DelayQueue<Order> o ...

  9. Primes and Multiplication

    C - Primes and Multiplication 思路:找到x的所有质数因子,用一个vector储存起来,然后对于每一个质因子来说,我们要找到它对最后的答案的贡献的大小,即要找到它在最后的乘 ...

  10. Java线程之synchronized

    翻译:https://www.journaldev.com/1061/thread-safety-in-java 我们知道线程安全在Java中是一个非常重要的主题,当多个线程操作共享数据时,如果没有任 ...