【Java】JAVA使用字节流读写文件操作及try-with-resourse自动资源管理操作

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);
  }
 }
 
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值