java ioutils 寫入文件_文件輸入輸出流工具: IOUtils使用總結

序言

以前寫文件的復制很麻煩,需要各種輸入流,然后讀取line,輸出到輸出流...其實apache.commons.io里面提供了輸入流輸出流的常用工具方法,非常方便。下面就結合源碼,看看IOUTils都有什么用處吧!

常用的靜態變量

在IOUtils中還是有很多常用的一些變量的,比如換行符等等

public static final char DIR_SEPARATOR_UNIX = '/';

public static final char DIR_SEPARATOR_WINDOWS = '\\';

public static final char DIR_SEPARATOR;

public static final String LINE_SEPARATOR_UNIX = "\n";

public static final String LINE_SEPARATOR_WINDOWS = "\r\n";

public static final String LINE_SEPARATOR;

static {

DIR_SEPARATOR = File.separatorChar;

StringBuilderWriter buf = new StringBuilderWriter(4);

PrintWriter out = new PrintWriter(buf);

out.println();

LINE_SEPARATOR = buf.toString();

out.close();

}

常用方法

copy

這個方法可以拷貝流,算是這個工具類中使用最多的方法了。支持多種數據間的拷貝:

copy(inputstream,outputstream)

copy(inputstream,writer)

copy(inputstream,writer,encoding)

copy(reader,outputstream)

copy(reader,writer)

copy(reader,writer,encoding)

copy內部使用的其實還是copyLarge方法。因為copy能拷貝Integer.MAX_VALUE的字節數據,即2^31-1。

copyLarge

這個方法適合拷貝較大的數據流,比如2G以上。

copyLarge(reader,writer) 默認會用1024*4的buffer來讀取

copyLarge(reader,writer,buffer)

內部的細節可以參考:

public static long copyLarge(Reader input, Writer output, char [] buffer) throws IOException {

long count = 0;

int n = 0;

while (EOF != (n = input.read(buffer))) {

output.write(buffer, 0, n);

count += n;

}

return count;

}

這個方法會用一個固定大小的Buffer,持續不斷的讀取數據,然后寫入到輸出流中。

read

從一個流中讀取內容

read(inputstream,byte[])

read(inputstream,byte[],offset,length)

//offset是buffer的偏移值,length是讀取的長度

read(reader,char[])

read(reader,char[],offset,length)

這里我寫了個小例子,可以測試read方法的效果:

@Test

public void readTest(){

try{

byte[] bytes = new byte[4];

InputStream is = IOUtils.toInputStream("hello world");

IOUtils.read(is, bytes);

System.out.println(new String(bytes));

bytes = new byte[10];

is = IOUtils.toInputStream("hello world");

IOUtils.read(is, bytes, 2, 4);

System.out.println(new String(bytes));

} catch (IOException e) {

e.printStackTrace();

}

}

得到的結果是:

hell

□□hell□□□□

readFully

這個方法會讀取指定長度的流,如果讀取的長度不夠,就會拋出異常

readFully(inputstream,byte[])

readFully(inputstream,byte[],offset,length)

readFully(reader,charp[])

readFully(reader,char[],offset,length)

比如:

@Test

public void readFullyTest(){

byte[] bytes = new byte[4];

InputStream is = IOUtils.toInputStream("hello world");

try {

IOUtils.readFully(is,bytes);

System.out.println(new String(bytes));

} catch (IOException e) {

e.printStackTrace();

}

}

輸出

hell

但是如果讀取20個byte,就會出錯了

java.io.EOFException: Length to read: 20 actual: 11

at org.apache.commons.io.IOUtils.readFully(IOUtils.java:2539)

at org.apache.commons.io.IOUtils.readFully(IOUtils.java:2558)

at test.java.IOUtilsTest.readFullyTest(IOUtilsTest.java:22)

...

readLines

readLines方法可以從流中讀取內容,并轉換為String的list

readLines(inputstream)

readLines(inputstream,charset)

readLines(inputstream,encoding)

readLines(reader)

這個方法極大簡化了之前原始的讀取方法:

@Test

