java.io

9.1.1 字符流

Reader为读取器(reader)提供API和部分实现,读取器是读取16位字符的流;

Writer为写出器(writer)提供API和部分实现,写出器是写16位字符的流。

一般用来读写文本信息,因为可以处理Unicode字符集中的任何字符,而字节流只能处理ISO-Latin-18位字节??

9.1.2 字节流

读写8位字节,用InputStream和OutputStream的后代。

InputStream和OutputStream为输入流(input stream,读取8位字节的流)和输出流(output stream,写8位字节流)提供部分API和部分实现。通常用于读写二进制数据,比如图象和声音。

9.1.3 理解I/O超类

所有流都在创建时自动打开,应该通过调用流的close方法显示地关闭流,否则垃圾收集器会自动地关闭它。

9.2 使用流

I/O类型:内存,管道,文件,联结,对象串行化,数据转换,计数,预览,打印,缓冲,过滤,在字节和字符之间进行转换。

9.2.1 如何使用文件流

文件流FileReader, FileWriter, FileInputStream和FileOutputStream都对本机文件系统上的一个文件进行读写。可以从一个文件名创建文件流,文件名的形式可以是字符串、File对象或FileDescriptor对象。

import java.io.*;

public class Copy{

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

File inputFile = new File("farrago.txt");

File outputFile = new File("outagain.txt");

FileReader in = new FileReader(inputFile);

FileWriter out = new FileWriter(outputFile);

int c;

while((c = in.read()) != -1){

out.write(c);

}

in.close();

out.close();

}

}

FileReader和FileWriter读写16位的字符。在进行读写时,这些流根据默认的字符编码对字符进行编码。通过调用System.getProperty(“file.encoding”)可以得到默认字符编码的名称。要想指定默认字符编码之外的另一种字符编码,应该在一个FileOutputStream上构造一个OutputStreamWriter并指定编码。

9.2.2 如何使用管道流

管道用于将一个线程的输出链接到另一个线程的输入。

程序RhymingWords使用PipedReader和PipedWriter将它的reverse和sort方法的输入输出连接起来一遍创建一个”押韵”的单词列表。

程序见RhymingWords.java。

FileReader words = new FileReader("words.txt");

Reader rhymedWords = reverse(sort(reverse(words)));

其中reverse方法:

public static Reader reverse(Reader source) throws IOException {

BufferedReader in = new BufferedReader(source);

 PipedWriter pipeOut = new PipedWriter();

        PipedReader pipeIn = new PipedReader(pipeOut);

PrintWriter out = new PrintWriter(pipeOut);

new ReverseThread(out, in).start();

return pipeIn;

}

创建管道的两端(PipedWriter和PipedReader),并且通过在PipedWriter上构造PipedReader将它们连接起来。写到PipedWriter上的内容都从PipedReader读取。这个连接就组成了管道。

reverse方法启动一个ReserveThread线程,它将它的输出写到PipedWriter并向调用者返回PipedReader。然后调用者安排一个线程从PipedReader读取数据。

9.2.3 如何封装流

BufferedReader in = new BufferedReader(source);

……

PrintWriter out = new PrintWriter(pipeOut);

此代码在source上打开一个BufferedReader,source是另一个不同类型的读取器。这本质上就是将source封装到BufferedReader中。程序从BufferedReader读取,BufferedReader进而从source读取。这么做就可以使用BufferedReader的方便的readLine方法。

9.2.4 如何联结文件

SequenceInputStream从多个输入源创建单个输入流?

import java.io.*;

public class Concatenate{

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

ListOfFiles mylist = new ListOfFiles(args);

SequenceInputStream s = new SequenceInputStream(mylist);

int c;

while((c = s.read()) != -1){

System.out.write(c);

}

s.close();

}

}

Concatenate首先创建一个名为mylist的ListOfFiles对象,这个对象由用户输入的命令行参数初始化。mylist对象是一个枚举,SequenceInputStream在需要时使用这个mylist对象得到一个新的InputSream。

9.2.5 操作过滤流

过滤器流在从流中读写数据时过滤数据。过滤器流包括FileReader, FileWrriter, FileInputStream和FileOutputStream。

1.  使用过滤器流

在创建过滤器流时将它附加到另一个输入或输出流。例如:将DataInputStream附加到标准输入流:

DataInputStream in = new DataInputStream(System.in);

String input;

while ((input = in.readLine()) != null){

}

这么做可以使用更多由DataInputStream实现的方便的读取方法,比如readLine。

2.  如何使用DataInputStream和DataOutputStream

3.  如何编写自己的过滤器流

