链接地址:http://www.cnblogs.com/vamei/archive/2013/04/11/3000905.html

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

计算机最重要的功能是处理数据。一个有用的计算机语言需要拥有良好的IO功能,以便让未处理的数据流入程序,让已处理的数据流出。

与其他语言相比,Java的IO功能显得复杂。在其他语言中,许多IO功能(比如读取文件),是被封装好的,可以用一两行程序实现。在Java中,程序员往往需要多个层次的装饰(decoration),才能实现文件读取。

相对的复杂性带来的好处是IO的灵活性。在Java中,程序员可以控制IO的整个流程,从而设计出最好的IO方式。我们将在下文看到更多。

IO示例

下面是我用于演示的文件file.txt

Hello World!
Hello Nerd!

我们先来研究一个文件读取的例子:

import java.io.*;public class Test
{public static void main(String[] args){try {            BufferedReader br =              new BufferedReader(new FileReader("file.txt")); String line = br.readLine();while (line != null) {System.out.println(line);line = br.readLine();}            br.close();}catch(IOException e) {System.out.println("IO Problem");}}
}

这段程序中包含一个try...catch...finally的异常处理器。可参考Java进阶02 异常处理

装饰器与功能组合

程序IO的关键在于创建BufferedReader对象br:

BufferedReader br = new BufferedReader(new FileReader("file.txt"));

在创建的过程中,我们先建立了一个FileReader对象,这个对象的功能是从文件"file.txt"中读取字节(byte)流,并转换为文本流。在Java中,标准的文本编码方式为unicode。BufferedReader()接收该FileReader对象,并拓展FileReader的功能,新建出一个BufferedReader对象。该对象除了有上述的文件读取和转换的功能外,还提供了缓存读取(buffered)的功能。最后,我们通过对br对象调用readLine()方法,可以逐行的读取文件。

(缓存读取是在内存中开辟一片区域作为缓存,该区域存放FileReader读出的文本流。当该缓存的内容被读走后(比如readLine()命令),缓存会加载后续的文本流。)

BufferedReader()是一个装饰器(decorator),它接收一个原始的对象,并返回一个经过装饰的、功能更复杂的对象。修饰器的好处是,它可以用于修饰不同的对象。我们这里被修饰的是从文件中读取的文本流。其他的文本流,比如标准输入,网络传输的流等等,都可以被BufferedReader()修饰,从而实现缓存读取。

下图显示了br的工作方式,数据自下而上流动:

(文本流可参考Linux文本流和TCP协议与流通信)

上述的装饰过程与Linux中的文本流思想很相似。在Linux中,我们使用类似函数的方式来处理和传递文本流。在Java中,我们使用了装饰器。但它们的目的都类似,就是实现功能的模块化和自由组合。

更多的组合

事实上,Java提供了丰富的装饰器。FileReader中合并了读取和转换两个步骤,并采用了常用的默认设置,比如编码采取unicode。我们可以使用FileInputStream + InputStreamReader的组合来替代FileReader,从而分离读取字节和转换两个步骤,并对两个过程有更好的控制。

(当然,FileReader的使用更加方便。InputStreamReader是将FileInputStream转换成一个Reader,用于处理unicode文本)

箭头表示数据流动方向

流的读写来自于四个基类: InputStream, OutputStream, Reader和Writer。InputStream和Reader是处理读取操作,OutputStream和Writer是处理写入操作。它们都位于java.io包中。继承关系如下:

java.io

此外,IOException有如下衍生类:

IOException

Reader和Writer及其衍生类是处理unicode文本。如我们看到的Buffered Reader, InputStreamReader或者FileReader。

InputStream和OutputStream及其衍生类是处理字节(byte)流。计算机中的数据都可以认为是字节形式,所以InputStream和OutputStream可用于处理更加广泛的数据。比如我们可以使用下面的组合来读取压缩文件中包含的数据(比如整数):

箭头表示数据流动方向

我们从压缩文件中读出字节流,然后解压缩,最终读出数据。

写入

写入(write)操作与读取操作相似。我们可以通过使用装饰,实现复杂的写入功能。这里是一个简单的写入文本的例子:

