在Java中,所有文件都是由字节组成,Java毫无疑问提供了从文件读字节和向文件中写字节的方法。然而,Java也可以使用字符流进行文件I/O操作,甚至有时候使用字符流可能会比使用字节流更有优势,基于这些,这里笔者将介绍基于两种流的文件I/O方法。
1.使用字节流读写文件
1.1 基于字节流的文件读出
首先,创建FileInputStream对象用于打开输入的文件,FileInputStream最常用的构造函数如下(当然也可以使用其他构造函数):
//fileName为要打开的文件名,若该文件不存在就会抛出FileNotFoundException
FileInputStream (String fileName) throws FileNotFoundException
其次,使用read()方法类读取文件,read方法有三个版本:
a. int read()
b. int read(byte buffer[])
c. int read(byre buffer,int offset,int numBytes)
这里我们使用版本a来做详细介绍,当到达文件末尾时,read()会返回-1,出错时则会抛出IOException.
最后,当不需要使用文件后,要调用close()方法来关闭文件,它的基本形式如下:
void close() throws IOException
从文件读入的代码示例:
FileInputStream fin=null;
int i;
try{
fin=new FileInputStream("D:\\JT\\test1.txt");
do {
i=fin.read();
if(i!=-1)
System.out.print((char) i);
}while(i!= -1);
}
catch(IOException exc){
System.out.println("I/O Error: "+exc);
}
finally{
try{
if(fin!=null)
fin.close();
}
catch(IOException exc){
System.out.println("Closing Error");
}
}
1.2 基于字节流的文件写入
首先,创建一个FileOutputStream对象,用于打开一个文件用于写入,以下是它最常用的构造函数:
//打开一个文件后会覆盖之间的同名文件
FileOutputStream(String fineName) throws FileNotFoundException
//当append的值为true时,写入会追加到文件的末尾,为false时,与上面的方法类似
FileOutputStream(String fileName,boolean append) throws FileNotFoundException
其次,我们需要使用write方法来写入文件,同样write也有几种版本,这里就不一一列举,笔者使用最简单的形式:
void write(int byteval) throws IOException //该种方法写入byteval的低8位到文件中去
最后,使用close()关闭它。
写入文件代码示例:
FileOutputStream fout=null;
int i;
try{
fout=new FileOutputStream("D:\\JT\\test1.txt",true);
do {
i=(char)System.in.read();
if(i!='#')
fout.write(i);
}while(i!='#');
}
catch(IOException exc){
System.out.println("I/O Error: "+exc);
}
finally{
try{
if(fout!=null)
fout.close();
}
catch(IOException exc){
System.out.println("Closing Error");
}
}
2.使用字符流读写文件
2.1 基于字符流的文件读出
首先,利用FileReader类创建一个用于读取文件内容的Reader,以下是它最常用的构造函数:
FileReader(String fileName) throws FileNotFoundException
其次,创建一个BufferedReader对象,调用如下代码:
BufferedReader br=new BufferedReader(new FileReader("D:\\JT\\test2"));
然后,再调用readLine()方法即可从文件以字符流的形式读出文件内容。
最后,读取完毕后,调用close()方法关闭文件即可。
基于字符流的文件写入示例:
FileReader fr=null;
try{
fr=new FileReader("C:\\JT\\test2");
BufferedReader br=new BufferedReader(fr);
while((br.readLine())!=null)
{
System.out.println(br.readLine());
}
}
catch(IOException exc){
System.out.println("I/O Error: "+exc);
}
finally{
try{
if(fr!=null)
fr.close();
}
catch(IOException exc){
System.out.println("Closing Error");
}
}
2.2 基于字符流的文件写入
首先,利用FileWriter创建一个用于写入文件的Writer,它最常用的构造函数如下:
//打开一个文件后会覆盖同名文件
FileWriter(String fileName) throws IOExpection
//append为true追加到文件末尾,否则文件被重写
FileWriter(String fileName,boolean append) throws IOExpection
其次,由于FileWriter是从OutputStream Writer和Writer派生而来的,FileWriter可以使用这些类定义write()方法,write()方法同样有几个版本,这里笔者使用的是如下版本:
void write(String str);//写入字符串str
最后,当文件处理完后同样使用close()关闭它。
基于字符流的文件写入示例:
//在输入"no"之前,文件会把键盘输入读取到文件中去
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
FileWriter fw=null;
try{
fw=new FileWriter("D:\\JT\\test2",true);
String str=br.readLine();
while(str.compareTo("no")!=0)
{
fw.write(str);
str=br.readLine();
}
}
catch(IOException exc){
System.out.println("I/O Error: "+exc);
}
finally{
try{
if(fw!=null)
fw.close();
}
catch(IOException exc){
System.out.println("Closing Error");
}
}