1. 程式人生 > >apache FileUtils 和 IOUtils 工具類 改寫普通檔案讀寫方式 提高效率

apache FileUtils 和 IOUtils 工具類 改寫普通檔案讀寫方式 提高效率

不重複開發的輪子,既然人家已經寫好了通用成熟的工具,與其自己吭哧吭哧寫通用類,還不如拿來用即可。但是用歸用,不瞭解還是不行滴,咻咻,

apache下 開源了許多實用的工具類,一般都是在commons包下。

這裡講到了:  IOUtils 和 FileUtils 。 中文文件奇缺,有知道的童鞋可以吱一聲。

1.IOUtils 簡要說明

該類為input/output操作提供了通用靜態方法。

包括功能:

•closeQuietly——這些關閉一個流的方法將忽略nulls和例外的情況。

•toXxx /read-這些方法從一個流讀取資料。

• write這些方法將資料寫到一個流裡。

copy——這些方法用於從一個流的所有的資料複製到另一個流。

•contentEquals——這些方法用於比較兩個流的內容。

byte-to-char方法集和char-to-byte方法集都包括一個轉換步驟。給出的兩種方法集合在每種情況下,一種是使用平臺預設的編碼方式,另一個允許你指定一個編碼。

鼓勵你總是指定一個編碼因為依靠平臺違約會帶來意想不到的結果,例如從開發階段移動到產品部署。

這個類裡面所有的方法在讀一個流的時候內部是被緩衝的。這意味著我們外部使用的時候就不需要BufferedInputStream或BufferedReader。在測試中預設快取4 K已被證明是有效。

無論在何處,在這個類裡的方法在這堂課裡不要衝洗或關閉流。這是為了避免犯不可移植的假設那小溪的來源和進一步使用。因此呼叫者還需要負責使用後手動關閉流。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 使用IOUtils來重寫原來的讀取寫入流的操作,程式碼簡潔,沒了煩人的try  以前連基本的操作都要在兩個流之間倒來倒去 還要考慮怎麼轉換,現在一切都是浮雲了。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

這邊是API的簡單介紹:

1.closeQuietly 包括對各種型別輸入輸出流的關閉。 無條件的關閉流。

byte[] data = "Hello, World".getBytes(); 

OutputStream out = null;

 try { 

    out = new FileOutputStream("foo.txt"); 

    out.write(data); 

    //out.close();//close errors are handled  我們通常的用法,是不太好的。

    } 

catch (IOException e) { 

// error handling 

} finally

 {

  IOUtils.closeQuietly(out); 以後就直接在finally裡關閉流。也不需要判斷條件。

 }


2. toByteArray 從各類輸入流中讀取資料並轉換為位元組陣列。

toByteArray(引數) 裡的引數包括:Reader,InputStream,String,這裡String 已經過時,等同於String.getBytes();

toByteArray

以位元組陣列的形式來獲取inputStream流裡的內容,如果在流的大小已知的情況下,可以用此方法來代替預設的toByteArray(InputStream input)方法。

注:該方法會檢查size是否可以安全地轉換為int,在其正式讀到位元組陣列前。

①讀操作

IOUtils類提供的讀操作方法有兩大類:第一類是readLines方法。第二類是toXxx方法。

 ※ readLines方法

List readLines(InputStream input)
List readLines(InputStream input, String encoding)
readLines(Reader input)


我們知道在位元組流中是沒有“行”的概念的,但是為什麼這裡的readLines方法可以接收InputStream呢?看看原始碼就知道了

