JAVA完全参考手册(第8版) 第13章 I/O概述部分

来源:互联网 发布:中国智库网络影响力 编辑:程序博客网 时间:2024/05/02 03:06

1、所有流的行为方式都是相同的。可以为任意类型的设备应用相同的I/O类和方法,可以将许多不同类型的输入——磁盘文件、键盘或网络socket抽象为输入流。输出流可以引用控制台、磁盘文件或网络链接。

两种类型的流:字节流和字符流。字节流处理字节(如二进制数据)的输入和输出,字符流处理字符,使用Unicode,国际化。某些情况下,字符流比字节流高效。

在最底层,所有I/O仍然是面向字节的。基于字符的流只是为处理字符提供了方便和高效的方法。

2、字节流类。

顶级抽象类:InputStream和OutputStream.每个抽象类都有几个处理各种不同设备的具体子类,如磁盘文件、网络链接甚至内存缓存。

java.io中的字节流类 详见:http://docs.oracle.com/javase/6/docs/api/java/io/package-summary.html

  • BufferedInputStream 缓存的输入流
  • BufferedOutputStream
  • ByteArrayInputStream   读取字节数组内容的输入流
  • ByteArrayOutputStream
  • DataInputStream  包含读取Java标准数据类型的方法的输入流 
  • DataOutputStream
  • FileInputStream  读取文件内容的输入流
  • FileOutputStream
  • FilterInputStream 实现InputStream
  • FilterOutputStream
  • InputStream 描述流输入的抽象类
  • OutputStream
  • ObjectInputStream  用于对象的输入流
  • ObjectOutputStream
  • PipedInputStream  输入管道
  • PipedOutputStream
  • PrintStream   包含print()和println()的输出流
  • PushbackInputStream   支持一个字节“unget”的输入流,这种流向输入流返回1字节
  • SequenceInputStream   由两个或者多个按顺序依次读取的输入流组合而成的输入流

抽象类InputStream和OutputStream定义了其他流类实现的一些关键方法,其中最重要是read()和write(),派生的流类必须重写这两个方法。

3、字符流类。

顶层抽象类:Reader和Writer。处理Unicode字符流。

java.io中的字符流类 详见:http://docs.oracle.com/javase/6/docs/api/java/io/package-summary.html

    InputStream—>Reader   OutputStream—>Writer

  • BufferedReader  缓存的输入字符流
  • BufferedWriter
  • CharArrayReader   读取字符数组内容的输入流
  • CharArrayWriter
  • DataInputStream  包含读取Java标准数据类型的方法的输入流 
  • DataOutputStream
  • FileReader  读取文件内容的输入流
  • FileWriter
  • FilterReader  实现InputStream
  • FilterWriter
  • InputStream  描述流输入的抽象类
  • OutputStream
  • Reader   描述字符流输入的抽象类
  • Writer
  • ObjectInputStream  用于对象的输入流
  • ObjectOutputStream
  • PipedReader  输入管道
  • PipedWriter
  • PrintWriter  包含print()和println()的输出流
  • PushbackReader  允许字符返回到输入流的输入流
  • SequenceInputStream   由两个或者多个按顺序依次读取的输入流组合而成的输入流
  • LineNumberReader   计算行数的输入流
  • InputStreamReader   将字节转换成字符的输入流
  • OutputStreamWriter   将字符转化成字节的输出流
  • StringReader   从字符串读取内容的输入流
  • StringWriter   向字符串写入内容的输出流

4、预定义流。

System类。详见:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html

使用该类中的方法,可以获取当前时间以及与系统相关的各种属性设置。

还包含了三种预定义的流变量:in、out、err。这些变量再System类中被声明为public、static、final。

System.arraycopy使用示例:http://blog.csdn.net/java2000_net/article/details/4059465

System.in是InputStream类型的对象 System.out和System.err是PrintStream类型的对象都是字节流。

  • 为了获取与控制台关联的基于字符的流,可以在BufferedReader对象中封装System.in。构造函数:BufferedReader(Reader inputReader)   inputReader是与即将创建的BufferedReader实例链接的流。Reader是抽象类,InputStreamReader是它的一个具体子类,将字节转换成字符。如下创建与键盘连接的对象:BufferedReader br = new BufferedReader(newInputStreamReader(System.in))。
  • 示例:
    //Use a BufferedReader to read characters from console.import java.io.*;class BRRead {public static void main(String args[]) throws IOException {char c;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("Enter characters, 'q' to quit.");do {c = (char)br.read();  //从输入流中读入一个字符,并将之作为整型值返回,如果达到流的末尾返回-1System.out.println(c);} while(c != 'q');}}//output:默认情况下System.in是按行缓存的,在按下Enter之前没有输入被传递到程序。故q多个时。。Enter characters, 'q' to quit.1234adfadqqq1234adfadq
  • 读取字符串,可以使用BufferedReader类的readLine()方法,如下:String readLine() throws IOException
  • PrintStream是派生自OutputStream的输出流,所以还实现了低级的write()方法。void write(int byteval)输出友byteval指定的字节,尽管byteval被声明为整数,但是只有低8位被输出。如,System.out.write('\n')。

