JAVA IO

Java IO: Pipes

  • 管道支持線程間通訊粱哼,但不是線程安全的傀蚌。

Java IO: Byte & Char Arrays

  • ByteArrayInputStream 或 CharArrayReader 作用讀取字節(jié)數(shù)組或字符數(shù)組能庆。
  • ByteArrayOutputStream 和 CharArrayWriter 同理

Java IO: System.in, System.out, and System.error

  • 可以通過(guò)System.setIn(), System.setOut()砖瞧, System.setErr() 重定向系統(tǒng)默認(rèn)輸入和輸出屯蹦。

Java IO: Streams

  • stream和數(shù)組不一樣嘀趟,是不支持定位移動(dòng)的脐区。
  • inputStream 的 read() 返回一個(gè)字節(jié),如果沒(méi)有可讀字節(jié)就返回-1她按。
  • 因?yàn)镕ileInputStream每次返回一個(gè)字節(jié)效率太低牛隅,通過(guò)BufferedInputStream的組合炕柔,一次可以返回一部分內(nèi)
    InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"));
    
    BufferedOutputStream 同理。

Java IO: Readers and Writers

  • 通過(guò)組合方式倔叼,將字節(jié)流轉(zhuǎn)換為字符流:
    Reader reader = new InputStreamReader(inputStream);
    
    Writer同理汗唱。
  • Buffer的組合也是類似的
    Reader reader = new BufferedReader(new FileReader(...));
    Writer writer = new BufferedWriter(new FileWriter(...));
    

Java IO Exception Handling From Java 7

  • Java7支持發(fā)生異常也能關(guān)閉資源:
    try (  
      java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);  
      java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)  
    ) {  
       // 處理流
    }
    

Java IO: InputStream

  • read(byte[] array) 一次獲取多個(gè)字節(jié),比read()效率高丈攒。
    OutputStream同理哩罪。
    read(byte[])方法會(huì)嘗試讀取與給定字節(jié)數(shù)組容量一樣大的字節(jié)數(shù),返回值說(shuō)明了已經(jīng)讀取過(guò)的字節(jié)數(shù)巡验。如果InputStream內(nèi)可讀的數(shù)據(jù)不足以填滿字節(jié)數(shù)組际插,那么數(shù)組剩余的部分將包含本次讀取之前的數(shù)據(jù)。記得檢查有多少數(shù)據(jù)實(shí)際被寫入到了字節(jié)數(shù)組中显设。

  • 如果inputStream的子類支持mark()和reset()方法框弛,它會(huì)重載markSupported(),返回true捕捂。
    mark建立書簽瑟枫,reset返回到書簽的位置。

Java IO: FileOutputStream

  • 根據(jù)構(gòu)造函數(shù)的參數(shù)指攒,決定是覆蓋文件內(nèi)容還是追加文件內(nèi)容:
    OutputStream output = new FileOutputStream("c:\\data\\output-text.txt", true); //appends to file
    OutputStream output = new FileOutputStream("c:\\data\\output-text.txt", false); //overwrites file
    

Java IO: RandomAccessFile

  • 創(chuàng)建實(shí)例對(duì)象:
    RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
    file.seek(200); // 移動(dòng)位置
    long pointer = file.getFilePointer(); // 獲取當(dāng)前位置
    int aByte = file.read(); // 讀取當(dāng)前位置的字節(jié)慷妙,并移動(dòng)到下一個(gè)位置
    file.close();
    ```
  
# Java IO: File
- 創(chuàng)建目錄:
```java
    File file = new File("c:\\data\\input-file.txt");
    boolean dirCreated = file.mkdirs();
    ```  

- 獲取目錄下文件列表:
```java
    File file = new File("c:\\data");
    String[] fileNames = file.list();
    File[]   files = file.listFiles();
    ```

# Java IO: BufferedInputStream
- BufferedInputStream的優(yōu)化:http://www.importnew.com/9363.html
- 支持 mark() 和 reset()

# Java IO: PushbackInputStream
```java
    PushbackInputStream input = new PushbackInputStream(new FileInputStream("c:\\data\\input.txt"));
    int data = input.read();
    input.unread(data); // 往回倒退
    ```
# Java IO: SequenceInputStream
- SequenceInputStream按順序讀取多個(gè)inputStream:
![SequenceInputStream](http://upload-images.jianshu.io/upload_images/6160287-d2eea6d88c3207dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
```java
    InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
    InputStream input2 = new FileInputStream("c:\\data\\file2.txt");

    SequenceInputStream sequenceInputStream =
    new SequenceInputStream(input1, input2);

    int data = sequenceInputStream.read();
    while(data != -1){
        System.out.println(data);
        data = sequenceInputStream.read();
    }

