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
- JAVA完全参考手册(第8版) 第13章 I/O概述部分
- JAVA完全参考手册(第8版) 第12章 枚举部分
- JAVA完全参考手册(第8版) 第14章 泛型
- JAVA完全参考手册(第8版) 第6章至第8章 类方法继承
- JAVA完全参考手册(第8版) 第1章至第5章
- JAVA完全参考手册(第8版) 第9章 包和接口
- JAVA完全参考手册(第8版) 第10章 异常处理
- JAVA完全参考手册(第8版) 第11章 多线程编程
- 第12章 Java I/O系统
- 第18章 JAVA I/O系统
- 第18章、java I/O系统
- 《Java编程思想》第18章 Java I/O系统
- Thinking in Java 第12章 Java I/O系统
- java编程思想-第18章-java I/O系统
- 彻底转变流,第 2 部分:优化 Java 内部 I/O
- 彻底转变流,第 2 部分:优化 Java 内部 I/O
- 第1章 Java的I/O演进之路
- Java I/O : 概述
- websphere 7 下面 log4j 不输出
- Linux 下 新增Oracle10g 实例
- Linux中open files数
- 遇到问题-用StreamReader读取数据时出现乱码,streamwriter写入中文时出现乱码
- SQL1005N 数据库别名 "ECM" 已存在于本地数据库目录或系统数据库目录中。
- JAVA完全参考手册(第8版) 第13章 I/O概述部分
- ER图
- cms系统
- Hibernate 在MyEclipse中配置
- Java堆内存的10个要点
- 模态窗口提交请求时禁止在新窗口打开页面的处理方法
- Java 内存整理——堆、栈、常量池
- resin4 简单学习
- SQL SERVER 2005表分区创建示例