第三章 File I/O
java.io包提供了一些接口和类,对文件进行基本的操作
File类
创建File对象的语法
File file=new File(String pathName);
pathName 表示所指向的文件路径名
注意 在Windows中,文件路径名中的分隔符可以用正斜杠“/”,如“C:/test.txt”,也可以用反斜杠“\”,但必须写成“\\”,其中第一个表示转义符,如“C:\\test.txt”
File对象是java.io 包中引用磁盘文件的唯一对象。
File类的常用方法
方法 | 说明 |
boolean exists() | 判断文件或目录是否存在 |
boolean isFile() | 判断是否是文件 |
boolean isDirectory() | 判断是否是目录 |
String getPath() | 返回此对象表示的文件的相对路径名 |
String getAbsolutePath() | 返回此对象表示的文件的绝对路径名 |
String getName() | 返回此对象表示的文件或目录的名称 |
boolean delete() | 删除此对象指定的文件或目录 |
boolean createNewFile() | 创建指定名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为字节,若不存在返回OL |
Java的流
流,是指一连串流动的字符,是以先进先出的方式发送和接受数据的通道
流的分类
字符流和字节流的主要区别:
1.字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
字节流
字节输入流类:FileInputStream
FileInputStream:在实际应用中通常使用InputStream的子类FileInputStream类来实现文件的读取,此类用于从本地文件系统中读取文件内容。
构造方法:
FileInputStream(File file):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。
FileInputStream(String name):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。
常用方法
方法 | 说明 |
int read() | 读取一个字节数据 |
int read(byte[] b) | 将数据读取到字节数组中 |
int read(byte[] b,int off,int len) | 从输入流中读取最多len长度的字节,保存到字节数组b中,保存位置从off开始 |
void close() | 关闭此文件输入流并释放与该流关联的所有系统资源 |
int available() | 返回输入流读取的估计字节数 |
字节输出流类:FileOutputStream
构造方法:
FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name,boolean append):append表示是否在文件末尾添加数据,若设置为true,则在文件末尾添加数据。
常用方法
方法 | 说明 |
void write(int c) | 写入一字节数据 |
void write(byte[] b) | 写入数组b的所有字节 |
void write(byte[] b,int off,int len) | 将指定b数组中从偏移量off开始的len个字节写入此文件输出流。 |
void close() | 关闭输出流 |
二进制文件的读写
DataInputStream:该类提供一些基于多字节读取方法,从而可以读取基本数据类型的数据。
构造方法:
DataInputStream(InputStream in):使用指定的底层InputStream创建一个DataInputStream。
DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流。
字符流
FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
构造方法:
FileReader(File file):在给定从中读取数据的File的情况下创建一个新的FileReader。
FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新的FileReader。
BufferedReader类是Reader类的子类,为Reader对象添加字符缓冲器,为数据输入分配内存存储空间,存取数据更为有效。
构造方法:
BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in,int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。
常用方法
方法 | 说明 |
int read() | 从输入流中读取单个字符 |
int read(byte[]c) | 从输入流中读取c.length长度的字符,保存到字符数组c中,返回实际读取的字符数 |
int read(char[] cbuf,int off,int len) | 从输入流中读取c.length长度的字符,保存到字符数组c中,保存位置从off位置开始,返回实际读取的字符长度 |
void close() | 关闭该流并释放与之关联的所有资源 |
long skip(long n) | 跳过字符 |
FileWriter:用来写入字符文件的便捷类,可用于写入字符流。
构造方法:
·FileWriter(File file):根据给定的File对象构造一个FileWriter对象。
·FileWriter(String filename):根据给定的文件名构造一个FileWriter对象。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
常用方法
方法 | 说明 |
write(String str) | 将str字符串里包含的字符输出到指定的输出流中 |
void write(String str,int off,int len) | 将str字符串里从off位置开始长度为len的字符输出到输出流中 |
void close() | 关闭输出流 |
void flush() | 刷新输出流 |
newLine() | 插入一个换行符 |
序列化和反序列化
序列化是将对象的状态存储到特定存储介质的过程
对象序列化的步骤很简单。可以概括成两大步:
1)创建一个对象输出流(ObjectOutputSrerm)。它可以包装一个其他类型的输出流。如文件输流FileOutputSream。例如:
0jectOutputStrean oos=new ObjectOutputStrean(new FileOutputStrean(“c:\\myDoc\\stu.txt”));
它创建了对象输出流oos,包装了一个文件输出流。即C盘文件夹myDoc中的stu.txt文件流。
2)通过对象输出流的writeObject()方法写对象。也就是输出可序列化对象。
反序列化是将存储介质中的数据重新构建为对象的过程
反序列化的步骤大致概括为以下两步:
(1)创建一个对象输入流(0bjectInputStream),它可以包装一个其他类型的输入流,如文件输入流FilelnputStream。
(2)通过对象输入流的readObject()方法读取对象。该方法返回一个object类型的对象,如果程序知道该Java对象的类型。则可以将该对象强制转换成其真实的类型。