链接地址: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 exists
if (!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快速教程”系列文章

Java进阶03 IO基础的更多相关文章

  1. Java进阶03 IO基础(转载)

    IO示例 下面是演示的文件file.txt Hello World! Hello Nerd! 先来研究一个文件读取的例子: import java.io.*;public class Test{ pu ...

  2. java进阶(33)--IO流

    一.IO流概念:1.基本概念2.IO流分类3.java.io流的四大家族4.流的close和flush方法5.java.id下常用的16个流 二.FileInputStream字节输入流1.FileI ...

  3. java IO基础操作

    java IO基础,通熟易懂,好久没复习java 基础了.这里是传送门... http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.ht ...

  4. java Vamei快速教程15 IO基础

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机最重要的功能是处理数据.一个有用的计算机语言需要拥有良好的IO功能,以便让未 ...

  5. 归纳从文件中读取数据的六种方法-JAVA IO基础总结第2篇

    在上一篇文章中,我为大家介绍了<5种创建文件并写入文件数据的方法>,本节我们为大家来介绍6种从文件中读取数据的方法. 另外为了方便大家理解,我为这一篇文章录制了对应的视频:总结java从文 ...

  6. 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇

    本文是Java IO总结系列篇的第3篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  7. 总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

    本文是Java IO总结系列篇的第4篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  8. 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  9. # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结

    095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

随机推荐

  1. Android的重力传感器(3轴加速度传感器)简单实例

    重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会 ...

  2. php:根据中文裁减字符串函数方法

    define(CHARSET, 'UTF-8'); // 系统默认编码 /** * 根据中文裁减字符串 * @param $string - 字符串 * @param $length - 长度 * @ ...

  3. c#与.NET的区别

    C#与.NET的关系 C# 可以通过.NET平台来编写 部署 运行.NET应用程序VB.NET.......NET语言 C#是专门为.NET平台而生的(面向对象) .NET平台的重要组成:1.FCL- ...

  4. Ext JS学习第八天 Ext基础之 认识Ext.js 和Ext-more.js

    此文来记录学习笔记: •认识Ext.js 和Ext-more.js •首先,我们要知道这2个js文件的作用,这俩个文件包含了Ext的一些基础定义.基本的属性和方法,我们要重点学习和深入底层代码进行研究 ...

  5. javaweb学习路之一--web项目搭建

    概述: 工作闲暇时间想要自己搭建一个web项目玩玩,没想到大半天才弄了一个springMVC+mybatis的网站,简直菜的不行,以下记录所有的步骤加深印象 使用环境 1.jdk1.8 2.maven ...

  6. 最简单的javascript 竖向菜单

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  7. C# 读取Excel日期格式

    读取Excel日期数据,一种方式是在EXCEL中把你的日期列的格式设置一下,设成"文本"型. 如果单元格格式设置为date,则在后台读出的数值是一个数值,如2008-08-08读出 ...

  8. JavaScript 导学推荐

    基本开始js学习的时候,可能会觉得很混乱,一开始都是从一些简单的表单验证还有拷贝别人效果代码,然后再慢慢去深入了解.我是觉得js是需要一定语言编程基础,我是觉得随着深入,JS的里面实在不算太好理解,个 ...

  9. 【转】从底层了解ASP.NET体系结构

    从底层了解ASP.NET体系结构 原文:http://blog.csdn.net/zhoufoxcn/article/details/1890158 Java体系架构的书多如牛毛,比如SSH架构什么的 ...

  10. 【随手记-有空整理】使用PHPMailer和QQ邮箱实现邮件的自动发送

    使用PHPMailer和QQ邮箱发送邮件时,在密码一栏里要填写QQ邮箱提供的授权码,而不是邮箱的登录密码 授权码获取可参考:http://service.mail.qq.com/cgi-bin/hel ...