File I/O
一、操作文件或目录的属性
程序的主要任务就是操作数据,通过允许程序读取文件的内容或向文件写入数据,可以使程序应用更为广泛。
1、使用File类操作文件或目录属性
java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等
File对象既可表示文件,也可表示目录。在程序中,一个File对象可以代表一个或目录。利用它可用来对文件或目录进行基本操作。它可以查出与文件相关的信息,如名称,最后修改日期,文件大小等。
创建一个File对象的语法格式如下。
File file=new File(String pathName);
其中,pathName表示所值向的文件路径名。
例如,"File file=new File(“C:\test.txt”);"创建了一个指向C盘根目录下test.txt文本,文件的对象。
File类的常用方法:
方法名称 | 说明 |
---|---|
boolean exists() | 判断文件或目录是否存在 |
boolean isFile() | 判断是否是文件 |
boolean isDirectory() | 判断是否是目录 |
String getPath() | 返回此对象表示的文件的相对路径名 |
String getAbsolutePath() | 返回此对象表示的文件的绝对路径名 |
String getName() | 返回此对象表示的文件或目录路径名 |
boolean delete() | 删除此对象指定的文件或目录 |
boolean createNewFile() | 创建名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为子节,若文件不存在,则返回OL |
二、Java的流
读文件,是指把文件中的数据读取到内存中。反之,写文件是把内存中的数据写到文件中。
流,是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道。
一个流是一个输入设备或输出设备的抽象表示。可以写数据到流中,也可以从流中读数据。可以把流想象为程序中流进或出的一个字节序列
(1)按照流的流向进行划分,可以分为输入流和输出流
输入流:只能从中读取数据,而不能向其中写入数据
输出流:只能向其中写入数据,而不能从中读取数据
Java的输出流主要由OutputStream和Writer作为基类,而输入流则主要由InputStream和Reader作为基类。
(2)按照所操作的数据单元的不同,流又可划分成子节流和字符流。
字节流操作的最小数据单元为8位的字节,而字符流操作的最小数据单元是16位的字符。
字节流和字符流的区分非常简单,字节流建议用于二进制数据,而字符流用于文本它们的用法几乎是完全一样的。
按照流的流向,我们还可以对字节流和字符流继续划分,分出字节输入流、字节输出流,字符输入流、字符输出流。
三、读写文本文件
1、使用字节流读取文本文件
1、字节输入流InputStream类
字节输入流InputStream的作用就是将文件中的数据输入到内部存储器(简称内存)中,它提供了一系列和读取数据有关的方法,常用的方法如表所示
方法名称 | 说明 |
---|---|
int read() | 读取一个字节数据 |
int read(byte[] b) | 将数据读取到字节数据中 |
int read(byte[] b,int off,int len) | 从输入流中读取最多len长度的子节,保存到字节数组b中,保存的位置从off开始 |
void close() | 关闭输入流 |
int available() | 返回输入流读取的估计子节数 |
无参的read()方法从输入流读取一个八位的字节,把它转换为0~255的整数返回。
有参的两个read()方法从输入流批量读取若干个字节。在从文件或键盘读数据时,采用read(byte[] b)或read(byte[] b,int off,int len)方法可以减少进行物理读文件或键盘的次数,提高输入、输出操作效率。
2、字节输入流FileInputStream类
在实际应用中,我们通常使用InputStream的子类FileInputStream类来实现文本文件内容的读取,常用的构造方法有以下两个。
(1)FileInputStream(File file).其中,file指定文件数据源。使用此构造方法创建文件输入流对象如下。
File file=new File("C:\\test.txt");
InputStream fileObject=new FileInputStream(file);
(2)FileInputStream(String name).其中,name指定文件数据源,包含路径信息。使用此构造方法创建文件输入流对象如下
InputStream in=new FileInputStream("C:\\test.txt")
3、使用FileInputStream读取文件
使用FileputStream读取文本文件的具体使用步骤如下。
(1)引入相关的类
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
(2)创建一个文件输入流对象
InputStream fileObject=new FileInputStream("C:\\test.txt")
(3)利用文件输入流的方法读取文本文件的数据
fileObject.available(); //可读取的字节数
fileObject.read(); //读取文件的数据
(4)关闭文件输入流对象
fileObject.close();
2、使用字节流写文本文件
1、字节输出流OutputStream类
字节输出流OutputStream类的作用是把内存中的数据输出到文件中,它提供了一系列向文件中写数据的有关方法,常用的方法如表所示
方法名称 | 说明 |
---|---|
void write(int c) | 写入一个字节数据 |
void write(byte[] buf) | 写入数组buf的所有字节 |
void write(byte[] b,int off,int len) | 将字节数组中从off位置开始,长度为len的字节数据输出到输出流中 |
void close() | 关闭输出流 |
2、字节输出流FileOutputStream类
在实际应用中,我们通常使用OutputStream的子类FileOutputStream类来实现向文本文件写入数据,常用的构造方法有以下三个
(1)FileOutStream(File file).其中,file指定文件目标数据源。使用此构造方法创建文件输出对象如下
File file=new File("C:\\test.txt");
FileOutputStream fos=new FileOutputStream(file);
(2)FileOutputStream(String name).其中,name指定文件目标数据源,包含路径信息。使用此构造方法创建文件输出流对象如下。
FileOutputStream fos=new FileOutputStream("C:\\test.txt");
(3)FileOutputStream(String name,booleam append)。其中,name指定文件目标数据源,包含路径信息。append表示是否在文件末尾添加数据,若设置为true,则在文件末尾添加数据。使用此构造方法创建文件输出流对象如下
FileOutputStream fos=new FileOutputStream("C:\\test.txt",true);
3、使用FileOutputStream写文本文件
使用FileOutputStream向文本文件中写入数据的具体使用步骤如下。
(1)引入相关的类
import java.io.IOException;
import java.io.OutputStream;
import java.io.FileOutputStream;
(2)构造一个文件输出流对象
OutputStream fos=new FileOutputStream("C:\\test.txt");
(3)利用文件输出流的方法把数据写入文本文件中
String str="好好学习Java";
byte[] words=str.getBytes();
//利用write方法将数据写入文件中去
fos.write(words,0,words.length);
(4)关闭文件输出流
fos.close();
3、使用字符流读取文本文件
1、字符输入流Reader类
Reader类是读取字符流的抽象类,它提供了常用的方法,如表所示
方法名称 | 说明 |
---|---|
int read() | 从输入流中读取单个字符 |
int read(byte[] c) | 从输入流中读取c.length长度的字符,保存到字符数组c中,返回实际读取的字符数 |
read(char[] c,int off,int len) | 从输入流中读取最多len的长度字符,保存到字符数组c中,保存的位置从off位置开始,返回实际读取的字符长度 |
void close() | 关闭流 |
2、字符输入流FileReader类
FileReader类是Reader的子类,常用的构造方法格式如下
FileReader(String fileName)
其中,fileName是指要从中读取数据的文件的名称。使用此构造方法创建字符输入流对象如下
Reader fr=new FileReader("C:\\myTest.txt");
3、使用FileReader读取文件
使用字符流类FileReader读取文本文件的具体步骤如下
(1)引入相关的类
import java.io.Reader;
import java.io.FileReader;
import java.io.IOException;
(2)创建一个FileReader对象
Reader fr=new FileReader("C:\\myTest.txt");
(3)利用FileReader类的方法读取文本文件的数据
int read(); //读取单个字符
(4)关闭相关的流对象
fr.close();
4、字符输入流BufferedReader类
BufferedReader类是Reader类的子类,它与FileReader类的区别在于,BufferedReader类带有缓冲区,它可以先把一批数据读到缓冲区,接下来的读操作作都是从缓冲区内获取数据,避免每次都从数据源读取数据进行字符编码转换,从而提高读取操作的效率。BufferedReader类常用的构造方法格式如下。
BufferedReader(Reader in)
使用此构造方法创建字符输入对象如下
Reader fr=new FileReader("C:\\myTest.txt");
BufferedReader br=new BufferedReader(fr);
其中,br就是创建的一个使用默认大小输入缓冲区的缓冲字符输入流
5、使用FileReader和BufferedReader读取文本文件
使用字符流类BufferedReader和FileReader读取文本文件的具体步骤如下
(1)引入相关的类
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
(2)创建一个BufferedReader对象
Reader fr=new FileReader("C:\\myTest.txt");
BufferedReader br=new BufferedReader(fr);
(3)利用BufferedReader类的方法读取文本文件的数据
br.readLine(); //读取一行数据,返回字符串
readLine()方法是BufferedReader类特有的方法,用来按行读取内容
(4)关闭相关的流对象
br.close();
fr.close();
4、使用字符流写入文本文件
1、字符输出流writer类
writer类是向文件写入数据的字符流,它提供了常用的方法,如表所示
方法名称 | 说明 |
---|---|
write(String str) | 将str字符串里包含的字符输出到指定的输出流中 |
write(String str,int off,int len) | 将str字符串里从off位置开始长度为len的字符输出到输出流中 |
void close() | 关闭输出流 |
void flush() | 刷新输出流 |
2、字符输出流FileWriter类
FileWriter类是Reader的子类,常用的构造方法格式如下
FileWriter(String fileName)
其中,fileName表示与系统有关的文件名,使用此构造方法创建字符输出对象如下
Writer fr=new FileWriter("C:\\myTest.txt");
3、使用FileWriter写入文本文件
使用字符流类FileWriter将数据写入文本文件的具体操作步骤如下
(1)引入相关的类
import java.io.FileWriter;
import java.io.IOException;
(2)创建一个FileWriter对象
Writer fw=new FileWriter("C:\\myTest.txt");
(3)利用FileWriter类的方法写入文本文件
bw.write("hello");
(4)相关流对象的清空和关闭
bw.flush(); //刷新该流的缓冲
fw.close(); //关闭此流
4、字符输入流BufferedWriter类
BufferedWriter类是Writer类的子类.BufferedWriter与BufferedReader的流方向正好相反,BufferedWriter是把一批数据写到缓冲区,当缓冲区满的时候,再把缓冲区的数据写到字符输出流中。这可以避免每次都执行物理写操作,从而提高输入/输出操作的效率。BufferedWriter类的常用构造方法如下
BufferedWriter(Writer out)
使用此构造方法创建字符输出流对象如下
Writer fr=new FileWriter("C:\\myTest.txt");
BufferedWriter br=new BufferedWriter(fw);
其中,bw就是创建的一个使用默认大小输入缓冲区的缓冲字符输入流
5、使用BufferedWriter和FileWriter文本文件
使用字符流类BufferedWriter和FileWriter将数据写入文本文件的具体操作步骤如下
(1)引入相关的类
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
(2)构造一个BufferedWriter对象
FileWriter fw=new FileWriter("C:\\myTest.txt");
BufferedWriter bw=new BufferedWriter(fw);
(3)利用BufferedWriter类的方法写文本文件
bw.writer("hello");
(4)相关流对象的清空和关闭
bw.flush(); //刷新该流的缓冲
fw.close(); //关闭此流
四、二进制文件的读写
1、使用字节流类DataInputStream读二进制文件
DataInputStream类是FileInputStream的子类,它是FileInputStream类的扩展。利用DataInputStream类读取二进制文件的实现步骤其实与用FileInputStream类读取文本文件的步骤极其相似,而且还要用到FileInputStream类
具体操作步骤如下
(1)引入相关的类
import java.io.FileInputStream;
import java.io.DataInputStream;
(2)构造一个数据输入流对象
FileInputStream fis=new FileInputStream("C:\\HelloWorld.class");
DataInputStream dis=new DataInputStream(fis);
(3)利用数据输入流类的方法读取二进制文件的数据
dis.read();
(4)关闭数据输入流
dis.close();
2、使用字节流类DataOutputStream写二进制文件
DataOutputStream类是FileOutputStream的子类,它是FileOutputStream类的扩展。利用DataOutputStream类写二进制文件的实现步骤其实与用FileOutputStream类写文本文件的步骤极其相似,而且还要用到FileOutputStream类。具体操作步骤如下
(1)引入相关的类
import java.io.FileOutputStream;
import java.io.DataOutputStream;
(2)构造一个数据输出流对象
FileOutputStream outFile=new FileOutputStream("C:\\temp.class");
DataOutputStream out=new DataOutputStream(outFile);
(3)利用数据输出流类的方法写二进制文件的数据
out.write(1); //将指定字节数据写入二进制文件
(4)关闭数据输出流
out.close();