public void readLinesTest(){

try{

InputStream is = new FileInputStream("D://test1.txt");

List lines = IOUtils.readLines(is);

for(String line : lines){

System.out.println(line);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

輸出內容:

hello

world

nihao

ioutils

skip

這個方法用于跳過指定長度的流,

skip(inputstream,skip_length)

skip(ReadableByteChannel,skip_length)

skip(reader,skip_length)

例如:

@Test

public void skipTest(){

InputStream is = IOUtils.toInputStream("hello world");

try {

IOUtils.skip(is,4);

System.out.println(IOUtils.toString(is,"utf-8"));

} catch (IOException e) {

e.printStackTrace();

}

}

skipFully

這個方法類似skip,只是如果忽略的長度大于現有的長度,就會拋出異常

skipFully(inputstream,toSkip)

skipFully(readableByteChannel,toSkip)

skipFully(inputstream,toSkip)

例如

@Test

public void skipFullyTest(){

InputStream is = IOUtils.toInputStream("hello world");

try {

IOUtils.skipFully(is,30);

System.out.println(IOUtils.toString(is,"utf-8"));

} catch (IOException e) {

e.printStackTrace();

}

}

write

這個方法可以把數據寫入到輸出流中

write(byte[] data, OutputStream output)

write(byte[] data, Writer output)

write(byte[] data, Writer output, Charset encoding)

write(byte[] data, Writer output, String encoding)

write(char[] data, OutputStream output)

write(char[] data, OutputStream output, Charset encoding)

write(char[] data, OutputStream output, String encoding)

write(char[] data, Writer output)

write(CharSequence data, OutputStream output)

write(CharSequence data, OutputStream output, Charset encoding)

write(CharSequence data, OutputStream output, String encoding)

write(CharSequence data, Writer output)

write(StringBuffer data, OutputStream output)

write(StringBuffer data, OutputStream output, String encoding)

write(StringBuffer data, Writer output)

write(String data, OutputStream output)

write(String data, OutputStream output, Charset encoding)

write(String data, OutputStream output, String encoding)

write(String data, Writer output)

例如

@Test

public void writeTest(){

try {

OutputStream os = new FileOutputStream("E:/test.txt");

IOUtils.write("hello write!",os);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

writeLines

這個方法可以把string的List寫入到輸出流中

writeLines(Collection> lines, String lineEnding, OutputStream output)

writeLines(Collection> lines, String lineEnding, OutputStream output, Charset encoding)

writeLines(Collection> lines, String lineEnding, OutputStream output, String encoding)

writeLines(Collection> lines, String lineEnding, Writer writer)

例如

@Test

public void writeLinesTest() throws IOException {

List lines = new ArrayList();

lines.add("hello");

lines.add("list");

lines.add("to");

lines.add("file");

OutputStream os = new FileOutputStream("E:/test.txt");

IOUtils.writeLines(lines,IOUtils.LINE_SEPARATOR,os);

}

close

關閉URL連接

close(URLConnection conn)

closeQuietly

忽略nulls和異常,關閉某個流

close(URLConnection conn)

closeQuietly(Closeable... closeables)

closeQuietly(Closeable closeable)

closeQuietly(InputStream input)

closeQuietly(OutputStream output)

closeQuietly(Reader input)

closeQuietly(Selector selector)

closeQuietly(ServerSocket sock)

closeQuietly(Socket sock)

closeQuietly(Writer output)

contentEquals

比較兩個流是否相同

contentEquals(InputStream input1, InputStream input2)

contentEquals(Reader input1, Reader input2)

例如

@Test

public void contentEqualsTest(){

InputStream is1 = IOUtils.toInputStream("hello123");

InputStream is2 = IOUtils.toInputStream("hello123");

try {

System.out.println(IOUtils.contentEquals(is1,is2));

} catch (IOException e) {

e.printStackTrace();

}

}

contentEqualsIgnoreEOL

比較兩個流,忽略換行符

contentEqualsIgnoreEOL(Reader input1, Reader input2)

lineIterator

讀取流,返回迭代器

lineIterator(InputStream input, Charset encoding)

lineIterator(InputStream input, String encoding)

lineIterator(Reader reader)

toBufferedInputStream

把流的全部內容放在另一個流中

toBufferedInputStream(InputStream input)

toBufferedInputStream(InputStream input, int size)

toBufferedReader

返回輸入流

toBufferedReader(Reader reader)

toBufferedReader(Reader reader, int size)

toByteArray

返回字節數組

toByteArray(InputStream input)

toByteArray(InputStream input, int size)

toByteArray(InputStream input, long size)

toByteArray(Reader input)

toByteArray(Reader input, Charset encoding)

toByteArray(Reader input, String encoding)

toByteArray(String input)

toByteArray(URI uri)

toByteArray(URL url)

toByteArray(URLConnection urlConn)

toCharArray

返回字符數組

toCharArray(InputStream is)

toCharArray(InputStream is, Charset encoding)

toCharArray(InputStream is, String encoding)

toCharArray(Reader input)

toInputStream

返回輸入流

toInputStream(CharSequence input)

toInputStream(CharSequence input, Charset encoding)

toInputStream(CharSequence input, String encoding)

toInputStream(String input)

toInputStream(String input, Charset encoding)

toInputStream(String input, String encoding)

toString

返回字符串

toString(byte[] input)

toString(byte[] input, String encoding)

toString(InputStream input)

toString(InputStream input, Charset encoding)

toString(InputStream input, String encoding)

toString(Reader input)

toString(URI uri)

toString(URI uri, Charset encoding)

toString(URI uri, String encoding)

toString(URL url)

toString(URL url, Charset encoding)

toString(URL url, String encoding)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536843.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

權限組件(6):權限分配的角色管理

效果圖: 為了方便開發,先把中間件注釋掉,要不還要在角色-權限表中添加對應關系。又因為二級菜單和面包屑導航需要中間件的變量,所以要在layout.html里面把這兩個也注釋掉。setting.py# rbac.middlewares.rbac.RbacMiddleware layo…

java 面試700問_JAVA面試700問(一)

1、Java環境中的字節碼是什么?由Java 編譯器生成的一種代碼。由JVM生成的一種代碼。Java源文件(Java Source File)的別名。一種寫在類的實例方法中的代碼。答案:由Java 編譯器生成的一種代碼。2、什么是Java垃圾回收機制?操作系統周期性的刪除…

02-Django基礎知識

一、內容回顧 1、web應用程序 2、HTTP協議 a、http協議特性 b、http請求格式 c、http響應格式 3、wsgiref模塊 4、Django下載與簡單應用 a、Django簡介(MTV) b、下載django命令 c、創建項目命令 d、創建app應用 e、啟動項目   二、今日概要 1、路由層&…

java條碼大小_java - ML Kit條形碼掃描:無效的圖像數據大小

我想在捕獲的圖像中檢測條形碼。我使用android的camera2捕獲圖像。此后,將檢索圖像的元數據并將圖像保存到設備。元數據全部傳遞到下一個活動,該活動是應用程序嘗試檢測條形碼的地方。下一個活動是從先前保存的文件創建一個byte []。接下來,使…

MongoDB數據庫泄露8億電郵地址;微軟開源Windows計算器;Linux 5.0 Kernel發布丨Q新聞...

本周要聞:華為正式宣布起訴美國政府;360 首席安全官譚曉生宣布離職;阿里開源 Flutter 應用框架 Fish Redux;微軟開源 Windows 計算器;Linux 5.0 Kernel 發布;電郵驗證服務泄漏 8 億電郵地址;Chr…

mysql 視圖 分頁_mysql查看所有存儲過程,函數,視圖,觸發器,表,分頁

查詢數據庫中的存儲過程和函數方法一:select name from mysql.proc where db your_db_name and type PROCEDURE //存儲過程select name from mysql.proc where db your_db_name and type FUNCTION //函數方法二:show procedure status; //存儲過程sh…

postman里測試文件上傳(MultipartFile)

1、后臺方法: Override PostMapping("/importNumberSpaceData") public DataImportOutDTO importNumberSpaceData(MultipartFile file) throws Exception { return dataImportOutDTO; } 2、啟用postman 1、POST方法; 2、Body-form-data,key為后…

java解析上的jar包里的pom_Maven引入本地Jar包并打包進War包中的方法

1.概述在平時的開發中,有一些Jar包因為種種原因,在Maven的中央倉庫中沒有收錄,所以就要使用本地引入的方式加入進來。2. 拷貝至項目根目錄項目根目錄即pom.xml文件所在的同級目錄,可以在項目根目錄下創建文件夾lib,如下…

持續集成之 Spring Boot 實戰篇

本文作者: CODING 用戶 - 何健 這次實戰篇,我們借助「CODING 持續集成」,實現一個簡單的 Spring Boot 項目從編碼到最后部署的完整過程。本教程還有 B 站視頻版,幫助讀者更好地學習理解。 思路 在線上環境構建、測試、部署 這種情…

java靜態工廠方法模式_設計模式:簡單工廠模式(靜態工廠方法模式)

簡單工廠的構成包括三個角色:1)抽象產品類2)具體產品類(繼承抽閑產品類)3)工廠類(生產具體產品)具體代碼實現1、抽象產品類/*** 抽象類*/public abstract class Car {/*** 產品抽象方法,將會由具體產品類實現*/public abstract void driving();}2、具體產…

Kibana中的Coordinate Map地圖報索引錯誤的問題

今天做地圖定位展示,展示的是ApacheWeb服務器的訪問日志文件中的來源IP。但是中間出現了報錯環節,說是索引不能匹配到geo_point類型,實在是不懂這是在說什么,后來在網站找了方法就解決了。主要報錯如下: 報錯信息&…

mysql數據庫安裝在unix_Linux下的數據庫二:在Linux/Unix平臺安裝MySQL

推薦使用RPM工具來進行Linux下的MySQL數據庫安裝。目前的MySQLrpm安裝文件包是在SuSE Linux7.3系統平臺上打造而成的,但是在絕大多數支持RPM和glibc的其他Linux平臺中也可以進行安裝。如果選擇通用的RPM安裝包,那么RPM將靜態鏈接到Linux的線程中。下面步…

mysql時區設置gmt_將MySQL數據庫時區設置為GMT

不,不可能在MySQL實例中更改單個數據庫的時區.您可以檢索服務器和客戶端time_zone設置:SELECT global.time_zone, session.time_zone;您還可以更改整個MySQL實例的客戶端時區或時區.但要敏銳地了解現有客戶端連接的含義,以及如何解釋已存儲在實例中的DATETIME和TIME…

javaSE知識點匯總

javaSE知識點匯總Java基礎知識精華部分寫代碼:1,明確需求。我要做什么?2,分析思路。我要怎么做?1,2,3。3,確定步驟。每一個思路部分用到哪些語句,方法,和對象。4,代碼實現…

java中412是什么錯_HTTP 412 錯誤 – 先決條件失敗 (Precondition failed)

HTTP 412 錯誤 – 先決條件失敗 (Precondition failed)介紹您的 Web 服務器認為,該服務器檢測到客戶端發送的 HTTP 數據流包括一個沒有滿足的‘先決條件’規范。HTTP 循環中的 412 錯誤任何客戶端 ( 例如您的瀏覽器或我們的 CheckUpDown 機器人 ) ,都需要…

細談頁面回流與重繪

你將了解到: 什么是回流 什么是重繪 回流何時發生 重繪何時發生 如何避免回流和重繪 復制代碼帶著上面的問題,我們一探究竟 什么是回流 回流:英文是reflow 當render tree中的一部分(或全部),因為元素的規模尺寸、布局、隱藏等改變…

安卓 java中改布局_android-選項卡布局中的地圖視圖throwing,java....

我創建了一個具有選項卡布局的應用程序,單擊選項卡后,我將打開一個使用Web視圖的新活動.另外另一個選項卡使用地圖視圖,列表視圖,圖像視圖.現在,我在Samsung Galaxy Y上安裝了我的應用程序-運行正常.當我在Samsung Galaxy Tab 2上安裝相同的應用程序時,當我第一次打開地圖視圖,…

怎么樣修改PuTTY的默認字體和字符集

1.在窗口標題上點擊右鍵,選擇 Change Settings...2.在打開的配置窗口左邊選擇 Appearance,在右邊點 Font settings 里面的 Change 按鈕,選擇好中文字體,比如:宋體、新宋體之類的3.選擇配置窗口左邊的 Translation&…

python 元組比較大小_為什么元組比列表更快?

所報道的“build設速度”比率只適用于常量元組(項目用文字表示)。 仔細觀察(并在機器上重復 – 只需在shell /命令窗口input命令!)…:$ python3.1 -mtimeit -sx,y,z1,2,3 [x,y,z] 1000000 loops, best of 3: 0.379 usec per loop $ python3.1 -mtimeit […

windows軟鏈接的建立及刪除

2019獨角獸企業重金招聘Python工程師標準>>> 1.建立舉例 # 建立d:develop鏈接目錄,指向遠程的目標服務器上的e盤的對應目錄。 mklink /d d:\develop \\138.20.1.141\e$\develop# 建立d:develop鏈接目錄,指向遠程的目標服務器上的e盤的對應目錄…