SlideShare une entreprise Scribd logo
1  sur  22
IO
Agenda
概述
• 输入输出流(IO)的设计对于任何编程语言都
  是一个挑战, 因为IO涉及到了很多方面, 比如
  不同的IO类型文件/网络/控制台等, 还需要
  处理各种字符编码问题; 针对各种情形, java
  都提供了相应的解决方案;
• IO大体上可以分为两种, 面向字节的和面向
  字符的, 前者操作的对象是编码后的一个一
  个的字节, 而后者操作的则是解码之后的字
  符; 关于字符串的编码解码会有相应的介绍.
输入与输出
• 输入是指将内容从文件/网络等读取到内存,
  java中的输入字节流继承自java.io.InputStream,
  输入字符流则继承自java.io.Reader;
• 输出则是将内容从内存输出到文件或者通
  过网络流进行传输, 输出字节流均继承自
  java.io.OutputStream, 输出字符流均继承自
  java.io.Writer.
字符编码
• 字符在保存到文件或者网络传输时, 都需要先转换成比
  特位(0/1), 由字符转换为字节的过程就称之为编码; 字符
  编码的种类有很多, 比如最基础的是ASCII编码, 是所有其
  他字符编码的基础; 对于中文字符集, 常用的编码是:
  UTF-8, GBK, GB2312等, 推荐使用的编码是UTF-8编码;
• 解码, 与编码相反是从字节得到相应字符的过程, 比如从
  文件中读取字符; 解码需要选择与编码相同的方式进行,
  比如采用的UTF-8进行编码, 那么相应的进行解码时也需
  要使用UTF-8;
• Java可以通过String类的如下方法得到编码后的字节数组,
  如果指定的字符编码参数不存在或者不被支持那么会抛
  出相应的异常:
  byte[] getBytes(String encoding) throws UnsupportedEncodingException
• 示例: demo/Demo1.java
ASCII编码表
• ASCII 是 American standard code for information interchange(美
  国信息交换标准编码)的缩写, 它定义了基本
  英文字符, 数字字符以及其它常用符号, 控制
  字符等的编码, 比如数字字符0对应的编码
  是48, 小写字母a对应的是97, 空格字符对应
  的是32; ASCII编码是一个通用的编码标准,
  大多数其它的字符编码都遵循此标准, 详细
  的编码可以在这里找到.;
• 示例: demo/Demo2.java
字节流 vs 字符流
• 在处理IO操作的时候需要关注的一个问题就
  是, 当前流操作时针对字节(byte based)还是
  字符(char based)的. 字节流不需要考虑编码
  的问题, 而字符流则需要考虑合适的编码.
• Java针对两种处理方式分别提供了相应的实
  现, 输入字节流继承自java.io.InputStream
• 比如FileInputStream是从文件中读取字节的,
  BufferedReader/BufferedWriter是从文件中读
  取字符的.
缓冲
• 由于读取磁盘是一件代价高昂的操作, 因此出
  于性能方面的考虑通常需要对输入输出流进行
  缓冲; 输入流缓冲是指先将内容读取到一个内
  存缓冲区(memory buffer area), 只有当该区域
  为空的时候再从磁盘中读取; 输出流缓冲则是
  指将需要写入磁盘的内容先写入一个内存缓冲
  区, 只有当该缓冲区被写满/或者手动清空(flush)
  时, 才进行实际的磁盘写操作;
• java IO对缓冲提供了相应的支持; 比如字节流
  缓冲BufferedInputStream, 对于字符流的缓冲
  BufferedReader.
Java IO类
• 这里列出常用的java IO类
                InputStream                                       Reader



FileInputStre              BufferedInpu            InputStreamR            BufferedRead
      am                     tStream                   eader                     er



                  Writer                            FileReader



OutputStrea                BufferedWrit                             OutputStrea
 mWriter                        er                                      m

                                    BufferedWrit
                                         er
 FileWriter                                         FileOutputStr             BufferedOutp
                                                         eam                    utStream
流对象的创建
               装饰器(Decorator)模式
• 在java中创建一个IO流对象时通常会看到如下
  的写法:
 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new
   FileOutputStream(somefile)), “UTF-8”);
• 这里为了创建一个带缓冲的字符输出流, 需要
  创建多个流对象, 这是java IO让人迷惑的一个
  地方. 分析一下这条语句, 分以下3步:
 1, 创建一个文件字节输出流;
 2, 创建一个字符输出流, 使用UTF8编码;
 3, 创建一个缓冲字符输出流.
