天天看點

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;

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

下面列舉幾個常用的列子。

  1. 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);           
  1. 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