java中IO流读取文件的方法

方式一

/**
* 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
* 当然也是可以读字符串的。
*/
     /* 貌似是说网络环境中比较复杂,每次传过来的字符是定长的,用这种方式?*/
     public  String readString1()
     {
         try
         {
             //FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。 
             FileInputStream inStream= this .openFileInput(FILE_NAME);
             ByteArrayOutputStream bos =  new  ByteArrayOutputStream();
             byte [] buffer= new  byte [ 1024 ];
             int  length=- 1 ;
             while ( (length = inStream.read(buffer) != - 1 )
             {
                 bos.write(buffer, 0 ,length);
                 // .write方法 SDK 的解释是 Writes count bytes from the byte array buffer starting at offset index to this stream.
                 //  当流关闭以后内容依然存在
             }
             bos.close();
             inStream.close();
             return  bos.toString();   
             // 为什么不一次性把buffer得大小取出来呢?为什么还要写入到bos中呢? return new(buffer,"UTF-8") 不更好么?
             // return new String(bos.toByteArray(),"UTF-8");       
         }
     }



方式二
// 有人说了 FileReader  读字符串更好,那么就用FileReader吧
     // 每次读一个是不是效率有点低了?
     private  static  String readString2()
     {
         StringBuffer str= new  StringBuffer( "" );
         File file= new  File(FILE_IN);
         try  {
             FileReader fr= new  FileReader(file);
             int  ch =  0 ;
             while ((ch = fr.read())!=- 1  )
             {
                 System.out.print(( char )ch+ " " ); 
             }
             fr.close();
         catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
             System.out.println( "File reader出错" );
         }
         return  str.toString();
     }
方式三
/*按字节读取字符串*/
/* 个人感觉最好的方式,(一次读完)读字节就读字节吧,读完转码一次不就好了*/
private  static  String readString3()
{
     String str= "" ;
     File file= new  File(FILE_IN);
     try  {
         FileInputStream in= new  FileInputStream(file);
         // size  为字串的长度 ,这里一次性读完
         int  size=in.available();
         byte [] buffer= new  byte [size];
         in.read(buffer);
         in.close();
         str= new  String(buffer, "GB2312" );
     catch  (IOException e) {
         // TODO Auto-generated catch block
         return  null ;
         e.printStackTrace();
     }
     return  str;
}

方式四

/*InputStreamReader+BufferedReader读取字符串  , InputStreamReader类是从字节流到字符流的桥梁*/
     /* 按行读对于要处理的格式化数据是一种读取的好方式 */
     private  static  String readString4()
     {
         int  len= 0 ;
         StringBuffer str= new  StringBuffer( "" );
         File file= new  File(FILE_IN);
         try  {
             FileInputStream is= new  FileInputStream(file);
             InputStreamReader isr=  new  InputStreamReader(is);
             BufferedReader in=  new  BufferedReader(isr);
             String line= null ;
             while ( (line=in.readLine())!= null  )
             {
                 if (len !=  0 )   // 处理换行符的问题
                 {
                     str.append( "\r\n" +line);
                 }
                 else
                 {
                     str.append(line);
                 }
                 len++;
             }
             in.close();
             is.close();
         catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return  str.toString();
     }

单纯追求把信息从文件中读取出来的速度的话,必然是二进制流,类似FileInputStream速度最快,因为根本不考虑任何转换,有啥读取啥。


而Reader类的,要读取字符或字符串出来,必然需要进行编码转换工作,必然需要额外点点的时间。

至于是用InputStream读取出byte[]之后,再自行new String(),还是直接用Reader来readLine()之类的直接得到String,其实基本没啥区别。如果去看源码的话,其实大多数Reader的实现就是用StringBuffer在组装字符串。

但如果直接用InputStream读取出byte[],再组装String(),可能面临所读取字节无法转换为字符的问题。比如汉字的UTF-8编码是3个字节,结果刚好只读取出了1个byte,那么肯定new String()就出乱码。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值