5、PrintWriter类。

使用java向控制台输出的推荐方法时通过PrintWriter流。是基于字符的类之一。使实际的应用程序更容易国际化。

构造函数:PrintWriter(OutputStream outputStream, boolean flushOnNewline) 

支持print() 和 println()方法。

创建了一个链接到控制台输出的PrintWriter:PrintWriter pw = new PrintWriter(System.out, true);

6、读写文件。

最常用FileInputStream和FileOutputStream。创建与文件链接的字节流。throws FileNotFoundException。

对于存在安全管理器的情况(如applet),可能会产生SecurityException异常。

文件使用之后必须关闭,释放为文件分配的系统资源,关闭文件失败会导致“内存泄露”(如何检测?

<内存泄露检测参考:http://hi.baidu.com/l_rigidity/item/6b161e102dbcfa9b99ce3305  

http://tech.ccidnet.com/art/3737/20081020/1594519_1.html

http://wenku.baidu.com/view/bafcbc0690c69ec3d5bb7541.html >

文件关闭 void close() throws IOException。

从JDK7开始,close()方法由java.lang包中的AutoCloseable接口指定的,java.io包中的Closeable接口继承了AutoCloseable接口。所有流类都实现了这两个接口。

使用带资源的try语句,当不需要文件时能够自动关闭文件,不用显式调用close()方法。

在finally代码块中调用close()方法。在这种方法中,访问文件的所有方法都被包含到try代码块中,并使用finally代码块关闭文件。例子:

import java.io.*;class ShowFile {public static void main(String args[]) {int i;FileInputStream fin = null;if(args.length != 1) {System.out.println("Usage: ShowFilename");return;}//open file and read then closetry {fin = new FileInputStream(args[0]);do {i = fin.read();if(i != -1) System.out.println((char)i);} while(i != -1);} catch(FileNotFoundException e) {System.out.println("File Not Found.");} catch(IOException e) {System.out.println("An I/O Eror Occurred");} finally {try {if(fin != null)  fin.close();  //因为fin初始化为null} catch(IOException e) {System.out.println("Error Closing File");}}}}

使用write()方法复制文件:

import java.io.*;class CopyFile {public static void main(String args[]) {int i;FileInputStream fin = null;FileOutputStream fout = null;if(args.length != 2) {System.out.println("Usage: Copyfile from to");return;}//copy a filetry {fin = new FileInputStream(args[0]);fout = new FileOutputStream(args[1]);do {i = fin.read();if(i != -1)  fout.write(i);} while(i != -1);} catch(IOException e) {System.out.println("I/O Error:" + e);} finally {try {if(fin != null)  fin.close();} catch(IOException e2) {System.out.println("Error Closing Input File");}try {if(fout != null)  fout.close();} catch(IOException e2) {System.out.println("Error Closing Output File");}}}}

自动关闭文件:

try(resource-specification) { }。只有对于那些实现了AutoCloseable接口的资源,才能使用带资源的try语句。资源的作用域只限于该try语句块。资源被隐式的声明为final,不能将其他资源赋给该变量。try管理多个资源时,用分号隔开。

当在finally子句中关闭资源时,try语句块中的异常可能导致发生另外一个异常。对于常规的try语句,原始异常丢失,被第二个异常取代,其添加到与第一个异常相关联的挂起异常列表中。通过使用Throwable定义的getSuppresser()方法可以获取挂起异常列表。

例子:

import java.io.*;class ShowFile {public static void main(String args[]) {int i;if(args.length != 1) {System.out.println("Usage: Showfile filename");return;}try (FileInputStream fin = new FileInputStream(args[0])){do {i = fin.read();if(i != -1)  System.out.print((char)i);} while(i != -1);} catch(FileNotFoundException e) {System.out.println("File Not Found.");} catch(IOException e) {System.out.println("I/O Error Occurred." );}}}


于2013/04/15

原创粉丝点击