Java IO: DataInputStream

  • 作用是把字節(jié)類型轉(zhuǎn)換成Java其他的原生類型(因?yàn)樵愋偷拇笮《即笥谧止?jié)單位大小,按原生類型單位讀寫的場(chǎng)景很方便):


    DataInputStream

Java IO: PrintStream

  • 打印輸出原生類型:
    PrintStream printStream = new PrintStream(outputStream); // 組合方式使用

    printStream.print(true);
    printStream.print((int) 123);
    printStream.print((float) 123.456);

    printStream.close();
  • System.out and System.err are PrintStreams

Java IO: ObjectInputStream

  • 按對(duì)象單位讀寫允悦,前提是對(duì)象類實(shí)現(xiàn)了Serializable接口:
import java.io.*;

public class ObjectInputStreamExample {

    public static class Person implements Serializable {
        public String name = null;
        public int    age  =   0;
    }


    public static void main(String[] args) throws IOException, ClassNotFoundException {

        ObjectOutputStream objectOutputStream =
            new ObjectOutputStream(new FileOutputStream("data/person.bin"));

        Person person = new Person();
        person.name = "Jakob Jenkov";
        person.age  = 40;

        objectOutputStream.writeObject(person);
        objectOutputStream.close();


        ObjectInputStream objectInputStream =
            new ObjectInputStream(new FileInputStream("data/person.bin"));

        Person personRead = (Person) objectInputStream.readObject();

        objectInputStream.close();

        System.out.println(personRead.name);
        System.out.println(personRead.age);
    }
}

Java IO: Serializable

  • 現(xiàn)在更推薦序列化成JSON等其他可讀的格式膝擂,實(shí)現(xiàn)Serializable接口不是很好。

Java IO: Reader

  • 以字符為單位讀寫隙弛,拿UTF-8作為例子架馋,一個(gè)漢字字符有3個(gè)字節(jié)長(zhǎng)度。

Java IO: InputStreamReader

  • 轉(zhuǎn)換字節(jié)流到字符流全闷。
  • 構(gòu)造方法支持指定字符編碼叉寂。

Java IO: StreamTokenizer

  • 將字符流按token拆分:
StreamTokenizer streamTokenizer = new StreamTokenizer(
        new StringReader("Mary had 1 little lamb..."));

while(streamTokenizer.nextToken() != StreamTokenizer.TT_EOF){ // 判斷字符流是否結(jié)束

    if(streamTokenizer.ttype == StreamTokenizer.TT_WORD) { // 如果拆分后的token是字符
        System.out.println(streamTokenizer.sval);
    } else if(streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) { // 如果token是數(shù)字
        System.out.println(streamTokenizer.nval);
    } else if(streamTokenizer.ttype == StreamTokenizer.TT_EOL) { // 如果token是換行
        System.out.println();
    }

}
streamTokenizer.close();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市总珠,隨后出現(xiàn)的幾起案子办绝,更是在濱河造成了極大的恐慌,老刑警劉巖姚淆,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孕蝉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡腌逢,警方通過(guò)查閱死者的電腦和手機(jī)降淮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人佳鳖,你說(shuō)我怎么就攤上這事霍殴。” “怎么了系吩?”我有些...
    開(kāi)封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵来庭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我穿挨,道長(zhǎng)月弛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任科盛,我火速辦了婚禮帽衙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贞绵。我一直安慰自己厉萝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布榨崩。 她就那樣靜靜地躺著谴垫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪母蛛。 梳的紋絲不亂的頭發(fā)上翩剪,一...
    開(kāi)封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音溯祸,去河邊找鬼肢专。 笑死舞肆,一個(gè)胖子當(dāng)著我的面吹牛焦辅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椿胯,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼筷登,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哩盲?” 一聲冷哼從身側(cè)響起前方,我...
    開(kāi)封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廉油,沒(méi)想到半個(gè)月后惠险,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抒线,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年班巩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘶炭。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抱慌,死狀恐怖逊桦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抑进,我是刑警寧澤强经,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站寺渗,受9級(jí)特大地震影響匿情,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜户秤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一码秉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸡号,春花似錦转砖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至汞窗,卻和暖如春姓赤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仲吏。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工不铆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裹唆。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓誓斥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親许帐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劳坑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容