这里每一步都在前一步的基础上增加了新的功能,
这是java中的装饰器(Decorator)模式, 参考.
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
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
字节输入流的类型
• 输入流大体有以下几种类型:
 1, 字节数组/字符串;
 2, 文件;
 3, 网络流;
 4, 管道流
• java通过以下输入流类型提供了支持:
    类型             Java类                    说明
 字节数组输入流   ByteArrayInputStream     使用字节数组(byte[])作为输入流,
                                    从该字节数组中读取数据
 字符串输入流    StringBufferInputStrea   使用字符串作为输入流
           m                        不推荐使用
 文件输入流     FileInputStream          使用文件作为输入流
 管道输入流     PipedInputStream         N/A
字节输出流的类型
• 与输入流对应的, 输出流有:
  类型             Java类              说明
字节数组输出流   ByteArrayOutputStream 将将内容写到一个字节数组
                                (byte[])中
文件输出流     FileOutputStream    使用文件作为输出流
管道输出流     PipedOutputStream   N/A
FilterInputStream
           & FilterOutputStream
• 前面讲到过java IO通过装饰器模式对已有的
  流对象添加新的功能, 比如缓冲/字符处理等;
  FilterInputStream/FilterOutputStream基类分
  别代表一个字节输入/输出流装饰器, java提
  供了以下的类型的实现:
    功能类型             Input                        Output
  缓冲        BufferedInputStream     BufferedOutputStream
  数据读写      DataInputStream         DataOutputStream
  按行数读取     LineNumberInputStream   N/A
  打印输出      N/A                     PrintStream
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
FilterReader
            &FilterWriter
• 与字节流装饰器基类(FilterInputStream/
FilterOuputStream)对应的字符流API也提供了
相应的基类: FilterReader/FilterWriter, 相应的
具体实现如下:
    功能类型           Reader                   Writer
  缓冲       BufferedReader     BufferedWriter
  按行数读取    LineNumberReader   N/A
  打印输出     N/A                PrintWriter
InputStreamReader
        &OutputStreamWriter
• 经常需要关注的一个问题是, 如果通过一个
  字节流创建相应的字符流, 比如将一个
  InputStream转换为一个Reader从而进行字
  符操作, java针对输入/输出分别提供了相应
  的适配器(adapter)实现这种转换, 其中
  InputStreamReader实现InputStream到Reader
  的转换, OutputStreamWriter实现OutputStream
  到Writer的转换;
• 示例: demo/Demo5.java
典型用法
• 通常使用BufferedReader实现对文件的逐行
  读取; 使用BufferedWriter/PrintWriter实现对
  文件的逐行写入, PrintWriter与BufferedWriter
  的主要差别在于: PrintWriter没有缓冲, 可以
  通过println方法写入一行并且换行; 因此
  PrintWriter使用方便但性能较差;
• 不在使用某个流对象时, 需要调用close方法
  以实现资源的释放;
标准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
标准I/O
              重定向
• 可以对标准IO进行重定向, 标准输入的重定向
  指的是用其他的输入流比如文件输入流作为标
  准输入, 而标准输出/错误的重定向指的是将输
  出/错误定向到其他的目标比如文件/网络等,
  Java可以通过调用如下接口实现重定向操作:
System.setIn(InputStream)    重定向输入流
System.setOut(PrintStream) 重定向输出流
System.setErr(PrintStream)   重定向错误流
• 示例: demo/Demo7.java
END

Contenu connexe

En vedette

[중소기업청]뚜따 회사소개서
[중소기업청]뚜따 회사소개서[중소기업청]뚜따 회사소개서
[중소기업청]뚜따 회사소개서startupkorea
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜Koki Kusano
 
1, linux intro
1, linux intro1, linux intro
1, linux introted-xu
 
How to install Firmware on Eurosat P6 HD Set Top Box
How to install Firmware on Eurosat P6 HD Set Top Box How to install Firmware on Eurosat P6 HD Set Top Box
How to install Firmware on Eurosat P6 HD Set Top Box Eurosat
 
F-commerce to E-commerce conversion
F-commerce to E-commerce conversionF-commerce to E-commerce conversion
F-commerce to E-commerce conversionMoshiur Monty
 
