JAVA流式输入输出与文件处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
流式输入输出与文件处理
实验目的
(1) 掌握字节流和字符流的特点和处理差异;
(2) 掌握过滤流的使用;
(3) 掌握File类的使用;
(4) 掌握随机文件的使用。
(5) 掌握对象系列化的概念以及访问文件时对象读写方法。
知识要点
1 面向字节的输入/输出流
(1)类InputStream是面向字节的输入流的根。其主要方法见表13-1。
表13-1 类InputStream的方法
该流实现DataInput接口,主要方法有:readByte(),readBoolean()、
readShort()、readChar()、readInt() 、readLong()、readFloat()、readDouble()、readUTF()等。
(3)类OutputStream是面向字节输出流的根,其主要方法有:
●void write(int b) :将参数b的低字节写入输出流
●void write(byte b[]) :将字节数组全部写入输出流
●void write(byte b[],int offset, int len):将字节数组中从b[offset]开始处的len个字节写入至输出流。
(4)类DataOutputStream实现各种类型数据的输出处理,它实现了DataOutput接口,主要方法有:writeByte(int)、writeBytes(String)、writeBoolean(boolean)、writeChars(String)、writeInt(int) 、writeLong()、writeFloat(float)、writeDouble(double)、writeUTF(String)等。
2 面向字符的输入与输出流
类Reader是面向字符的输入流的根,其提供的方法与InputStream类似,只是将基于Byte的参数改为基于Char。
类Writer是面向字符的输出流类的根,其提供的方法与OutputStream类似,只是将基于Byte的参数改为基于Char。
类InputStreamReader是一个特殊的流,用来将面向字节的数据流包装转换为面向字符的流。常用于从键盘获取输入数据。例如,从键盘输入一行字符串,可以用BufferedReader的readLine()方法,但在此前必须使用InputStreamReader将字节流转化为字符流。
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String x=in.readLine()
3 文件的顺序读写
(1)面向字节的文件访问
●以二进制文件作为数据源。FileInputStream类和FileOutputStream类分别用于文件的读、写访问。
●利用InputStream和OutputStream的方法可实现文件的读写操作。
●可用DataInputStream对FileInputStream流进行过滤;用DataOuputStream对FileOutputStream流进行过滤,以实现特定数据类型数据的读写。
(2)面向字符的文件访问
●以字符文件作为数据源。包括:FileReader类和FileWriter类分别用于字符文件的读、写访问。
●基于字符流的数据读写方法与基于字节流的类似,只是将读写的单位由字节改为字符,方法中的字节数组参数相应改为字符数组。例如:
int read(char b[])表示从文件读数据填满数组,返回读到的字符数。
●可用BufferedReader对FileReader流进行过滤;用BufferedWriter对FileWriter流进行过滤,其中包含newLine()方法可写入一个换行。
4 File类
借助File对象,可以获取文件和相关目录的属性信息。其主要方法见表13-2。
表13-2 File类的主要方法
创建随机访问文件对象时要指定文件访问的“rw”参数,也就是它可以对同一打开文件进行读写两种访问。RandomAccessFile类实现了DataInput和DataOutput接口,为支持流的随机读写,RandomAccessFile类还添加定义了如下方法:
●long getFilePointer():返回当前指针;
●void seek(long pos):将文件指针定位到一个绝对地址;
●long length():返回文件的长度
注意:地址是相对于文件头的偏移量。地址0表示文件的开头。
6 对象序列化
(1)对象输入流ObjectInputStream和对象输出流ObjectOutputStream将Java流系统扩充到能输入输出对象,它们提供的writeObject()和readObject()方法实现了对象的串行化(Serialized)和反串行化(Deserialized)。
(2)用对象输入流的readObject()方法必须捕捉ClassNotFoundException异常。
(3)为了实现用户自定义对象的串行化,相应的类必须实现Serializable接口,否则,不能以对象形式正确写入文件。Serializable接口是一个不含任何具体内容的接口。
3 样例程序
样例1: 编写一个程序实现任意文件的拷贝功能,源文件和目的文件名由命令行参数提供。
【参考程序】
import java.io.*;
public class CopyFile {
public static void main(String args[]) {
if ( args.length<2) {
System.out.println("usage: java CopyFile sourcefile
targetfile");
System.exit(0);
}