Java IO 类的系统教程,原创。主要参考自英文教程 Java IO Tutorial 和 Java Doc。

http://tutorials.jenkov.com/java-io/index.html

目的:掌握 Java IO 几乎所有类的基础用法,完全知道什么时候应该使用什么类。

分开学习,先系统学习 IO 所有的类,再另外学习 NIO 。

目录:

  1. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream
  2. 系统学习 Java IO (二)----IO 异常处理
  3. 系统学习 Java IO (三)----文件类 File
  4. 系统学习 Java IO (四)----文件的读写和随机访问 FileInputStream/FileOutputStream & RandomAccessFile
  5. 系统学习 Java IO (五)----使用 SequenceInputStream 组合多个流
  6. 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
  7. 系统学习 Java IO (七)----字节数组流 ByteArrayInputStream/ByteArrayOutputStream
  8. 系统学习 Java IO (八)----装饰流 FilterInputStream/FilterOutputStream
  9. 系统学习 Java IO (九)----缓冲流 BufferedInputStream/BufferedOutputStream
  10. 系统学习 Java IO (十)----回退流 PushbackInputStream
  11. 系统学习 Java IO (十一)----打印流 PrintStream
  12. 系统学习 Java IO (十二)----数据流和对象流
  13. 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类
  14. 系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader
  15. 系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类
  16. 系统学习 Java IO (十六)----这么多类,应该用哪个?

先放一张 IO 类图,看着有点多(本教程还包含了一些不在这图里的),不要怕,跟着 Jenkov 大神走,一个一个来,都能掌握的。

部分内容概览

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。

System.inSystem.outSystem.err 这三个流也是数据的常见来源或目的地。

分别对应 InputStream,PrintStream 和 PrintStream

最常用的可能是 System.out,用于从控制台程序向控制台写入输出。

当 JVM 启动时,它们由 Java 运行时环境初始化,不必自己实例化(尽管可以在运行时改变它们)

一个示例如下:

public class SystemToFile {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("print to console"); // 默认输出到控制台
// 改变 System 输出流,从控制台到文件
OutputStream output = new FileOutputStream("D:\\out.txt");
PrintStream printOut = new PrintStream(output);
System.setOut(printOut);
System.out.println("now print to File"); // 将输出到文件 D:\out.txt
}
}
将流结合起来

可以将流组合成链,以实现更高级的输入和输出操作。

例如,从文件中一次读取一个字节的速度很慢。 从磁盘读取更大的数据块然后在字节之后迭代该块字节更快。

要实现缓冲,可以将 InputStream 包装在 BufferedInputStream 中,

InputStream input = new BufferedInputStream(new FileInputStream("D:\\out.txt"));

OutputStream 同理。缓冲只是通过组合流可以实现的效果之一。 还可以将 InputStream 包装在 PushbackStream 中。

这样,可以将数据推回到流中,以便稍后重新读取。 这在解析过程中有时很方便。 或者,可以使用SequenceInputStream将两个InputStream合并为一个。

InputStream 类是所有 Java IO 输入流的基类。

一般直接定义 InputStream 对象,然后指向它的具体子类引用,

这样做能够处理所有类型的输入流,而不仅仅是具体的子类。

OutputStream类是所有Java IO输出流的基类。

同样,一般直接定义 OutputStream 对象,然后指向它的具体子类引用

Reader 和 Writer

与 InputStream 和 OutputStream 非常相似,

但 Reader 和 Writer 是基于字符的。

Reader 可以与 InputStream 结合使用。 如果你有一个InputStream并想从中读取字符,你可以将它包装在InputStreamReader中。 将InputStream传递给InputStreamReader的构造函数,如下所示:

Reader reader = new InputStreamReader(inputStream);

Writer 同样也可以:

Writer writer = new OutputStreamWriter(outputStream);

Writer 是其他所有 writer 的父类,下面是一个 Writer 的例子:

