IO
Agenda
概述• 输入输出流(IO)的设计对于任何编程语言都  是一个挑战, 因为IO涉及到了很多方面, 比如  不同的IO类型文件/网络/控制台等, 还需要  处理各种字符编码问题; 针对各种情形, java  都提供了相应的解决方案;• IO大体上可...
输入与输出• 输入是指将内容从文件/网络等读取到内存,  java中的输入字节流继承自java.io.InputStream,  输入字符流则继承自java.io.Reader;• 输出则是将内容从内存输出到文件或者通  过网络流进行传输, 输...
字符编码• 字符在保存到文件或者网络传输时, 都需要先转换成比  特位(0/1), 由字符转换为字节的过程就称之为编码; 字符  编码的种类有很多, 比如最基础的是ASCII编码, 是所有其  他字符编码的基础; 对于中文字符集, 常用的编码是...
ASCII编码表• ASCII 是 American standard code for information interchange(美  国信息交换标准编码)的缩写, 它定义了基本  英文字符, 数字字符以及其它常用符号, 控制  字符等...
字节流 vs 字符流• 在处理IO操作的时候需要关注的一个问题就  是, 当前流操作时针对字节(byte based)还是  字符(char based)的. 字节流不需要考虑编码  的问题, 而字符流则需要考虑合适的编码.• Java针对两种...
缓冲• 由于读取磁盘是一件代价高昂的操作, 因此出  于性能方面的考虑通常需要对输入输出流进行  缓冲; 输入流缓冲是指先将内容读取到一个内  存缓冲区(memory buffer area), 只有当该区域  为空的时候再从磁盘中读取; 输出...
Java IO类• 这里列出常用的java IO类                InputStream                                       ReaderFileInputStre            ...
流对象的创建               装饰器(Decorator)模式• 在java中创建一个IO流对象时通常会看到如下  的写法: BufferedWriter writer = new BufferedWriter(new Output...
java.io.File•   File表示磁盘文件或者目录, 可以通过以下构造器创建File对象:    File(File parent, String child)    File(String parent, String child)...
FilenameFilter• 在列举目录下的文件时, 往往需要提供一个过滤器  (filter), 只有符合该过滤条件的才包含在结果中; File  类的list/listFiles方法提供了相应的版本:  String[] list(Fil...
字节输入流的类型• 输入流大体有以下几种类型: 1, 字节数组/字符串; 2, 文件; 3, 网络流; 4, 管道流• java通过以下输入流类型提供了支持:    类型             Java类                   ...
字节输出流的类型• 与输入流对应的, 输出流有:  类型             Java类              说明字节数组输出流   ByteArrayOutputStream 将将内容写到一个字节数组                ...
FilterInputStream           & FilterOutputStream• 前面讲到过java IO通过装饰器模式对已有的  流对象添加新的功能, 比如缓冲/字符处理等;  FilterInputStream/Filte...
Reader                            &Writer• 自JDK1.1开始java引入了面向字符(char based)的流处理API,  其中字符输入流继承自java.io.Reader, 输出流则继承  jav...
FilterReader            &FilterWriter• 与字节流装饰器基类(FilterInputStream/FilterOuputStream)对应的字符流API也提供了相应的基类: FilterReader/Filt...
InputStreamReader        &OutputStreamWriter• 经常需要关注的一个问题是, 如果通过一个  字节流创建相应的字符流, 比如将一个  InputStream转换为一个Reader从而进行字  符操作, ...
典型用法• 通常使用BufferedReader实现对文件的逐行  读取; 使用BufferedWriter/PrintWriter实现对  文件的逐行写入, PrintWriter与BufferedWriter  的主要差别在于: Print...
标准I/O• java通过如下方式实现了对标准IO的支持,  其中:  System.in         标准输入, InputStream对象;  System.out        标准输出, PrintStream对象;  System...
标准I/O              重定向• 可以对标准IO进行重定向, 标准输入的重定向  指的是用其他的输入流比如文件输入流作为标  准输入, 而标准输出/错误的重定向指的是将输  出/错误定向到其他的目标比如文件/网络等,  Java可...
END
Upcoming SlideShare
Loading in...5
×

13, io

125

Published on

About java IO framework

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
125
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

13, io

  1. 1. IO
  2. 2. Agenda
  3. 3. 概述• 输入输出流(IO)的设计对于任何编程语言都 是一个挑战, 因为IO涉及到了很多方面, 比如 不同的IO类型文件/网络/控制台等, 还需要 处理各种字符编码问题; 针对各种情形, java 都提供了相应的解决方案;• IO大体上可以分为两种, 面向字节的和面向 字符的, 前者操作的对象是编码后的一个一 个的字节, 而后者操作的则是解码之后的字 符; 关于字符串的编码解码会有相应的介绍.
  4. 4. 输入与输出• 输入是指将内容从文件/网络等读取到内存, java中的输入字节流继承自java.io.InputStream, 输入字符流则继承自java.io.Reader;• 输出则是将内容从内存输出到文件或者通 过网络流进行传输, 输出字节流均继承自 java.io.OutputStream, 输出字符流均继承自 java.io.Writer.
  5. 5. 字符编码• 字符在保存到文件或者网络传输时, 都需要先转换成比 特位(0/1), 由字符转换为字节的过程就称之为编码; 字符 编码的种类有很多, 比如最基础的是ASCII编码, 是所有其 他字符编码的基础; 对于中文字符集, 常用的编码是: UTF-8, GBK, GB2312等, 推荐使用的编码是UTF-8编码;• 解码, 与编码相反是从字节得到相应字符的过程, 比如从 文件中读取字符; 解码需要选择与编码相同的方式进行, 比如采用的UTF-8进行编码, 那么相应的进行解码时也需 要使用UTF-8;• Java可以通过String类的如下方法得到编码后的字节数组, 如果指定的字符编码参数不存在或者不被支持那么会抛 出相应的异常: byte[] getBytes(String encoding) throws UnsupportedEncodingException• 示例: demo/Demo1.java
  6. 6. ASCII编码表• ASCII 是 American standard code for information interchange(美 国信息交换标准编码)的缩写, 它定义了基本 英文字符, 数字字符以及其它常用符号, 控制 字符等的编码, 比如数字字符0对应的编码 是48, 小写字母a对应的是97, 空格字符对应 的是32; ASCII编码是一个通用的编码标准, 大多数其它的字符编码都遵循此标准, 详细 的编码可以在这里找到.;• 示例: demo/Demo2.java
  7. 7. 字节流 vs 字符流• 在处理IO操作的时候需要关注的一个问题就 是, 当前流操作时针对字节(byte based)还是 字符(char based)的. 字节流不需要考虑编码 的问题, 而字符流则需要考虑合适的编码.• Java针对两种处理方式分别提供了相应的实 现, 输入字节流继承自java.io.InputStream• 比如FileInputStream是从文件中读取字节的, BufferedReader/BufferedWriter是从文件中读 取字符的.
  8. 8. 缓冲• 由于读取磁盘是一件代价高昂的操作, 因此出 于性能方面的考虑通常需要对输入输出流进行 缓冲; 输入流缓冲是指先将内容读取到一个内 存缓冲区(memory buffer area), 只有当该区域 为空的时候再从磁盘中读取; 输出流缓冲则是 指将需要写入磁盘的内容先写入一个内存缓冲 区, 只有当该缓冲区被写满/或者手动清空(flush) 时, 才进行实际的磁盘写操作;• java IO对缓冲提供了相应的支持; 比如字节流 缓冲BufferedInputStream, 对于字符流的缓冲 BufferedReader.
  9. 9. Java IO类• 这里列出常用的java IO类 InputStream ReaderFileInputStre BufferedInpu InputStreamR BufferedRead am tStream eader er Writer FileReaderOutputStrea BufferedWrit OutputStrea mWriter er m BufferedWrit er FileWriter FileOutputStr BufferedOutp eam utStream
  10. 10. 流对象的创建 装饰器(Decorator)模式• 在java中创建一个IO流对象时通常会看到如下 的写法: BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(somefile)), “UTF-8”);• 这里为了创建一个带缓冲的字符输出流, 需要 创建多个流对象, 这是java IO让人迷惑的一个 地方. 分析一下这条语句, 分以下3步: 1, 创建一个文件字节输出流; 2, 创建一个字符输出流, 使用UTF8编码; 3, 创建一个缓冲字符输出流.这里每一步都在前一步的基础上增加了新的功能,这是java中的装饰器(Decorator)模式, 参考.
  11. 11. java.io.File• File表示磁盘文件或者目录, 可以通过以下构造器创建File对象: File(File parent, String child) File(String parent, String child) 指定父目录和文件名称 File(String pathname) 指定文件/目录的路径 Note: 关于File类需要注意的一点是, 它既可以表示磁盘上的文件也可以表示目录, java没有提 供专门的Directory类• File类常用的方法: boolean exists 判断文件或者目录是否存在; String getAbsolutePath 返回绝对路径 String getName 返回文件/目录的名称 File getParentFile 返回父目录File对象 String getParent 返回父目录的路径 String[] list 返回当前目录下面的所有文件/目录 String[] list(FilenameFilter filter) 返回当前目录下面的所有符合过滤 条件的文件/目录 File[] listFiles/listFiles(FilenameFilter) 与list类似, 这里返回的是File数组 long length 返回文件的字节数 boolean isFile()/isDirectory() 判断是文件还是目录 boolean delete 删除当前文件/目录 boolean deleteOnExit 在JVM退出时删除文件/目录• 示例: demo/Demo3.java
  12. 12. FilenameFilter• 在列举目录下的文件时, 往往需要提供一个过滤器 (filter), 只有符合该过滤条件的才包含在结果中; File 类的list/listFiles方法提供了相应的版本: String[] list(FilenameFilter filter) File[] listFiles(FilenameFilter filter)• FilenameFilter接口规范: public interface FilenameFilter { boolean accept(File dir, String name); }在列举目录下面的文件时, 会对每一个文件调用一次accept方法如果返回true则会将该文件包含在结果中;• 示例: demo/Demo4.java
  13. 13. 字节输入流的类型• 输入流大体有以下几种类型: 1, 字节数组/字符串; 2, 文件; 3, 网络流; 4, 管道流• java通过以下输入流类型提供了支持: 类型 Java类 说明 字节数组输入流 ByteArrayInputStream 使用字节数组(byte[])作为输入流, 从该字节数组中读取数据 字符串输入流 StringBufferInputStrea 使用字符串作为输入流 m 不推荐使用 文件输入流 FileInputStream 使用文件作为输入流 管道输入流 PipedInputStream N/A
  14. 14. 字节输出流的类型• 与输入流对应的, 输出流有: 类型 Java类 说明字节数组输出流 ByteArrayOutputStream 将将内容写到一个字节数组 (byte[])中文件输出流 FileOutputStream 使用文件作为输出流管道输出流 PipedOutputStream N/A
  15. 15. FilterInputStream & FilterOutputStream• 前面讲到过java IO通过装饰器模式对已有的 流对象添加新的功能, 比如缓冲/字符处理等; FilterInputStream/FilterOutputStream基类分 别代表一个字节输入/输出流装饰器, java提 供了以下的类型的实现: 功能类型 Input Output 缓冲 BufferedInputStream BufferedOutputStream 数据读写 DataInputStream DataOutputStream 按行数读取 LineNumberInputStream N/A 打印输出 N/A PrintStream
  16. 16. Reader &Writer• 自JDK1.1开始java引入了面向字符(char based)的流处理API, 其中字符输入流继承自java.io.Reader, 输出流则继承 java.io.Writer;• 字节流和字符流API对应关系: 字节流 字符流 InputStream Reader 使用InputStreamReader将字节流转换为Reader OutputStream Writer 使用OutputStreamReader将字节流转换为Writer FileInputStream FileReader FileOutputStream FileWriter StringBufferInptuStream StringReader N/A StringWriter ByteArrayInputStream CharArrayReader ByteArrayOutStream CharArrayWriter
  17. 17. FilterReader &FilterWriter• 与字节流装饰器基类(FilterInputStream/FilterOuputStream)对应的字符流API也提供了相应的基类: FilterReader/FilterWriter, 相应的具体实现如下: 功能类型 Reader Writer 缓冲 BufferedReader BufferedWriter 按行数读取 LineNumberReader N/A 打印输出 N/A PrintWriter
  18. 18. InputStreamReader &OutputStreamWriter• 经常需要关注的一个问题是, 如果通过一个 字节流创建相应的字符流, 比如将一个 InputStream转换为一个Reader从而进行字 符操作, java针对输入/输出分别提供了相应 的适配器(adapter)实现这种转换, 其中 InputStreamReader实现InputStream到Reader 的转换, OutputStreamWriter实现OutputStream 到Writer的转换;• 示例: demo/Demo5.java
  19. 19. 典型用法• 通常使用BufferedReader实现对文件的逐行 读取; 使用BufferedWriter/PrintWriter实现对 文件的逐行写入, PrintWriter与BufferedWriter 的主要差别在于: PrintWriter没有缓冲, 可以 通过println方法写入一行并且换行; 因此 PrintWriter使用方便但性能较差;• 不在使用某个流对象时, 需要调用close方法 以实现资源的释放;
  20. 20. 标准I/O• java通过如下方式实现了对标准IO的支持, 其中: System.in 标准输入, InputStream对象; System.out 标准输出, PrintStream对象; System.err 标准错误输出, PrintStream对象.• 可以使用BufferedReader对System.in进行包 装, 一次读取一行输入. BufferedReader reader = new BufferedReader( new InputStreamReader(System.in));• 示例: demo/Demo6.java
  21. 21. 标准I/O 重定向• 可以对标准IO进行重定向, 标准输入的重定向 指的是用其他的输入流比如文件输入流作为标 准输入, 而标准输出/错误的重定向指的是将输 出/错误定向到其他的目标比如文件/网络等, Java可以通过调用如下接口实现重定向操作:System.setIn(InputStream) 重定向输入流System.setOut(PrintStream) 重定向输出流System.setErr(PrintStream) 重定向错误流• 示例: demo/Demo7.java
  22. 22. END

×