CIO Event - Info vista - Application Transformation
CIO Event - Info vista - Application TransformationCIO Event - Info vista - Application Transformation
CIO Event - Info vista - Application TransformationGlobal Business Intel
 
10 Factors of Ranking a YouTube Video
10 Factors of Ranking a YouTube Video10 Factors of Ranking a YouTube Video
10 Factors of Ranking a YouTube VideoMoshiur Monty
 
Vencomatic company introduction
Vencomatic company introductionVencomatic company introduction
Vencomatic company introductionnielsgeraerts
 

En vedette (10)

[중소기업청]뚜따 회사소개서
[중소기업청]뚜따 회사소개서[중소기업청]뚜따 회사소개서
[중소기업청]뚜따 회사소개서
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
FDA
FDAFDA
FDA
 
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
 
1, linux intro
1, linux intro1, linux intro
1, linux intro
 
How to install Firmware on Eurosat P6 HD Set Top Box
How to install Firmware on Eurosat P6 HD Set Top Box How to install Firmware on Eurosat P6 HD Set Top Box
How to install Firmware on Eurosat P6 HD Set Top Box
 
F-commerce to E-commerce conversion
F-commerce to E-commerce conversionF-commerce to E-commerce conversion
F-commerce to E-commerce conversion
 
CIO Event - Info vista - Application Transformation
CIO Event - Info vista - Application TransformationCIO Event - Info vista - Application Transformation
CIO Event - Info vista - Application Transformation
 
10 Factors of Ranking a YouTube Video
10 Factors of Ranking a YouTube Video10 Factors of Ranking a YouTube Video
10 Factors of Ranking a YouTube Video
 
Vencomatic company introduction
Vencomatic company introductionVencomatic company introduction
Vencomatic company introduction
 

Similaire à 13, io

12, string
12, string12, string
12, stringted-xu
 
网站字体渲染 麦时
网站字体渲染 麦时网站字体渲染 麦时
网站字体渲染 麦时time zhong
 
Java_05:檔案輸出輸入機制
Java_05:檔案輸出輸入機制Java_05:檔案輸出輸入機制
Java_05:檔案輸出輸入機制Brad Chao
 
Java program in_action
Java program in_actionJava program in_action
Java program in_actionmysqlops
 
Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦chenjianxing
 
Jvm分享20101228
Jvm分享20101228Jvm分享20101228
Jvm分享20101228lunfu zhong
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeAngel Boy
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)ykdsg
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Java 的開放原碼全文搜尋技術 - Lucene
Java 的開放原碼全文搜尋技術 - LuceneJava 的開放原碼全文搜尋技術 - Lucene
Java 的開放原碼全文搜尋技術 - Lucene建興 王
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析wavefly
 
Fast Esp搜索系统
Fast Esp搜索系统Fast Esp搜索系统
Fast Esp搜索系统xiaochawan
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdfczzz1
 

Similaire à 13, io (20)

12, string
12, string12, string
12, string
 
Io 3
Io 3Io 3
Io 3
 
Java 網路程式
Java 網路程式Java 網路程式
Java 網路程式
 
网站字体渲染 麦时
网站字体渲染 麦时网站字体渲染 麦时
网站字体渲染 麦时
 
輸入輸出
輸入輸出輸入輸出
輸入輸出
 
Java_05:檔案輸出輸入機制
Java_05:檔案輸出輸入機制Java_05:檔案輸出輸入機制
Java_05:檔案輸出輸入機制
 
SCJP ch16
SCJP ch16SCJP ch16
SCJP ch16
 
Java program in_action
Java program in_actionJava program in_action
Java program in_action
 
Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦
 
Jvm分享20101228
Jvm分享20101228Jvm分享20101228
Jvm分享20101228
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Java 的開放原碼全文搜尋技術 - Lucene
Java 的開放原碼全文搜尋技術 - LuceneJava 的開放原碼全文搜尋技術 - Lucene
Java 的開放原碼全文搜尋技術 - Lucene
 
Spark tutorial
Spark tutorialSpark tutorial
Spark tutorial
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
 
Fast Esp搜索系统
Fast Esp搜索系统Fast Esp搜索系统
Fast Esp搜索系统
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 

Plus de ted-xu

11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert systemted-xu
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashbackted-xu
 
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rmanted-xu
 
