Java IO概述
Java中的IO接口是程式用來進行資料輸入輸出的接口。資料的輸入來源和輸出目的地可以是下面的對象:
檔案
管道
網絡連接配接
記憶體緩存
System.in, System.out,System.error(注:Java标準輸入、輸出、錯誤輸出)
關于普通Java IO的學習,需要掌握下面幾點:
流的概念
流的分類方式(輸入流/輸出流 字元流/位元組流)
常見的對象及其作用
掌握檔案讀寫/異常處理代碼(重要)
檔案FIle#
File類是Java中和平台無關的檔案、檔案夾的抽象。需要注意的是通過File類不能通路檔案本身的内容,如果需要通路檔案的内容需要通過輸入輸出流。File類的常見作用如下:
檢測檔案是否存在
讀取檔案長度
重命名或移動檔案
删除檔案
檢測某個路徑是檔案還是目錄
讀取目錄中的檔案清單
File類有個比較有趣的方法需要提下。File類的list()方法可以列舉出目前檔案夾下的檔案名,而且這個方法可以接收一個過濾器,隻顯示符合某些規則的檔案。
流#
在Java IO中,流是一個核心的概念。流從概念上來說是一個連續的資料流。你既可以從流中讀取資料,也可以往流中寫資料。流與資料源或者資料流向的媒介相關聯。在Java IO中流既可以是位元組流(以位元組為機關進行讀寫),也可以是字元流(以字元為機關進行讀寫)。
在Java中按照不同的分類方式可以分為輸入流和輸出流,位元組流和字元流。
Java IO中包含了許多InputStream、OutputStream、Reader、Writer的子類。這樣設計的原因是讓每一個類都負責不同的功能。這也就是為什麼IO包中有這麼多不同的類的緣故。各類用途彙總如下:
檔案通路
網絡通路
記憶體緩存通路
線程内部通信(管道)
緩沖
過濾
解析
讀寫文本 (Readers / Writers)
讀寫基本類型資料 (long, int etc.)
讀寫對象
一個金典的檔案讀寫列子
Copy
FileOutputStreamfos = null;
try {
//true:**表示在原來檔案基礎上繼續往下寫*
fos = new FileOutputStream("file.txt",true);
fos.write(("床前明月光" + System.lineSeparator()).getBytes());
fos.write(("疑是地上霜" + System.lineSeparator()).getBytes());
fos.write(("舉頭望明月" + System.lineSeparator()).getBytes());
fos.write(("低頭思故鄉" + System.lineSeparator()).getBytes());
} catch (IOException e) {
System.out.println("建立檔案失敗...");
e.printStackTrace();
} finally {
if (fos != null)
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
FileInputStreamfis = null;
fis = new FileInputStream("file.txt");
byte[] buff = new byte[1024];
inthasRead = 0;
while ((hasRead = fis.read(buff)) > 0) {
Stringcontext = new String(buff, 0, hasRead);
System.out.println(context);
}
e.printStackTrace();
if (fis != null)
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
上面的列子中,關閉流的過程比較麻煩。實際開發過程中建議使用Apache等提供的IO工具類,比如使用org.apache.commons.io.IOUtils進行流的關閉。
緩沖流使用
BufferedInputStream和BufferedReader添加了緩沖區,會提升讀寫效率。普通的流讀寫時一次寫一個字元或位元組在檔案系統,效率不高。
InputStream is = newFileInputStream("file.txt");
BufferedInputStreambis = new BufferedInputStream(is,1024);
Reader reader = newFileReader("file.txt");
BufferedReaderbufferedReader = new BufferedReader(reader,1024);
輸入輸出流體系#
在上圖中PrintStrem可以用來進行簡單友善輸出操作。PrintWriter功能類似。
一個Reader可以和一個InputStream相結合。如果你有一個InputStream輸入流,并且想從其中讀取字元,可以把這個InputStream包裝到InputStreamReader中。把InputStream傳遞到InputStreamReader的構造函數中。(裝飾器模式的典型使用)
PushBackInputStream可以将已經讀過的資料重新推回到流裡面,進而達到對某些資料重複讀的目的。(ServletHttpRequest中body體中的資料隻能讀一次,使用PushBackInputStream是否能解決這個問題??)
通過Process類可以讀寫其他程序的資料:
Process p =System.getRuntimes().exec("java -version");
InputStream is =p.getInputStream();
RandomAcessFile既可以向檔案輸入内容,也可以向檔案讀取内容,還可以随機通路。
Java IO中的管道為運作在同一個JVM中的兩個線程提供了通信的能力。是以管道也可以作為資料源以及目标媒介。可以通過Java IO中的PipedOutputStream和PipedInputStream建立管道。一個PipedInputStream流應該和一個PipedOutputStream流相關聯。一個線程通過PipedOutputStream寫入的資料可以被另一個線程通過相關聯的PipedInputStream讀取出來。
關于基礎的IO,暫時就介紹這麼多。
Apache的Commons IO介紹#
Apache的Common IO工具包組要包括下面這些工具。
Utility classes - with static methods to perform common tasks
Input - useful Input Stream and Reader implementations
Output - useful Output Stream and Writer implementations
Filters - various implementations of file filters
Comparators - various implementations of java.util.Comparator for files
File Monitor - a component for monitoring file system events
下面列舉幾個常用的列子。
- IOUtils讀取檔案
簡單優雅。IOUtils還有很對IO相關的方法,比如copy、write等。大家用的時候可以檢視API。使用起來非常簡單。
FileInputStream fileInputStream = null;
fileInputStream = new FileInputStream("D:\\一周記錄.txt");
String string = IOUtils.toString(fileInputStream, "UTF8");
System.out.println(string);
e.printStackTrace();
IOUtils.closeQuietly(fileInputStream);
-
FileUtils
同樣的,FileUtils提供了相當豐富的和File互動的API。大家可以按需使用。
File file = new File("D:\一周記錄.txt");
String s = FileUtils.readFileToString(file);
因為Commons IO内容較多,具體還是建議參考官方文檔。當我們自己想要寫一個和IO相關的工具類時,不妨
先停下來看看Commons IO中有沒類似的。畢竟大廠出的工具包久經考驗,不易出錯。還能節省我們的開發時間。
作者: 寫代碼的木公
出處:
https://www.cnblogs.com/54chensongxia/p/12487764.html