Java定义了两种类型的流,字节流和字符流。
字节流为处理字节的输入和输出提供了方便,如读写二进制数据。字节流在处理文件时也特别有用。
字符流的设计是为了处理字符的输入和输出,它们使用Unicode,可以国际化。
本篇是用字节流处理文件。
1.使用字节流读取文件的内容(在finally块中手动关闭文件)
首先在创建工程的目录下,手动生成名为"1.txt"的文本文档,向"1.txt"中添加一段内容:Aiya Earendil Elenion Aucalima!
import java.io.*;
public class ShowFile {
public static void main(String[] args) {
int i;
String filename = "1.txt"; //要打开文件的名称
FileInputStream fin=null; //fin初始化为空
try{
fin=new FileInputStream(filename); //创建FileInputStream的对象
do{
i=fin.read(); //read()被调用时,它从文件读取一个字节,并将其作为整数值返回。当到达文件结尾时,read()会返回-1.
if(i!=-1) System.out.print((char)i); //读取操作,输出i对应的字符
}while(i!=-1);
}catch(FileNotFoundException e){ //抛出文件为找到异常
System.out.println("File Not Found!");
return;
}catch(IOException e){ //抛出读文件错误异常
System.out.println("An IO Error Occurred!");
}finally{ //在finally块中手动关闭文件
try{
if(fin!=null) fin.close(); //注意fin被初始化为null。在finally块中,fin不为空时才关闭文件。这样做的原因是只有文件被成功打开,fin才不会为null.因为,在打开文件的过程中出现异常,就不会调用close().
}catch(IOException e){
System.out.println("Error Closing File!");
}
}
}
}
在运行程序后会显示:Aiya Earendil Elenion Aucalima!
2.使用字节流将一个文件的内容写入到另一个文件(在finally块中手动关闭文件)
同样在创建工程的目录下,手动生成名为"afile.txt"和"copiedfile.txt"的文本文档,仅向"afile.txt"中添加一段内容:Aiya Earendil Elenion Aucalima!
import java.io.*;
public class CopyFile {
public static void main(String[] args) {
int i;
String afile="Afile.txt";
String copiedfile="copiedfile.txt";
FileInputStream fin=null;
FileOutputStream fout=null;
try{
fin=new FileInputStream(afile);
fout=new FileOutputStream(copiedfile);
do{
i=fin.read(); //从一个文件读取字节
if(i!=-1) fout.write(i); //然后写入另一个文件
}while(i!=-1);
}catch(IOException e){
System.out.println("I/O Error: "+e);
}finally{
try{
if(fin!=null) fin.close();
}catch(IOException e){
System.out.println("Error Closing Input File!");
}
try{
if(fout!=null) fout.close();
}catch(IOException e){
System.out.println("Error Closing Output File!");
}
}
}
}
运行程序后再次打开工程目录下的"copiedfile.txt"文件就会发现其中出现了一句话:Aiya Earendil Elenion Aucalima!
在JDK7以后,Java新增了一种功能,通过自动关闭资源的过程管理资源(例如文件流)提供了另一种更简化的方式,这种功能的基础是一种新形势的try语句,称为try-with-resourses。它的优势在于避免了当不需要文件(或其它资源)时忘记关闭文件的情况。毕竟忘记关闭文件可能导致内存泄露情况,并引发其它问题。
3.使用try-with-resourses修改上面的ShowFile.java
import java.io.*;
public class ShowFile2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i;
String filename = "1Cg.txt"; //要打开文件的名称
try(FileInputStream fin=new FileInputStream(filename)){ //try-with-resources块
do{
i=fin.read(); //read()被调用时,它从文件读取一个字节,并将其作为整数值返回。当到达文件结尾时,read()会返回-1.
if(i!=-1) System.out.print((char)i); //读取操作,输出i对应的字符
}while(i!=-1);
}catch(IOException e){
System.out.println("I/O Error:"+e);
}
}
}
4.使用try-with-resourses修改上面的CopyFile.java
import java.io.*;
public class CopyFile2 {
public static void main(String[] args) {
String afile="afile.txt";
String copiedfile="copiedfile.txt";
try(FileInputStream fin=new FileInputStream(afile);
FileOutputStream fout=new FileOutputStream(copiedfile))
{
do{
i=fin.read();
if(i!=-1) fout.write(i);
}while(i!=-1);
}catch(IOException e){
System.out.println("I/O Error: "+e);
}
}
}