8, OCP - backup with rman
8, OCP - backup with rman8, OCP - backup with rman
8, OCP - backup with rmanted-xu
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recoveryted-xu
 
6, OCP - oracle security
6, OCP - oracle security6, OCP - oracle security
6, OCP - oracle securityted-xu
 
5, OCP - oracle storage
5, OCP - oracle storage5, OCP - oracle storage
5, OCP - oracle storageted-xu
 
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networkingted-xu
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance managementted-xu
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a databaseted-xu
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture introted-xu
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuningted-xu
 
7, business event system
7, business event system7, business event system
7, business event systemted-xu
 
6, workflow miscellaneous
6, workflow miscellaneous6, workflow miscellaneous
6, workflow miscellaneousted-xu
 
5, workflow function activity
5, workflow function activity5, workflow function activity
5, workflow function activityted-xu
 
4, workflow tables & api
4, workflow tables & api4, workflow tables & api
4, workflow tables & apited-xu
 
3, workflow in ebs
3, workflow in ebs3, workflow in ebs
3, workflow in ebsted-xu
 
2, a simple workflow
2, a simple workflow2, a simple workflow
2, a simple workflowted-xu
 
1, workflow intro
1, workflow intro1, workflow intro
1, workflow introted-xu
 
8, bes tables & api
8, bes tables & api8, bes tables & api
8, bes tables & apited-xu
 

Plus de ted-xu (20)

11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert system
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashback
 
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman
 
8, OCP - backup with rman
8, OCP - backup with rman8, OCP - backup with rman
8, OCP - backup with rman
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
 
6, OCP - oracle security
6, OCP - oracle security6, OCP - oracle security
6, OCP - oracle security
 
5, OCP - oracle storage
5, OCP - oracle storage5, OCP - oracle storage
5, OCP - oracle storage
 
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networking
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance management
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a database
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuning
 
7, business event system
7, business event system7, business event system
7, business event system
 
6, workflow miscellaneous
6, workflow miscellaneous6, workflow miscellaneous
6, workflow miscellaneous
 
5, workflow function activity
5, workflow function activity5, workflow function activity
5, workflow function activity
 
4, workflow tables & api
4, workflow tables & api4, workflow tables & api
4, workflow tables & api
 
3, workflow in ebs
3, workflow in ebs3, workflow in ebs
3, workflow in ebs
 
2, a simple workflow
2, a simple workflow2, a simple workflow
2, a simple workflow
 
1, workflow intro
1, workflow intro1, workflow intro
1, workflow intro
 
8, bes tables & api
8, bes tables & api8, bes tables & api
8, bes tables & api
 

