Java IO概述

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;
try {

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);
}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fis != null)
    try {
        fis.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
}
上面的列子中,關閉流的過程比較麻煩。實際開發過程中建議使用Apache等提供的IO工具類,比如使用org.apache.commons.io.IOUtils進行流的關閉。

緩衝流使用

BufferedInputStream和BufferedReader添加了緩衝區,會提升讀寫效率。普通的流讀寫時一次寫一個字符或字節在文件系統,效率不高。

Copy
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類可以讀寫其他進程的數據:

Copy
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
下面列舉幾個常用的列子。

  1. IOUtils讀取文件

簡單優雅。IOUtils還有很對IO相關的方法,比如copy、write等。大家用的時候可以查看API。使用起來非常簡單。

Copy
FileInputStream fileInputStream = null;
try {

fileInputStream = new FileInputStream("D:\\一週記錄.txt");
String string = IOUtils.toString(fileInputStream, "UTF8");
System.out.println(string);

} catch (IOException e) {

e.printStackTrace();

} finally {

IOUtils.closeQuietly(fileInputStream);

}

  1. FileUtils
    同樣的,FileUtils提供了相當豐富的和File交互的API。大家可以按需使用。

Copy
File file = new File("D:\一週記錄.txt");
String s = FileUtils.readFileToString(file);
因爲Commons IO內容較多,具體還是建議參考官方文檔。當我們自己想要寫一個和IO相關的工具類時,不妨
先停下來看看Commons IO中有沒類似的。畢竟大廠出的工具包久經考驗,不易出錯。還能節省我們的開發時間。

作者: 寫代碼的木公

出處:https://www.cnblogs.com/54chensongxia/p/12487764.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章