Lesson 13,I/O Package
Java I/O 包
LiFan(李凡)
Chengdu University of Information Technology
The Department Of Computer Science
2005
What is the stream? (什么是流? )
? 流 是数据的有序序列,流可分为输入流和输
出流
? 输入流 指从某个数据来源输入的数据序列
? 输出流 指将向某个数据目的地输出的数据序

? java.io包 中定义与输入、输出流相关的类和
接口,构成了 Java语言的 I/O框架
java.io Package Overview
? java.io包中类和接口从功能上主要分为 字符
流类型 和 字节流类型
? 字符流 是指数据序列的基本构成单位是 16位
的 Unicode字符数据,如各类基于字符编码
的文本文件
? 字节流 是指数据序列的基本构成单位是 8位
的字节数据,如各类基于二进制数据的文件
java.io Package Overview
? java.io包中的类和接口可分为以下几类,
(1) 高层抽象类 用于表示各种不同的流
(2) 各种 特殊类型的流类,如过滤器流、缓
冲流、管道流等
(3) 数据流类 用于输入、输出基本数据类型
数据或字符串对象
(4) 用于 文件读写的类和接口
(5) 用于 对象序列化的类和接口
Byte Streams
? 字节流可分为 输入字节流 和 输出字节流
? 抽象类 java.io.InputStream 用于表示所有输
入字节流
? 抽象类 java.io.OutputStream 用于表示所有
输出字节流
? 所有的流类对象在使用前必须打开,在使用
后必须关闭
java.io.InputStream Class
? 该抽象类作为所有输入字节流类的基类,声
明用于读取字节流数据的通用方法,
public abstract int read()
public int read(byte[] buf,int offset,int count)
public int read(byte[] buf)
public long skip(long count)
public int available()
public void close()
java.io.InputStream Class
? 当创建 InputStream类对象时,便自动打开
了对象所表示的输入流
? InputStream所有与输入相关的方法声明抛
出 异常类 IOException
? InputStream类的对象在完成数据输入后,
除标准输入流类对象 System.in外,必须调用
close方法关闭输入流,通常可将该方法的调
用放入 finally语句块中
import java.io.*;
class CountBytes{
public static void main(String[] args) throws IOException{
InputStream in;
try{
in=new FileInputStream(args[0]);
int total=0;
while(in.read()!=-1)
total++;
System.out.println(total+,bytes”);
} finally{
if(in!=null)
try{ in.close(); }
catch(IOException e){ }
}
}
}
以指定文件数据
作为数据流
计算输入数
据的字节数
关闭已打开
的输入流
java.io.OutputStream Class
? 该抽象类作为所有输出字节流类的基类,声
明用于输出字节流数据的通用方法,
public abstract void write(int b)
public void write(byte[] buf,int offset,int
count)
public void write(byte[])
public void flush()
public void close()
java.io.OutputStream Class
? 当创建 OnputStream类对象时,便自动打开
了对象所表示的输出流
? OutputStream所有与输出相关的方法声明
抛出 异常类 IOException
? OutputStream类的对象在完成数据输出后,
除标准输出流对象 System.out外,必须调用
close方法关闭输出流
import java.io.*;
class TranslateByte{
public static void main(String[] args) throws IOException{
byte from=(byte)args[0].charAt(0);
byte to=(byte)args[1].charAt(1);
int b;
while((b=System.in.read())!=-1)
System.out.write(b==from? to, b);
}
}
java TranlateByte b B
输入,abracadabra!
aBracadaBra!
Character Streams
? 字符流可分为 输入字符流 和 输出字符流
? 抽象类 java.io.Reader 用于表示所有输入字
符流
? 抽象类 java.io.Writer 用于表示所有输出字
符流
Java.io.Reader Class
? 该抽象类作为所有输入字符流类的基类,声明用
于读取输入字符文本数据的通用方法,
public int read()
public abstract int read(char[] buf,int offset,int
count)
public int read(char[] buf)
public long skip(long count)
public int available()
public abstract void close()
Reader and InputStream
? Reader类与 InputStream类有以下不同点,
(1) Reader类 最基本的方法是 read(char[],int,int),其
它方法的功能都依靠此方法的实现; InputStream类
最基本的方法是 read(),其它方法的功能都依靠此方
法的实现
(2) Reader类 的子类必须 实现抽象方法 close方法
(3) InputStream类的 available方法 返回未读入的数据
的字节数,而 Reader类的 available方法 只能测试是否
还有可读入的字符数据
java.io.Writer Class
? 该抽象类作为所有输出字符流类的基类,声明用
于输出字符文本数据的通用方法,
public void write(int ch)
public abstract void write(char[] buf,int offset,int
count)
public void write(char[] buf)
public void write(String str,int offset,int count)
public void write(String str)
public abstract void flush()
public abstract void close()
Byte Streams to Character Streams
? 字节序列可以根据一定的字符编码格式转换为字符
序列,字节流也可根据一定的字符编码转换为字符