13, io

  • 1. IO
  • 3. 概述 • 输入输出流(IO)的设计对于任何编程语言都 是一个挑战, 因为IO涉及到了很多方面, 比如 不同的IO类型文件/网络/控制台等, 还需要 处理各种字符编码问题; 针对各种情形, java 都提供了相应的解决方案; • IO大体上可以分为两种, 面向字节的和面向 字符的, 前者操作的对象是编码后的一个一 个的字节, 而后者操作的则是解码之后的字 符; 关于字符串的编码解码会有相应的介绍.
  • 4. 输入与输出 • 输入是指将内容从文件/网络等读取到内存, java中的输入字节流继承自java.io.InputStream, 输入字符流则继承自java.io.Reader; • 输出则是将内容从内存输出到文件或者通 过网络流进行传输, 输出字节流均继承自 java.io.OutputStream, 输出字符流均继承自 java.io.Writer.
  • 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. ASCII编码表 • ASCII 是 American standard code for information interchange(美 国信息交换标准编码)的缩写, 它定义了基本 英文字符, 数字字符以及其它常用符号, 控制 字符等的编码, 比如数字字符0对应的编码 是48, 小写字母a对应的是97, 空格字符对应 的是32; ASCII编码是一个通用的编码标准, 大多数其它的字符编码都遵循此标准, 详细 的编码可以在这里找到.; • 示例: demo/Demo2.java
  • 7. 字节流 vs 字符流 • 在处理IO操作的时候需要关注的一个问题就 是, 当前流操作时针对字节(byte based)还是 字符(char based)的. 字节流不需要考虑编码 的问题, 而字符流则需要考虑合适的编码. • Java针对两种处理方式分别提供了相应的实 现, 输入字节流继承自java.io.InputStream • 比如FileInputStream是从文件中读取字节的, BufferedReader/BufferedWriter是从文件中读 取字符的.
  • 8. 缓冲 • 由于读取磁盘是一件代价高昂的操作, 因此出 于性能方面的考虑通常需要对输入输出流进行 缓冲; 输入流缓冲是指先将内容读取到一个内 存缓冲区(memory buffer area), 只有当该区域 为空的时候再从磁盘中读取; 输出流缓冲则是 指将需要写入磁盘的内容先写入一个内存缓冲 区, 只有当该缓冲区被写满/或者手动清空(flush) 时, 才进行实际的磁盘写操作; • java IO对缓冲提供了相应的支持; 比如字节流 缓冲BufferedInputStream, 对于字符流的缓冲 BufferedReader.
  • 9. Java IO类 • 这里列出常用的java IO类 InputStream Reader FileInputStre BufferedInpu InputStreamR BufferedRead am tStream eader er Writer FileReader OutputStrea BufferedWrit OutputStrea mWriter er m BufferedWrit er FileWriter FileOutputStr BufferedOutp eam utStream
  • 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. 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. 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. 字节输入流的类型 • 输入流大体有以下几种类型: 1, 字节数组/字符串; 2, 文件; 3, 网络流; 4, 管道流 • java通过以下输入流类型提供了支持: 类型 Java类 说明 字节数组输入流 ByteArrayInputStream 使用字节数组(byte[])作为输入流, 从该字节数组中读取数据 字符串输入流 StringBufferInputStrea 使用字符串作为输入流 m 不推荐使用 文件输入流 FileInputStream 使用文件作为输入流 管道输入流 PipedInputStream N/A
  • 14. 字节输出流的类型 • 与输入流对应的, 输出流有: 类型 Java类 说明 字节数组输出流 ByteArrayOutputStream 将将内容写到一个字节数组 (byte[])中 文件输出流 FileOutputStream 使用文件作为输出流 管道输出流 PipedOutputStream N/A
  • 15. FilterInputStream & FilterOutputStream • 前面讲到过java IO通过装饰器模式对已有的 流对象添加新的功能, 比如缓冲/字符处理等; FilterInputStream/FilterOutputStream基类分 别代表一个字节输入/输出流装饰器, java提 供了以下的类型的实现: 功能类型 Input Output 缓冲 BufferedInputStream BufferedOutputStream 数据读写 DataInputStream DataOutputStream 按行数读取 LineNumberInputStream N/A 打印输出 N/A PrintStream
  • 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. FilterReader &FilterWriter • 与字节流装饰器基类(FilterInputStream/ FilterOuputStream)对应的字符流API也提供了 相应的基类: FilterReader/FilterWriter, 相应的 具体实现如下: 功能类型 Reader Writer 缓冲 BufferedReader BufferedWriter 按行数读取 LineNumberReader N/A 打印输出 N/A PrintWriter
  • 18. InputStreamReader &OutputStreamWriter • 经常需要关注的一个问题是, 如果通过一个 字节流创建相应的字符流, 比如将一个 InputStream转换为一个Reader从而进行字 符操作, java针对输入/输出分别提供了相应 的适配器(adapter)实现这种转换, 其中 InputStreamReader实现InputStream到Reader 的转换, OutputStreamWriter实现OutputStream 到Writer的转换; • 示例: demo/Demo5.java
  • 19. 典型用法 • 通常使用BufferedReader实现对文件的逐行 读取; 使用BufferedWriter/PrintWriter实现对 文件的逐行写入, PrintWriter与BufferedWriter 的主要差别在于: PrintWriter没有缓冲, 可以 通过println方法写入一行并且换行; 因此 PrintWriter使用方便但性能较差; • 不在使用某个流对象时, 需要调用close方法 以实现资源的释放;
  • 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. 标准I/O 重定向 • 可以对标准IO进行重定向, 标准输入的重定向 指的是用其他的输入流比如文件输入流作为标 准输入, 而标准输出/错误的重定向指的是将输 出/错误定向到其他的目标比如文件/网络等, Java可以通过调用如下接口实现重定向操作: System.setIn(InputStream) 重定向输入流 System.setOut(PrintStream) 重定向输出流 System.setErr(PrintStream) 重定向错误流 • 示例: demo/Demo7.java
  • 22. END