publicstatic List readLines(InputStream input, String encoding) throws IOException {
        
if (encoding ==null{
            
return readLines(input);
        }
else{
            InputStreamReader reader =new InputStreamReader(input, encoding);

            
return readLines(reader);
        }

    }


publicstatic List readLines(Reader input) throws IOException {
        BufferedReader reader 
=new BufferedReader(input);
        List list 
=new ArrayList();
        String line 
= reader.readLine();
        
while (line !=null{
            list.add(line);
            line 
= reader.readLine();
        }

        
return list;
    }


原來在底層,IOUtils使用了InputStreamReader對input stream進行了包裝,到了readLines(Reader)方法內,又再加了一個緩衝。如果我們是直接呼叫readLines(Reader)方法,為了確保編碼正確,需要手工建立一個InputStreamReader並指明encoding,否則將採用預設的encoding。

 ※ toXxx方法

IOUtils支援把inputStream中的資料轉換成byte[],char[],String物件。而且input stream可以是位元組流,字元流。同時可以指定encoding。這些方法實質上是“輸出”的過程:即從輸入流中讀入資料,然後轉換為byte[],char[],String,輸出到記憶體中。看看下面的一個原始碼:

publicstaticchar[] toCharArray(InputStream is, String encoding)
            
throws IOException {
        CharArrayWriter output 
=new CharArrayWriter();
        copy(is, output, encoding);
        
return output.toCharArray();
    }


    
publicstaticvoid copy(InputStream input, Writer output, String encoding)
            
throws IOException {
        
if (encoding ==null{
            copy(input, output);
        }
else{
          InputStreamReader in =new InputStreamReader(input, encoding);

            copy(in, output);
        }

    }


    
publicstaticint copy(Reader input, Writer output) throws IOException {
        
long count = copyLarge(input, output);
        
if (count > Integer.MAX_VALUE) {
            
return-1;
        }

        
return (int) count;
    }


    
publicstaticlong copyLarge(Reader input, Writer output) throws IOException {
        
char[] buffer =newchar[DEFAULT_BUFFER_SIZE];
        
long count =0;
        
int n =0;
        
while (-1!= (n = input.read(buffer))) {
            output.write(buffer, 0, n);

            count 
+= n;
        }

        
return count;
    }



我們可以看到這個過程是沒有進行flush的操作的,也就是說使用者必須負責在呼叫結束後進行快取清空和輸入、輸入流關閉。對於input stream是檔案的情況,在FileUtils的檔案讀方法的最後都會呼叫IOUtils.closeQuietly(in);方法來確保輸入流正確關閉。

②寫操作

和讀操作一樣,IOUtils一樣提供了大量的寫方法,這些方法可以將byte[],char[],StringBuffer,String,Collection中的資料以位元組流,字元流的形式寫入到目的源。

 ※ writeLines方法

publicstaticvoid writeLines(Collection lines, String lineEnding,
            OutputStream output, String encoding) 
throws IOException {
        
if (encoding ==null{
            writeLines(lines, lineEnding, output);
        }
else{
            
if (lines ==null{
                
return;
            }

            
if (lineEnding ==null{
                lineEnding 
= LINE_SEPARATOR;
            }

            
for (Iterator it = lines.iterator(); it.hasNext(); ) {
                Object line 
= it.next();
                
if (line !=null{
                    output.write(line.toString().getBytes(encoding));
                }

                output.write(lineEnding.getBytes(encoding));
            }

        }

    }


publicstaticvoid writeLines(Collection lines, String lineEnding,
            Writer writer) 
throws IOException {
        
if (lines ==null{
            
return;
        }

        
if (lineEnding ==null{
            lineEnding 
= LINE_SEPARATOR;
        }

        
for (Iterator it = lines.iterator(); it.hasNext(); ) {
            Object line 
= it.next();
            
if (line !=null{
                writer.write(line.toString());
            }

            writer.write(lineEnding);
        }

    }


如果我們檢視FileUtils,會發現它對所有的檔案讀寫(包括writeLines,writeStringToFile),都是呼叫位元組流+encoding的方式來進行的。因為所有基於字元流的方式最終都需要轉換為基於位元組流的方式。

③流拷貝

我們在從檔案等資料來源讀入資料時,習慣性地以位元組讀入,到了記憶體又轉換成String物件,最後修改性地以字元寫回檔案。IOUtils提供了一系列方便的方法來進行這中間的轉換。

copy(InputStream input, Writer output, String encoding),這個方法使用指定的encoding,從位元組流中讀入位元組,然後按照encoding解碼,通過字元流寫回目的源。

copy(Reader input, OutputStream output, String encoding),這個方法從字元流中讀取字元,使用指定的encoding編碼,通過位元組流寫回目的源,然後立即清空緩衝。

上面這兩個方法底層都呼叫了一個名為copyLarge的方法,他們分別在通過一個byte[]或者char[]陣列對要寫回的內容進行緩衝。一次性地從源端讀入4K資料然後通過輸出流寫回。

publicstaticlong copyLarge(InputStream input, OutputStream output)
            
throws IOException {
        
byte[] buffer =newbyte[DEFAULT_BUFFER_SIZE];
        
long count =0;
        
int n =0;
        
while (-1!= (n = input.read(buffer))) {
            output.write(buffer, 
0, n);
            count 
+= n;
        }

        
return count;
    }


    
publicstaticlong copyLarge(Reader input, Writer output) throws IOException {
        
char[] buffer =newchar[DEFAULT_BUFFER_SIZE];
        
long count =0;
        
int n =0;
        
while (-1!= (n = input.read(buffer))) {
            output.write(buffer, 
0, n);
            count 
+= n;
        }

        
return count;
    }

相關推薦

apache FileUtils IOUtils 工具 改寫普通檔案方式 提高效率

不重複開發的輪子,既然人家已經寫好了通用成熟的工具,與其自己吭哧吭哧寫通用類,還不如拿來用即可。但是用歸用,不瞭解還是不行滴,咻咻, apache下 開源了許多實用的工具類,一般都是在commons包下。 這裡講到了:  IOUtils 和 FileUtils 。

使用org apache commons io FileUtils IOUtils 工具操作檔案

                File src = new File("G:/2012/portal/login.jsp");File tar = new File("G:/2012/portal/loginZs.jsp");File tarDir = new File("G:/2012/portal/ce

使用org.apache.commons.io.FileUtils,IOUtils;工具操作檔案

Commons IO是apache的一個開源的工具包,封裝了IO操作的相關類,使用Commons IO可以很方便的讀寫檔案, FileUtils 中提供了許多設計檔案操作的 已封裝好的方法。 IOUtils 則是提供了讀寫檔案的方法。 File s

Apache下的ArrayUtils工具總結

tostring empty length contains oem 數量 main nts int ArrayUtils中的方法: 1.add():將給定的數據添加到指定的數組中,返回一個新的數組。 2.addAll():合並兩個數組。 3.contains():檢查該數

封裝統一的參數對象Code工具

inter 數據 sta server 工具 upd ssa 網絡連接 pac 一、ResultInfo 實體承載類 package com.test.domi.common.system; public class ResultInfo<T> {

RSA加密解密工具

min ktr pan util 解密工具 verify 生成器 ace dmi 1 import org.apache.commons.codec.binary.Base64; 2 3 import javax.crypto.Cipher; 4 imp

Apache最常用的工具

本博內容摘自部落格大神一杯甜酒,部落格地址https://blog.csdn.net/u012562943/article/details/82664692 1. org.apache.commons.io.IOUtils closeQuietly() toString()

【深度精講】JFinal中的RetKv工具的區別,你用對了嗎?

在JFinal中有兩個類Map的工具類,一個是有狀態的Ret,一個是無狀態的Kv,各種自己的應用場景,你用對了嗎?       下面我們從多個方面來探究一下,JFinal針對這兩個類的設計:   一、位置-com.jfinal.kit包  

JWT Token的生成解析工具

轉載務必說明出處:https://blog.csdn.net/LiaoHongHB/article/details/84031016 關於JWT Token的生成和解析,自己寫了一個工具類僅供大家參考。 首先在pom.xml中匯入jwt的相關jar包: <dependency>

java之LineNumberReader,裝飾者模式,列印流,合併流(檔案合併分割)第三方工具(FileNameUtils)

一.LineNumberReader類 public class Kll { public static void main(String[] args) throws IOException { File file = new File("

java第16天----TreeMap的注意點,增強for迴圈,ArraysCollecttions工具,多執行緒簡介

昨天知識總結 1.泛型 泛型的定義 泛型的基礎 泛型在類上,介面上,方法上的使用 泛型–限制上限,限制下線 2.Map Map與Collection的比較 Map介面常用方法 Map的遍歷----會—重點 HashMap的去重和TreeMap的排序 Tre

[轉]DES加密解密工具,可自定義key

import javax.crypto.Cipher; import java.security.Key; import java.security.Security; public class DesUtils { /** * 字串預設鍵

PHP微信定製開發-訊息的識別訊息工具的封裝

對於訊息管理,伺服器被動回覆訊息是比較重要且需要好好掌握的知識點,在這個模組中我們需要接收到使用者傳送過來的訊息,並識別出訊息型別,最後把識別結果以文字訊息的形式響應給使用者,下面是文件地址 從文件中我們可以看出通過MsgType來判斷訊息型別,通過Content取得傳

Java筆記(十八)同步協作工具

null tac 構造方法 ken reads arr 內部 reader 參數 同步和協作工具類 一、讀寫鎖ReentrantReadWriteLock ReadWriteLock接口的定義為: public interface ReadWriteLock {

JS版日期格式化解析工具,毫秒級

/** * ===================================== * 日期相關方法 * ===================================== */ ;(function($) { $.extend(

org.apache.commons.commons-lang3工具(一)

       本文只是簡單的介紹了commons-lang3中的SystemUtils、StringUtils、ArrayUtils這三個工具類中常用的方法,我已經例舉了很多方法。commons-lang3中可以讓我們寫的程式碼更加的優雅、提供開發效率,最

java工具之Excel檔案匯入、讀取資料(支援xls、xlsx)

所需的jar包:poi的jar包儘量保持一致,不然會報版本不一致的錯誤下面是程式碼:package ReadExcel; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.

JAVA FileUtils(檔案以及操作工具)

轉別人的合併的連結 //https://www.cnblogs.com/chenhuan001/p/6575053.html   //https://blog.csdn.net/lovoo/article/details/77899627 第一個連結找不到了作者看見了說一下我給你上鍊接

Java網路程式設計之URLEncodeURLDecode工具

import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; public class EncodeTest {

org.apache.commons.lang3.StringUtils工具常用方法

在開發中,Apache 的 StringUtils 工具類有許多方法比 jdk 實現的方便許多。所有整理了幾個常用的: import org.apache.commons.lang3.StringUtils; public class StringUtilsTest {