计算机最重要的功能是处理数据。一个有用的计算机语言需要拥有良好的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中的文本流思想很相似。在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中的类及其功能。

By Facker:

package blogjavaTest;

import java.io.*;

/**

* @author Facker

* @title Reader Writer

* @value 文件的写入和读出

*/

public class Test {

void test() {

try {

String content = "Thank you for Vamei.";

File file = new File("F: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");

}

}

void test1() {

try {

BufferedReader br = new BufferedReader(new FileReader("F:new.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");

}

}

public static void main(String[] args) {

Test s = new Test();

s.test(); // 写入

s.test1();// 读出

}

}

java listen_Java进阶-IO基础相关推荐

  1. Java基础进阶IO流概述

    1.IO流,什么是IO? I : Input O : Output 通过IO可以完成硬盘文件的读和写. 2.IO流的分类? 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物 往内存 ...

  2. Java语言基础(Java自我进阶笔记二)

    Java语言基础(Java自我进阶笔记二) 一. 什么是Java 的主类结构? 1. #mermaid-svg-xWTL2A8kDyyRPexH .label{font-family:'trebuch ...

  3. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

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

  4. 【JAVA核心知识】6.1: JAVA IO基础

    IO基础 1 输入与输出 2 流 2.1 字节流 2.2 字符流 3 阻塞IO与非阻塞IO 3.1 阻塞IO 3.2 非阻塞IO 3.3 生活举例 4 同步IO与异步IO 4.1 同步IO 4.2 异 ...

  5. 打怪升级之小白的大数据之旅(二十五)<Java面向对象进阶之IO流三 其他常见流>

    打怪升级之小白的大数据之旅(二十五) Java面向对象进阶之IO流三 其他常见流 上次回顾 上一章,我们学习了常用的字节流与字符流,本章,我会将其他的一些常见的流进行分享,IO流很多,我介绍不完,就挑 ...

  6. 笔记整理2----Java语言基础(二)06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础

    06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础 第06天 java基础语法 今日内容介绍  Eclipse断点调试  基 ...

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

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

  8. java流程图表示输入 输出_Java IO基础总结

    Java IO基础总结 Java中使用IO(输入输出)来读取和写入,根据数据走向可分为输入流和输出流,用户可以从输入流中中读取信息,但不能写它,相反,对输出流,只能往输入流写,而不能读它(输入流表示从 ...

  9. Java IO基础总结

    Java中使用IO(输入输出)来读取和写入,读写设备上的数据.硬盘文件.内存.键盘...... 根据数据的走向可分为输入流和输出流,这个走向是以内存为基准的,即往内存中读数据是输入流,从内存中往外写是 ...

最新文章

  1. 超详细单机版搭建hadoop环境图文解析
  2. 相同VLAN跨交换机通信
  3. java定义一个盒子类box_定义一个Box(盒子)类,在该类定义中包括数据成员: length(长),width(宽)和height(...
  4. android usb host hid,Android USB Host与HID通讯
  5. python学习-知识点进阶使用(end、while else、range、iter、list的多种遍历方式)
  6. 那个抗血栓机器人_礼来抗血栓药物普拉格雷(Effient)不及波利维(Plavix)
  7. 电脑键盘按钮功能注释大全
  8. “约见”面试官系列之常见面试题第五篇说说vuex登录信息(建议收藏)
  9. 线程池最佳线程数量到底要如何配置?
  10. 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。
  11. leetcode —— 1038. 从二叉搜索树到更大和树
  12. 微软账号 被阻止登录会自动解锁码_WPS Office 13.2.0 国际解锁高级版 清爽无广告...
  13. numpy-array
  14. Hie with the Pie(poj3311)
  15. 50道经典计算机网络面试题梳理
  16. docker-compose+postsql多容器部署django-vue项目
  17. 谷歌搜索引擎API使用
  18. 广州红海云计算股份有限公司获全球软件最高级别CMMI5认证
  19. 流媒体(视频)开发常用调试工具
  20. 欢迎注册和登陆我们的学海灯塔

热门文章

  1. 8屏 旌宇多屏管理软件_如何选择拼接屏,不能说的秘密,都在这!
  2. 信息系统管理工程师_关于备考信息系统项目管理师、系统集成项目管理工程师考试几点小建议...
  3. 2d fft matlab,证明2D-FFT能够拆分成两个1D-FFT
  4. 完全复制 mysql,MySQL完全复制表结构
  5. Leet Code题解 - 1559. Detect Cycles in 2D Grid 检测二维无向图中的环
  6. linux 安装mysql make_Linux安装mysql——源码安装
  7. 『设计模式』设计模式--原型模式
  8. 『设计模式』一张图告诉你UML图怎么画❀
  9. 体感俄罗斯方块,CPU就能跑,全开源
  10. 玩转GIT系列之【git submodule update出错提示子模组未对路径注册】