第 10章 IO系统
10.1 IO流简介
10.2 字节流
10.3 过滤流类
10.4 Reader及 Writer
10.5 标准输入、输出
10.6 IO流的应用实例第 10章 IO系统(续)
10.7 随机文件访问
10.8 文件及目录管理
10.9 习题
10.1 IO流简介
通过流的概念,程序员可以把输入或输出的数据看作是一个字节数据流(或字符数据流等)。
通过流,程序可以从各种输入设备读入数据,向各种输出设备输出数据。
按照目的的不同,流可分为输入流和输出流。
10.2 字节流
字节输入流:
–InputStream是所有字节输入流的基类。
字节输出流:
–OutputStream是所有字节输出流类的基类。
10.2.1 InputStream
public abstract int read() throws
IOException
public int read(byte[] b) throws
IOException
public long skip(long n) throws
IOException
public int available() throws
IOException
public void close() throws IOException
10.2.1 InputStream(续)
ByteArrayInputStream
FileInputStream
PipedInputStream
StringBufferInputStream
SequenceInputStream
FilterInputStream
10.2.2 OutputStream
public abstract void write(int b)
throws IOException
public void write(byte[] b)
throws IOException
public void flush() throws
IOException
public void close() throws
IOException
10.2.2 OutputStream(续)
ByteArrayOutputStream
PipedOutputStream
FileOutputStream
FilterOutputStream
例 10-1 文件输入输出
CopyFile CopyFile.java toFile.java
源代码运 行
10.3 过滤流类
FilterInputStream
–DataInputStream
–BufferedInputStream
–LineNumberInputStream
FilterOutputStream
–DataOutputStream
–BufferedOutputStream
–PrintStream
10.3.1 FilterInputStream
DataInputStream:
– boolean readBoolean() throws IOException
– char readChar() throws IOException
– int readShort() throws IOException
– int readByte() throws IOException
– int readInt() throws IOException
– int readLong() throws IOException
– float readFloat() throws IOException
– double readDouble() throws IOException
10.3.2 FilterOutputStream
DataOutputStream:
– void writeBoolean(boolean b) throws
IOException
– void writeChar(char c) throws IOException
– void writeShort(short s) throws IOException
– void writeByte(byte b) throws IOException
– void writeInt(int i) throws IOException
– void writeLong(long l) throws IOException
– void writeFloat(float f) throws IOException
– void writeDouble(double d) throws IOException
10.3.2 FilterOutputStream(续)
PrintStream用于格式化输出,它输出的文件可以以文本方式阅读。
DataOutputStream输出的文件不能以文本方式阅读,其格式是与机器无关的二进制,
它输出的文件可以在不同系统的机器中使用
DataInputStream读出。
例 10-2 DataOutputStream与 PrintStream的不同源代码 运 行
10.4 Reader及 Writer类
InputStream及 OutputStream类支持字节流; Reader及 Writer类支持字符流。
Reader和 Writer是所有字符流的抽象基类。其子类大多与 InputStream及
OutputStream对应,且功能和使用上相似。
10.4 Reader及 Writer类 (续)
Reader InputStream
Writer OutputStream
BufferedReader BufferedInputStream
BufferedWriter BufferedOutputStream
CharArrayReader ByteArrayInputStream
CharArrayWriter ByteArrayOutputStream
FilterReader FilterInputStream
FilterWriter FilterOutputStream
PipedReader PipedInputStream
PipedWriter PipedOutputStream
PrintWriter PrintStream
StringReader StringBufferInputStream
StringWriter 无
InputStreamReader 无
OutputStreamWriter 无
10.4 Reader及 Writer (续)
字符流类与字节流类在类层次上并不完全相同:
– BufferedReader
//Reader的子类,不是 FilterReader的子类
– BufferedWriter和 PrintWriter
//Writer的子类
– FileReader
//InputStreamReader的子类,与 FileInputStream对应
– FileWriter
//OutputStreamWriter的子类,与 FileOutputStream对应
– LineNumberReader
//BufferedReader的子类,与 LineNumberInputStream对应
10.4 Reader及 Writer (续)
InputStreamReader和 OutputStreamWriter
在字符流和字节流之间起桥梁作用:
– InputStreamReader用于将一个字节输入流转换成字符输入流
– OutputStreamWriter 用于将一个字节输出流转换成一个字符输出流
10.4 Reader及 Writer (续)
字符流类可以替代字节流类的大部分功能,
但并不是全部。有时,程序中还是需要使用字节流类。比如,DateInputStream和
DateOutputStream在字符流类并没有对应的类,如果程序中需要以某种格式读入或输出数据,就必须沿用 DateInputStream和
DateOutputStream,除非是要使用
readLine()。 若想使用 readLine(),就应该利用字符流类 BufferedWriter。
10.5 标准输入、输出
标准输出:
–System.out(标准输出)
–System.err(标准错误输出)
System.out 和 System.err是 PrintStream流对象。
标准输入:
–System.in(标准输入)
System.in是 InputStream流 对象
10.5 标准输入、输出(续)
使用 System.in读入数据时,一般需要把它首先包装成 BufferedReader
类型的对象,然后,调用 readLine()
方法一次读入一行字符串数据。
例 10-3 标准 I/ O
源代码 运 行
10.6 IO流的应用实例例 10-4 在文件中查找字符串
java FindStringInFile FindStringInFile.java
例 10-5 数据的存储,恢复及格式化输出源代码 运 行源代码运 行
10.7 随机文件访问
RandomAccessFile用于随机文件访问。
RandomAccessFile中定义了
DateInputStream和 DateOutputStream
中的绝大多数方法。
10.7 随机文件访问(续)
RandomAccessFile的构造方法:
–RandomAccessFile( File file,
String mode)
–RandomAccessFile( String name,
String mode)
构造方法中的第 1个参数指定文件名;第 2
个参数指定访问模式。比较常用的访问模式有两种,"r" (只读),"rw"(读写)。
10.7 随机文件访问(续)
public void seek(long pos) throws
IOException
//将偏移设置到距离文件开始 pos个字节的位置,下一次读写将
//在偏移位置进行
public long length()throws IOException
//返回文件的字节长度
public long getFilePointer()throws
IOException
//返回当前偏移的字节值,偏移是指从文件开始到下一次读写
//位置的距离例 10-6 随机文件访问源代码 运 行
10.8 文件及目录管理
File:
– public String getName()
– public String getPath()
– public boolean canRead()
– public boolean canWrite()
– public boolean exists()
– public boolean isDirectory()
– public boolean isFile()
– public boolean delete()
– public boolean mkdir()
– public String[] list()
– public long length()
– public boolean renameTo(File dest)
10.8 文件及目录管理(续)
例 10-7 文件及目录管理源代码 运 行
10.9 习 题