Java培训实战教程之叩丁狼JavaNIO分享

Java中的I/O流或者输入/输出流是指数据在本地文件或网络中以流的方式进行传输。新的输入/输出(NIO)库是在JDK1.4版本中引入的。NIO弥补了原来的I/O的不足,它在标准Java代码中提供了高速的、面向块的I/O。

  原来的I/O库与NIO最重要的区别是数据打包和传输方式的不同,原来的I/O以流的方式处理数据,而NIO以块的方式处理数据。

  面向流的I/O系统一次一个字节地处理数据。一个输入流读取一个字节的数据,一个输出流写出一个字节的数据,为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的I/O通常相当慢。

  NIO与原来的I/O有同样的作用和目的,但是它使用块I/O的处理方式。每一个操作都在一步中读取或者写出一个数据块。按块处理数据比按流式的字节处理数据要快很多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。

  下面我们从一个简单的使用IO和NIO读取一个文件中的内容为例,进行NIO的学习。

  * 使用IO读取指定文件的前1024个字节的内容

  * @param file 指定文件名称

  * @throws java.io.IOException IO异常

  */

  public void ioRead(String file) throws IOException {

  FileInputStream in = new FileInputStream(file);

  byte[] b = new byte[1024];

  in.read( b );

  System.out.println(new String(b));

  }

  /**

  * 使用NIO读取指定文件的前1024个字节的内容

  * @param file 指定文件名称

  * @throws java.io.IOException IO异常

  */

  public void nioRead(Stirng file) thorws IOException {

  FileInputStream in = new FileInputStream(file);

  FileChannel channel = in.getChanel();

  ByteBuffer buffer = ByteBuffer.allocate(1024);

  channel.read( buffer );

  byte[] b = buffer.array();

  System.out.println( new String( b ));

  通道和缓冲区是NIO中的核心对象,几乎在每一个I/O操作中都要使用它们。

  缓冲区(Buffer)实质上是一个容器对象,它包含一些要写入或者刚读出的数据。在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别。

  在面向流的I/O中,将数据直接写入或者将数据直接读到Stream对象中。

  在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问NIO中的数据,都是将它放到缓冲区中。

  缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。最常用的缓冲区类型是ByteBuffer。 一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。

  通道(Channel)是对原I/O包中的流的模拟,可以通过它读取和写入数据。拿NIO与原来的I/O做个比较,通道就像是流。

  正如前面提到的,所有数据都通过Buffer对象来处理。永远不会将字节直接写入通道中,相反,而会将数据写入包含一个或者多个字节的缓冲区。同样,不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

  通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是

  InputStream或者OutputStream的子类), 而通道可以用于读、写或者同时用于读写。

  读和写是I/O的基本过程。从一个通道中读取很简单:只需创建一个缓冲区,然后让通道将数据读到这个缓冲区中。写入也相当简单:创建一个缓冲区,用数据填充它,然后让通 道用这些数据来执行写入操作。

  如果使用原来的I/O,那么我们只需创建一个FileInputStream并从它那里读取。而在NIO中,情况稍有不同:我们首先从FileInputStream获取一个FileChannel对象,然后使用这个通道来读取数据。

  在NIO系统中,任何时候执行一个读操作,都是从通道中读取,但是不是直接从通道读取。因为所有数据最终都驻留在缓冲区中,所以是从通道读到缓冲区中。

  现在,让我们看一下NIO基本读写数据的过程。

  在NIO中读取文件涉及的三个步骤:

  // 第一步是获取通道。我们从 FileInputStream 获取通道:

  FileInputStream fin = new FileInputStream( readandshow.txt );

  FileChannel fc = fin.getChannel();

  // 下一步是创建缓冲区:

  ByteBuffer buffer = ByteBuffer.allocate( 1024 );

  // 最后,需要将数据从通道读到缓冲区中:

  fc.read( buffer );

  // 首先从 FileOutputStream 获取一个通道:

  FileOutputStream fout = new FileOutputStream( writesomebytes.txt );

  FileChannel fc = fout.getChannel();

  // 下一步是创建一个缓冲区并在其中放入一些数据,这里,用data来表示一个持有数据的数组。

  ByteBuffer buffer = ByteBuffer.allocate( 1024 );

  for (int i=0; i data.length; ++i) {

  buffer.put( data[i] );

  }

  buffer.flip();

  // 最后一步是写入缓冲区中:

  fc.write( buffer );

  * 首先创建一个 Buffer

  * 然后从源文件中将数据读到这个缓冲区中

  * 最后将缓冲区写入目标文件

  * 程序不断重复(读、写、读、写) 直到源文件结束

  */

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

  String infile = C:\\copy.sql String outfile = C:\\copy.txt

  // 获取源文件和目标文件的输入输出流

  FileInputStream fin = new FileInputStream(infile);

  FileOutputStream fout = new FileOutputStream(outfile);

  // 获取输入输出通道

  FileChannel fcin = fin.getChannel();

  FileChannel fcout = fout.getChannel();

  // 创建缓冲区

  ByteBuffer buffer = ByteBuffer.allocate(1024);

  while (true) {

  // clear方法,重设缓冲区,使它可以接受读入的数据

  buffer.clear();

  // 从输入通道中将数据读到缓冲区

  int r = fcin.read(buffer);

  // read方法,返回读取的字节数,可能为零,如果该通道已到达流的末尾则返回-1

  if (r == -1) {

  break;

  }

  // flip方法,让缓冲区可以将新读入的数据,写入到另一个通道中

  buffer.flip();

  // 从输出通道中将数据写入缓冲区

  fcout.write(buffer);

  }