Writer writer = new FileWriter("D:\\out.txt");
writer.write("Hello Writer");`
writer.close();

将 Writers 与 OutputStreams 相结合

Writer 可以像 Readers 和 InputStream 一样与 OutputStream 结合使用。 将 OutputStream 包装在OutputStreamWrite r中,并将写入 Writer 的所有字符传递给 OutputStream 。 这是一个OutputStreamWriter示例:

Writer writer = new OutputStreamWriter(outputStream);

将Readers和Writers结合起来

就像使用流一样,Reader 和 Writer 可以组合成链,以实现更有趣的 IO。 它的工作原理就像将Reader与 InputStream或者 Writer 与 OutputStream 相结合。

例如,可以通过将Reader包装在BufferedReader或BufferedWriter中的Writer中来实现缓冲。

以下是两个这样的例子:

Reader reader = new BufferedReader(new FileReader(...));
Writer writer = new BufferedWriter(new FileWriter(...));

有时可能需要同时处理输入和输出。换句话说,可能需要有多个线程处理输入并生成输出。

例如,可能有一个需要处理磁盘上大量文件的应用程序。 这可以与性能增益并行完成。 或者您可能有一个服务器,如Web服务器或聊天服务器,它接收许多单独的连接和请求。 这些也可以并行处理,结果具有一些性能增益。

接下来就跟着目录走...

系统学习 Java IO ---- 目录,概览的更多相关文章

  1. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

    目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

  2. 系统学习 Java IO (十六)----这么多类,应该用哪个?

    目录:系统学习 Java IO---- 目录,概览 Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 类的许多子类. 原 ...

  3. 系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader

    目录:系统学习 Java IO---- 目录,概览 BufferedReader BufferedReader 类构造器接收一个 Reader 对象,为 Reader 实例提供缓冲. 缓冲可以加快 I ...

  4. 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类

    目录:系统学习 Java IO---- 目录,概览 Reader Reader 类是 Java IO API 中所有 Reader 子类的基类. Reader 类似于 InputStream ,除了它 ...

  5. 系统学习 Java IO (九)----缓冲流 BufferedInputStream/BufferedOutputStream

    目录:系统学习 Java IO---- 目录,概览 BufferedInputStream BufferedInputStream 类为输入流提供缓冲. 缓冲可以加快IO的速度. BufferedIn ...

  6. 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream

    目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...

  7. 系统学习 Java IO (十二)----数据流和对象流

    目录:系统学习 Java IO---- 目录,概览 DataInputStream/DataOutputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 要想使用 ...

  8. 系统学习 Java IO (四)----文件的读写和随机访问 FileInputStream/FileOutputStream & RandomAccessFile

    目录:系统学习 Java IO---- 目录,概览 文件输入流 FileInputStream 这是一个简单的FileInputStream示例: InputStream input = new Fi ...

  9. 系统学习 Java IO (三)----文件类 File

    目录:系统学习 Java IO---- 目录,概览 Java IO API 中的 File 类可以访问基础文件系统. 使用 File 类,可以: 检查文件或目录是否存在. 如果目录不存在,创建一个目录 ...

随机推荐

  1. SCJP考试题310-025(第二套<4>)92-147/147

    310-025 Leading the way in IT testing and certification tools,QUESTION NO: 92 Given: 1. String foo = ...

  2. XamlReader 动态加载XAML

    原文:XamlReader 动态加载XAML XAML: <Grid xmlns:x="http://schemas.microsoft.com/client/2006" x ...

  3. 由Maximum Gap,对话桶排序,基数排序和统计排序

    一些非比较排序 在LeetCode中有个题目叫Maximum Gap.是求一个非排序的正数数列中按顺序排列后的最大间隔.这个题用桶排序和基数排序都能够实现.以下说一下桶排序.基数排序和计数排序这三种非 ...

  4. 随机森林算法原理及OpenCV应用

    随机森林算法是机器学习.计算机视觉等领域内应用较为广泛的一个算法.它不仅可以用来做分类(包括二分类和多分类),也可用来做回归预测,也可以作为一种数据降维的手段. 在随机森林中,将生成很多的决策树,并不 ...

  5. 标准差standard deviation和标准错误standard error你能解释一下

    by:ysuncn(欢迎转载,请注明原创信息) 什么是标准差(standard deviation)呢?依据国际标准化组织(ISO)的定义:标准差σ是方差σ2的正平方根:而方差是随机变量期望的二次偏差 ...

  6. JQuery采纳CSS实现DOM显示和隐藏要素

    今天参加了Code Review活动.阅读编写代码的同事,感到满足当前功能的实现,但是从长远来看,,无论角度还是从代码重用是来看显然不佳维修点. 有什么需要看的权利.通过选择不同的选项下拉框需求,为了 ...

  7. 安装Eclipse完PyDev插件中没有出现

    假设你是在Window7在环境搭建.请确保您使用以管理员身份运行Eclipse. PyDev插件安装后没有显示是由于PyDev的执行须要Java7,能够通过升级JDK的版本号来完毕,而且配置环境变量( ...

  8. [AC自己主动机+可能性dp] hdu 3689 Infinite monkey theorem

    意甲冠军: 给n快报,和m频率. 然后进入n字母出现的概率 然后给目标字符串str 然后问m概率倍的目标字符串是敲数量. 思维: AC自己主动机+可能性dp简单的问题. 首先建立trie图,然后就是状 ...

  9. DB First .edmx

    DB First查看Entity相互关系.edmx 图表     .edmx源代码——xml文件右键,打开方式     xml内容     详细查看DB:.edmx—Model Browser(模型浏 ...

  10. 最简单的IdentityServer实现——IdentityServer

    1.新建项目 新建ASP .Net Core项目IdentityServer.EasyDemo.IdentityServer,选择.net core 2.0   1   2 引用IdentitySer ...