Java语言导学笔记 Chapter 9 IO的更多相关文章

  1. Java语言导学笔记 Chapter 8 Thread

    8.1 什么是线程 def: 线程是程序内的一个单一的顺序控制流程 作为一个顺序的控制流程,线程必须在运行它的程序中占用一些资源.例如,线程必须有它自己的执行堆栈和程序计数器.在线程内运行的代码只在此 ...

  2. java语言导学(5版)--第12章并发之二

    1不可变对象 概念:(immutable)对象创建后,状态不可更改.不可变对象在并发程序中尤其有用,因状态不可变,不会被线程干扰,也不会出现不一致状态. 书中通过实例是可变的类,并从此类衍生出一个不可 ...

  3. Java编程思想总结笔记Chapter 3

    本章需要总结的不多,但细节的东西需要注意,有些很容易遗忘. 第三章 目录: 3.1 更简单的打印语句 3.2 使用Java操作符 3.3 优先级 3.4 赋值 3.5 算数操作符 3.6 自动递增和递 ...

  4. 《C++语言导学》小记

    我看的这本是Bjarne Stroustrup写的,南开大学的杨巨峰和王刚译的.这本书不适合初学者看,我就是大概翻了翻其中感兴趣的章节. 这本书第14章的标题是“历史和兼容性”,这节内容我看了收获很深 ...

  5. 076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学

    076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学 本文知识点:Java面向对象导学 说明:因为时间紧张,本人 ...

  6. Java编程思想总结笔记Chapter 2

    本章介绍Java程序的基本组成部分,体会到Java中几乎一切都是对象. 第二章   一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建 ...

  7. Java编程思想总结笔记Chapter 5

    初始化和清理是涉及安全的两个问题.本章简单的介绍“垃圾回收器”及初始化知识. 第五章  初始化与清理 目录:5.1 用构造器确保初始化5.2 方法重载5.3 默认构造器5.4 this关键字5.5 清 ...

  8. Java编程思想总结笔记The first chapter

    总觉得书中太啰嗦,看完总结后方便日后回忆,本想偷懒网上找别人的总结,无奈找不到好的,只好自食其力,尽量总结得最好. 第一章  对象导论 看到对象导论觉得这本书 目录: 1.1 抽象过程1.2 每个对象 ...

  9. 菜鸟笔记 -- Chapter 4 Java语言基础

    在Chapter3中我们写了第一个Java程序Hello World,并且对此程序进行了分析和常见错误解析.那么我们有没有认真观察一下Java程序的基本结构呢?本节我就来聊一下Java程序的基本结构( ...

随机推荐

  1. 要删除共享的初始登陆名 cmd下输入net use * /delete

    要删除共享的初始登陆名 cmd下输入net use *  /delete

  2. golang基础数据结构

    一.概述: 这里主要讨论四种类型---数组.slice.map和结构体 数组和结构体是聚合类型:它们的值都是由很多个元素或者成员字段的值组成.数组是有同构元素组成--每个数组的元素的类型相同:结构体为 ...

  3. CSS基础知识之position

    最近在慕课网学习了 网页布局基础 和 固定层效果 ,都是由声音甜美的 婧享人生 老师所录制,视频详细讲解了CSS中position的用法,在此把学习笔记分享给大家. CSS定位机制 标准文档流(Nor ...

  4. Silverlight学习笔记之页面跳转

    在进行项目开发的时候,经常遇到页面之间的跳转,包括silverlight之间以及silverlight和html之间的跳转. silverlight之间的页面跳转包含两点: 1.主窗体和子窗体 用户新 ...

  5. Http权威指南笔记(一) URI URL URN 关系

    定义 URI:统一资源标识符(Uniform Resource Indentifier)用来标识服务器上的资源. URL:统一资源定位符(Uniform Resouce Locator)是资源标识符最 ...

  6. JS 精粹(方法)

    数组方法: 模拟队列的操作:push()/shift();unshift()/pop();模拟栈操作:push()/pop(); push()返回增加后的长度.unshift也是.pop和shift返 ...

  7. 深搜基础题目 杭电 HDU 1241

    HDU 1241 是深搜算法的入门题目,递归实现. 原题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1241 代码仅供参考,c++实现: #incl ...

  8. linux----ln

    1.格式 ln source_file_path target_file_path 2.执行ln 命令的用户要对source_file_path有写权限,才可以创建软连接. 3.souce_file这 ...

  9. 跨平台的C++应用和UI开发库 QT

    跨平台的C++应用和UI开发库 QT 运行环境: 授权方式:BSD 软件大小:M 下载量:3912 更新日期:2012-04-05 来源地址: 联系作者:Linux     Qt是诺基亚开发的一个跨平 ...

  10. makefile编写差异

    由于zlib动态库在linux下引用的问题引出了对于简练的makefile的学习.之前通过看网络上的一些文章自己也算简单了解如何编写一个makefile,可总是不那么美观,今天经过辉哥的指点,对于ma ...