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呢?看看原始碼就知道了
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,輸出到記憶體中。看看下面的一個原始碼:
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方法
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資料然後通過輸出流寫回。
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中的Ret和Kv工具類的區別,你用對了嗎?
在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迴圈,Arrays和Collecttions工具類,多執行緒簡介
昨天知識總結 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網路程式設計之URLEncode和URLDecode工具類
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 {