import java.io.*;public class Test
{public static void main(String[] args){try {String content = "Thank you for your fish.";File file = new File("new.txt");// create the file if doesn't existsif (!file.exists()) {file.createNewFile();}FileWriter fw = new FileWriter(file.getAbsoluteFile());BufferedWriter bw = new BufferedWriter(fw);bw.write(content);bw.close();}catch(IOException e) {System.out.println("IO Problem");}}
}

上面创建了file对象,用于处理文件路径。

总结

这里只是对Java IO的基本介绍。Java的IO相对比较复杂。Java程序员需要花一些时间来熟悉java.io中的类及其功能。

欢迎继续阅读“Java快速教程”系列文章

转载于:https://www.cnblogs.com/wvqusrtg/p/4992427.html

Java进阶03 IO基础相关推荐

  1. java进阶 2018_Java Web基础入门2018版

    步骤1: Java Web基础入门 本步骤带领大家进入Java Web的世界,除了介绍JSP和Servlet以外,还会介绍开发工具IntelliJ IDEA的使用,以及什么是XML.最后会学习MVC模 ...

  2. [java进阶]2.Jedis基础与List的接口

    1. Jedis应用与基本连接 jedis 是 redis推荐的java客户端.通过Jedis可以很方便地使用java代码的方式,从而对redis进行操作.jedis使用起来比较简单,它的操作方法与r ...

  3. 【02】Java进阶:18-MySQL基础、数据库概述、数据库的安装/卸载/启动/登录、SQL概述、DDL操作数据库、DDL操作表、DML增删改查、

    day18-MySql基础 今日内容 数据库概述 数据库安装和卸载 SQL语句 DDL-----操作数据库,操作表 DML-----操作记录(增删改) DQL------操作记录(查) 学习目标 能够 ...

  4. java大乘期(33)----java进阶(springboot基础(1)----springboot基本概念)

    以下内容基于spring,maven 为啥要用(学习)springboot? 学习springboot之前你必须先对spring有足够的了解,并且对它要有一定的体会,因为只有对spring的体会越深刻 ...

  5. Java 自学路线图之 Java 进阶自学

    文章目录 Java 自学路线图的第二阶段是 Java 语言进阶自学,在自学了第一阶段的 Java 基础自学后,大家对 Java 语言编程有了初步的了解和认识,建议在第一部分自学后整理一下自己的自学思路 ...

  6. JavaSE进阶:IO流

    目录 1.流的概念 2.流的分类 3.字节流 1.字节流的父类 2.文件字节流 1.ASCALL码对照表 2.文件字节输入流 3.文件字节输出流 4.文件字节流来实现文件的复制 3.字节缓冲流 1.B ...

  7. java中的IO流(超全)(超详解)结合实例轻松掌握

    java进阶之IO流 IO流的概念(大纲): 1.InputStream和OutputStream的继承关系图 2.Reader和Writer的继承关系图 3.文件专属流(加※为重点掌握) ※File ...

  8. java listen_Java进阶-IO基础

    计算机最重要的功能是处理数据.一个有用的计算机语言需要拥有良好的IO功能,以便让未处理的数据流入程序,让已处理的数据流出. 与其他语言相比,Java的IO功能显得复杂.在其他语言中,许多IO功能(比如 ...

  9. Java基础到Java进阶——Java小白的历练之路------从0到1,开卷!

    Java小白的历练之路------从0到1 title: Java Essay date: 2022-09-07 08:58:32 tags: Java notes 写在前面: 免责声明:本笔记来源自 ...

  10. java进阶基础---2.3---IO流的概念及示例

    小梁同学 の Java学习旅途 你好! 这是小梁同学使用 博客 所记录的文章笔记,作为一个初学者的从基础到未来的记录,如果你想和我一起在Java学习路程上坚持下去,欢迎你的关注与指正. 以下所有有关代 ...

最新文章

  1. 【win PE】磁盘分区大小的重新调整 (再也不用担心C盘过小了)
  2. GContracts1.1.0支持前置/后置条件的继承
  3. 特征值与特征向量_机器学习和线性代数 - 特征值和特征向量
  4. 工作原理是什么_磁翻板液位计工作原理是什么?
  5. An HTML5 presentation builder — Read more
  6. Oracle GoldenGate简介
  7. amazon alexa_亚马逊使向自定义Alexa Skills添加声音变得更加容易
  8. JQuery自动点击事件加载load事件和 AJAX异步请求加载
  9. Quartus II 与ModelSim-Altera联合仿真PLL
  10. phpnow 升级 php 5.4,PHPnow 升级 php 5.4 的方法
  11. 解决docker中启动Spring Boot微服务注册在Eureka后无法访问的问题
  12. 计算机考试综合模块怎么做,《综合素质》几大模块备考指导要知道!
  13. SQL_删除重复项数据
  14. ajax上传文件报错The current request is not a multipart request的解决办法
  15. jbpm开发实战----委托
  16. smart-doc 使用说明
  17. BUU XSS COURSE 1 wp XSS平台在线注册
  18. moxa服务器udp协议设定,Moxa Nport串口服务器漏洞全球统计报告(Moxa Nport Vulnerability Global Census Report)...
  19. 获取OpenStreetMap的边界值GeoJSON数据
  20. VOS中开启媒体转发功能后,计算几种常用编码所需占用的带宽量

热门文章

  1. 【pytorch】常见的坑汇总
  2. 【学术分享】写论文必须养成的十大良好写作习惯
  3. 【论文解读】LGN: 基于词典构建的中文NER图神经网络
  4. 【Python】106页的《python进阶》,附下载
  5. nlp基础—11.条件随机场模型(CRF)模型补充
  6. 面向对象编程——实战1
  7. Windows和Linux hosts 文件位置
  8. 如果你是加勒比海盗首领,会选择哪种算法来使价值最大化?
  9. 微软官方的《Power BI权威指南》译版发售
  10. 互联网之达芬奇密码:浪潮揭秘:与中国五亿网民互为影响的互联网DNA