Java培训实战教程之叩丁狼JavaNIO分享相关推荐

  1. 叩丁狼分享—培训实战教程之浅谈过滤器Filter

    一.过滤器的基本概念Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Htt ...

  2. 叩丁狼—Java培训实战教程之mysql优化

    Java培训实战教程之mysql优化 Java培训过程中精点.难点知识解析 1. mysql引擎1.1. 引擎类型MySQL常用的存储引擎为MyISAM.InnoDB.MEMORY.MERGE,其中I ...

  3. 卖任小龙java视频,任小龙Java大神之路(第九季 SpringMVC)视频教程叩丁狼教育出品...

    大家好咱们开始上课,在正式上课之前咱们先花点时间来对我们接下来的这个课程,然后做一个大概的一个介绍 之前咱们讲的这个spring帝国,讲了十分的核心,对吧?然后在当初的时候咱们还有一块内容是没有讲到的 ...

  4. JAVA期末考广东科技学院,我是叩丁狼广州Java老学员,我来说说自己的故事

    我后来也推荐了一个朋友过来培训,他是我之前船厂的同事,年纪比我还要大点.他很早就想转行做编程了,也问了身边很多朋友,最后选了叩丁狼.不过不是我主动去游说的,是他各方打听做了对比后做出的选择. 在这里, ...

  5. audio h5 src 变了之后_我在叩丁狼学H5

    #我在叩丁狼学H5#最近接触到了一些前端框架,像Vue.js,React,发现小程序的框架体系跟它们很像.它们都推崇模块化,组件化,数据与元素绑定.这样没有繁琐的DOM操作,组件之间完全分离,样式和逻 ...

  6. android 重复解绑服务,Android培训实战教程之多次解绑抛出异常原因

    Android培训实战教程之多次解绑抛出异常原因 更新时间:2015年12月28日14时27分 来源:传智播客Android培训学院 浏览次数: 多次解绑服务(unBindService)抛出异常原因 ...

  7. java培训班教程视频最新尚硅谷Java培训全套教程

        尚硅谷Bank项目–0 5.尚硅谷全套JAVA教程–面试阶段–0 4.尚硅谷全套JAVA教程–JavaEE阶段–0 3.尚硅谷全套JAVA教程–JavaWEB阶段–0 2.尚硅谷全套JAVA教 ...

  8. SQL基础培训实战教程[全套]

    学习简介:林枫山根据网上搜索资料进行参考,编写制作的SQL Server实操学习教程,欢迎下载学习. 下载链接目录如下: 进度0-SQL基础语法    下载学习文档 进度1-建数据表-美化版-2018 ...

  9. 2019年某JAVA编程实战教程 办公自动化OA项目实例

    课程目录 OA视频01.avi OA视频02.avi OA视频03.avi OA视频04.avi OA视频05.avi OA视频06.avi OA视频07.avi OA视频08.avi OA视频09. ...

最新文章

  1. 2022-2028年全球与中国乳胶丝市场研究及前瞻分析报告
  2. 仿iOS中图标的抖动
  3. 华为手机接计算机,华为手机怎么连接电脑,详细教您华为手机怎么连接电脑
  4. Linux学习:静态库和动态库
  5. ubuntu linux 批量部署,使用Cobbler批量部署Linux和Windows:CentOS/Ubuntu批量安装(二)...
  6. 设计模式学习笔记——外观(Facade)模式
  7. opencv android模版匹配,Opencv for android 模板匹配
  8. Python工作笔记006---在centos命令行里进入和退出Python程序
  9. OSChina 周一乱弹 —— 有钱人的故事真让人心动
  10. avaya CM查看VDN指向的技能组
  11. 如何更改Excel2016中折线图的连接点颜色和样式?
  12. 163邮箱提示: 535 Error: authentication failed
  13. python 按行读取_python按行读取
  14. 母牛的故事【HDOJ2018】
  15. 四级地址插件升级改造(京东商城地址选择插件)city-picker
  16. 只知道三角形三条边长不知道高是多少,用Python如何求三角形周长和面积,海伦公式帮你解决这个难题
  17. 注册微信小程序的操作步骤
  18. angular : 自定义组件双向绑定 [(ngModel)]
  19. 移动端如何强制页面横屏
  20. 使用Maya的XGen快速头发建模

热门文章

  1. 无效的列类型:1111解决方法
  2. 【Linux】SSH远程执行命令
  3. shell ssh远程执行命令
  4. [小说连载]张小庆,在路上(1)- 找工作
  5. Hexo Next开启阅读全文
  6. C++学习--static函数,内联(inline)函数, 友元 (friend) 函数
  7. vue canvas 方法无效_3 分钟,教会你如何用 Vue 实现 Google 搜索中灭霸的无限手套...
  8. 在线sqli-labs 通关大全 Less-2
  9. python协程和线程区别_python中的线程和协程之间有什么区别
  10. 无APP推送服务PushDeer的搭建