? java.io.InputStreamReader类 用于将 InputStream类
对象按照指定的字符编码转换为 Reader类对象
? java.io.OutputStreamWriter类 用于将 OutputStream
类对象按照指定的字符编码转换为 Writer类对象
? 如果不指定字符编码,则使用操作系统所支持的默
认字符编码,在中文平台上为 gb2312
Byte Streams to Character Streams
? InputStreamReadr类有以下构造函数,
public InputStreamReader(InputStream in)
public InputStreamReader(InputStream in,String
encoding)
? OutputStreamWriter类有以下构造函数,
public OutputStreamReader(OutputStream out)
public OutputStreamReader(OutputStream out,
String encoding)
import java.io.*;
class CountSpace{
public static void main(String[] args) throws IOException{
Reader in;
in=new InputStreamReader(System.in);
int ch;
int totol;
int spaces=0;
for(total=0;(ch=in.read())!=-1;total++){
if(Character.isWhitespace((char)ch))
spaces++;
}
System.out.println(total+,个字符,”+spaces+,个空格” );
}
}
当前读入的字符
读入的字符总数
字符中的空格数
计算空格数
The Data Byte Streams
? 接口 java.io.DataInput和 java.io.DataOutput定义了
基于字节流操作读取基本数据类型值的方法,
boolean readBoolean()
char readChar()
byte readByte()
short readShort()
int readInt()
long readLong()
float readFloat()
double readDouble()
String readUTF()
void writeBoolean(boolean b)
void writeChar(char ch)
void writeByte(byte b)
void writeShort(short s)
void writeInt(int i)
void writeLong(long l)
void writeFloat(float f)
void writeDouble(double d)
void writeUTF(String)
The Data Byte Streams
? 接口 java.io.DataInput还定义了以下方法,
abstract void readFully(byte[] buf,int offset,
int count)
abstract void readFully(byte[] buf)
abstract int skipBytes(int count)
abstract int readUnsignedByte()
abstract int readUnsignedShort()
The Data Byte Streams
? 接口 java.io.DataOutput还定义了以下方法,
abstract void writeBytes(String s)
abstract void writeChars(String s)
? java.io包中提供了接口 DataInput和 DataOutput的
以下实现类,
DataInputStream和 DataOutputStream
RandomAccessFile
ObjectInputStream和 ObjectOutputStream
java.io.DataInputStream Class
? 该类提供了以下构造函数,
public DataInputStream(InputStream in)
public static double[] readData(String file){
InputStream fin=new FileInputStream(file);
DataInputStream in=new DataInputStream(fin);
double[] data=new double[in.readInt()];
for(int i=0;i<data.length;i++)
data[i]=in.readDouble();
in.close();
return data;
}
java.io.DataOutputStream Class
? 该类提供了以下构造函数,
public DataOutputStream(OutputStream out)
public static double[] writeData(double[] data,String file){
OutputStream fout=new FileOutputStream(file);
DataOutputStream out=new DataOutputStream(fout);
out.writeInt(data.length);
for(int i=0;i<data.length;i++)
out.writeDouble(data[i]);
out.close();
}
Working with Files
? java.io包定义了以下与文件读写操作相关的
类,
RandomAccessFile
File
FileDescriptor
FileInputStream 和 FileOutputStream
FileReader 和 FileWriter
java.io.RandomAccessFile Class
? 该类的构造函数如下,
public RandomAccessFile(String name,String mode)
public RandomAccessFile(File file,String mode)
(参数 mode的可选值为:,r” 或, rw”)
? 该类实现了 DataInput和 DataOutput接口
? 该类还提供了以下方法,
public long getFilePointer() public FileDescriptor getFD()
public void seek(long pos) public int skipBytes(int count)
public long length() public void setLength(long len)
java.io.File Class
? 该类的实例表示 底层文件系统中的路径,既可表
示一个文件,也可表示一个目录
? 该类定义了以下构造函数,
File(String path)
File(String dirName,String name)
File(File fileDir,String name)
? 该类定义了以下静态域,
static char File.separatorChar
static String File.separator
java.io.File Class
? 该类提供了与文件或目录路径相关的方法,
public String getName()
public String getPath()
public String getAbsolutePath()
public getCanonicalPath()
public getParent()
如果文件 FileInfo.java的路径为 /ok/FileInfo.java,当前程序所
在目录为 /src
File src=new File(“..”+File.separator+,ok”,“FileInfo.java”);
System.out.println(“getName()=”+src.getName());
System.out.println(“getPath()=”+src.getPath());
System.out.println(“getAbsolutePath()=”+src.getAbsolutePath());
System.out.println(“getCanonicalPath()=”+src.getCononicalPath());
System.out.println(“getParent()=”+src.getParent());
getName()=FileInfo.java
getPath()=../ok/FileInfo.java
getAbsolutePath()=/src/../ok/FileInfo.java
getCanonicalPath()=/ok/FileInfo.java
getParent()=../ok
java.io.File Class
? 该类提供了以下方法用于测试文件或目录的状态,
public boolean exists()
public boolean canRead()
public boolean canWrite()
public boolean isFile()
public boolean isDirectory()
public boolean isAbsolute()
public boolean isHidden()
java.io.File Class
? 该类提供了以下方法用于操作文件或目录,
public long lastModified()
public boolean setLastModified(long time)
public long length()
public boolean delete()
public boolean createNewFile()
public boolean mkdir()
public boolean mkdirs()
public boolean setReadOnly()
java.io.File Class
? 该类提供了以下方法用于列出目录的内容,
public String[] list()
public String[] list(FilenameFilter filter)
public static File[] listRoots()
? 该类提供了以下方法用于操作临时文件,
public static File createTempFile(String prefix,String
suffix,File directory)
public static File createTempFile(String prefix,String
suffix)
public void deleteOnExit()
Filter Interfaces
? 接口 java.io.FilenameFilter用于过滤不期望
的文件集,定义了以下方法,
boolean accept(File dir,String name)
? 接口 java.io.FileFilter具有同样功能,定义了
以下方法,
boolean accept(File pathname)
import java.io.*;
class DirFilter implements FilenameFilter{
public boolean accept(File dir,String name){
return new File dir,name).isDirectory();
}
public static void main(String[] args){
File dir=new File(args[0]);
String[] files=dir.list(new DirFilter());
for(int i=0;i<files.length;i++)
System.out.println(“\t”+files[i]);
}
}