Java程序 第20章 (IO)操作.ppt
第20章文件IO操作 File类 RandomAccessFile类 流类 字符编码 对象序列化20.1 File类 File类是IO包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操纵文件,通过调用File类提供的各种方法,能够完成创建、删除文件,重命名文件,判断文件的读写权限及文件是否存在,设置和查询文件的最近修改时间等操作 【范例20-1】File方法的使用范例 20.2 RandomAccessFile类 RandomAccessFile类是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法,RandomAccessFile能以只读或读写方式打开文件,使用哪种方式取决于用户创建RandomAccessFile类对象的构造方法 new RandomAccessFile(f,rw);/读写方式 new RandomAccessFile(f,r);/只读方式 【范例20-2】员工信息类的使用范例20.3 流类20.3.1 字节流20.3.2 字符流20.3.3 管道流20.3.4 ByteArrayInputStream与 ByteArrayOutputStream20.3.5 System.in与System.out20.3.6 打印流20.3.7 DataInputStream与DataOutputStream20.3.8 合并流20.3.9 字节流与字符流的转换20.3.10 IO包中的类层次关系图20.3 流类 Java 的流式输入/输出建立在四个抽象类的基础上:InputStream,OutputStream,Reader和Writer,操作文件流时,不管是字节流还是字符流都可以按照以下的方式进行。使用File类找到一个文件 通过File类的对象去实例化字节流或字符流的子类 进行字节(字符)的读、写操作 关闭文件流20.3.1 字节流 1.InputStream(输入字节流)方法描述int available()返回当前可读的输入字节数void close()关闭输入流。关闭之后若再读取则会产生IOException异常void mark(int numBytes)在输入流的当前点放置一个标记。该流在读取N个Bytes字节前都保持有效boolean markSupported()如果调用的流支持mark()/reset()就返回true20.3.1 字节流 方法描述int read()如果下一个字节可读则返回一个整型,遇到文件尾时返回-1int read(byte buffer)试图读取buffer.length个字节到buffer中,并返回实际成功读取的字节数。遇到文件尾时返回-1int read(byte buffer,int offset,int numBytes)试图读取buffer中从bufferoffset开始的numBytes个字节,返回实际读取的字节数。遇到文件结尾时返回-1void reset()重新设置输入指针到先前设置的标志处long skip(long numBytes)忽略numBytes个输入字节,返回实际忽略的字节数20.3.1 字节流 2.OutputStream(输出字节流)方法描述void close()关闭输出流。关闭后的写操作会产生IOException异常void flush()定制输出状态以使每个缓冲器都被清除,也就是刷新输出缓冲区void write(int b)向输出流写入单个字节。注意参数是一个整型数,它允许设计者不必把参数转换成字节型就可以调用write()方法void write(byte buffer)向一个输出流写一个完整的字节数组void write(byte buffer,int offset,int numBytes)写数组buffer以bufferoffset为起点的numBytes个字节区域内的内容20.3.1 字节流 3.FileInputStream(文件输入流)FileInputStream 类创建一个能从文件读取字节的InputStream 类,它的两个常用的构造方法如下:FileInputStream(String filepath)FileInputStream(File fileObj)20.3.1 字节流 4.FileOutputStream(文件输出流)FileOutputStream 创建了一个可以向文件写入字节的类OutputStream,它常用的构造方法如下:FileOutputStream(String filePath)FileOutputStream(File fileObj)FileOutputStream(String filePath,boolean append)【范例20-3】向文件中写入字符串并读出20.3.2 字符流 1.Reader方法描述abstract void close()关闭输入源。进一步的读取将会产生IOException异常void mark(int numChars)在输入流的当前位置设立一个标志。该输入流在numChars个字符被读取之前有效boolean markSupported()该流支持mark()/reset()则返回trueint read()如果调用的输入流的下一个字符可读则返回一个整型。遇到文件尾时返回-120.3.2 字符流 方法描述int read(char buffer)试图读取buffer中的buffer.length个字符,返回实际成功读取的字符数。遇到文件尾返回-1abstract int read(char buffer,int offset,int numChars)试图读取buffer中从bufferoffset开始的numChars个字符,返回实际成功读取的字符数。遇到文件尾返回-1boolean ready()如果下一个输入请求不等待则返回true,否则返回falselong skip(long numChars)跳过numChars个输入字符,返回跳过的字符设置输入指针到先前设立的标志处数20.3.2 字符流 2.Writer方法描述abstract void close()关闭输出流。关闭后的写操作会产生IOException异常abstract void flush()定制输出状态以使每个缓冲器都被清除。也就是刷新输出缓冲void write(int ch)向输出流写入单个字符。注意参数是一个整型,它允许设计者不必把参数转换成字符型就可以调用write()方法void write(char buffer)向一个输出流写一个完整的字符数组20.3.2 字符流 方法描述abstract void write(char buffer,int offset,int numChars)向调用的输出流写入数组buffer 以bufferoffset 为起点的N个Chars区域内的内容void write(String str)向调用的输出流写strvoid write(String str,int offset,int numChars)写数组str中以制定的offset为起点的长度为numChars个字符区域内的内容20.3.2 字符流 3.FileReader FileReader类 创 建 了 一 个 可 以 读 取 文 件 内 容 的Reader类。它最常用的构造方法显示如下:FileReader(String filePath)FileReader(File fileObj)20.3.2 字符流 4.FileWriter FileWriter 创建一个可以写文件的Writer 类。它最常用的构造方法如下:FileWriter(String filePath)FileWriter(String filePath,boolean append)FileWriter(File fileObj)【范例20-4】字符流使用范例20.3.3 管道流 管道流主要作用是可以连接两个线程间的通信。管道 流 也 分 为 字 节 流(PipedInputStream、PipedOutputStream)与 字 符 流(PipedReader、PipedWriter)两种类型 【范例20-5】管道流使用范例20.3.4 ByteArrayInputStream与ByteArrayOutputStream ByteArrayInputStream是输入流的一种实现,它有两个构造方法,每个构造方法都需要一个字节数组来作为其数据源 ByteArrayInputStream(byte buf)ByteArrayInputStream(byte buf,int offse,int length)ByteArrayOutputStream()BuyteArrayoutputStream(int)【范例20-6】ByteArrayInputStream类使用范例20.3.5 System.in与System.out 为了支持标准输入输出设备,Java定义了两个特殊的流对象:System.in和System.out,System.in对应键盘,System.out对应显示器20.3.6 打印流 PrintStream类提供了一系列的print和println方法,PrintStream有下面几个构造方法:PrintStream(OutputStream out)PrintStream(OutputStream out,boolean auotflush)PrintStream(OutputStream out,boolean auotflush,String encoding)【范例20-7】PrintWriter类向屏幕输出信息范例 【范例20-8】PrintWriter向文件中输出信息范例20.3.7 DataInputStream与DataOutputStream DataInputStream与DataOutputStream提供了与平台无关的数据操作 【范例20-9】DataInputStream与DataOutputStream使用范例20.3.8 合并流 采用SequenceInputStream类,可以实现两个文件的合并操作 【范例20-10】使用合并流将两个文件合并20.3.9 字节流与字符流的转换 Java支持字节流和字符流,但有时需要字节流和字符 流 之 间 的 转 换,InputStreamReader和OutputStreamWriter,这两个类是字节流和字符流之间相互转换的类,InputStreamReader可以将一个字节流中的字节解码成字符,OuputStreamWriter将写入的字符编码成字节后写入一个字节流 【范例20-11】字符流的转换使用范例20.3.10 IO包中的类层次关系图 1.字节输入流(InputStream)20.3.10 IO包中的类层次关系图 1.字节输出流(OutputStream)20.3.10 IO包中的类层次关系图 3.字符输入流20.3.10 IO包中的类层次关系图 4.字符输出流20.4 字符编码 计算机里只有数字,字符与数字对应的编码固定下来后,这套编码规则被称为ASCII码 许多国家都把本地的字符集引入了计算机,扩展了计算机中字符的范围,中国大陆为每一个中文字符都指定了一个对应的数字,这套编码规则称为GBK 为了解决各个国家和地区使用自不同的本地化字符编码带来的不便,人们将全世界所有的符号进行了统一编码,称之为Unicode编码 20.4 字符编码 【范例20-12】字符编码使用范例1 【范例20-13】字符编码使用范例2 【范例20-14】字符编码使用范例3 【范例20-15】获得系统属性范例 20.5 对象序列化 对象序列化(在某些书中也叫串行化),是指将对象转换成二进制数据流的一种实现手段,通过将对象序列化,可以方便的实现对象的传输及保存 【范例20-16】对象序列化使用范例 【范例20-17】对象序列化使用范例2