国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java進(jìn)階教程之IO基礎(chǔ)

2019-11-26 15:26:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

計(jì)算機(jī)最重要的功能是處理數(shù)據(jù)。一個(gè)有用的計(jì)算機(jī)語(yǔ)言需要擁有良好的IO功能,以便讓未處理的數(shù)據(jù)流入程序,讓已處理的數(shù)據(jù)流出。

與其他語(yǔ)言相比,Java的IO功能顯得復(fù)雜。在其他語(yǔ)言中,許多IO功能(比如讀取文件),是被封裝好的,可以用一兩行程序?qū)崿F(xiàn)。在Java中,程序員往往需要多個(gè)層次的裝飾(decoration),才能實(shí)現(xiàn)文件讀取。

相對(duì)的復(fù)雜性帶來(lái)的好處是IO的靈活性。在Java中,程序員可以控制IO的整個(gè)流程,從而設(shè)計(jì)出最好的IO方式。我們將在下文看到更多。

 IO示例

 下面是我用于演示的文件file.txt

Hello World!Hello Nerd!

我們先來(lái)研究一個(gè)文件讀取的例子:

import java.io.*;public class Test{  public static void main(String[] args)  {    try {      BufferedReader br =       new BufferedReader(new FileReader("file.txt"));       String line = br.readLine();      while (line != null) {        System.out.println(line);        line = br.readLine();      }      br.close();    }    catch(IOException e) {      System.out.println("IO Problem");    }  }}

這段程序中包含一個(gè)try...catch...finally的異常處理器。可參考Java進(jìn)階教程之 異常處理

 裝飾器與功能組合

程序IO的關(guān)鍵在于創(chuàng)建BufferedReader對(duì)象br:

  BufferedReader br = new BufferedReader(new FileReader("file.txt"));

在創(chuàng)建的過程中,我們先建立了一個(gè)FileReader對(duì)象,這個(gè)對(duì)象的功能是從文件"file.txt"中讀取字節(jié)(byte)流,并轉(zhuǎn)換為文本流。在Java中,標(biāo)準(zhǔn)的文本編碼方式為unicode。BufferedReader()接收該FileReader對(duì)象,并拓展FileReader的功能,新建出一個(gè)BufferedReader對(duì)象。該對(duì)象除了有上述的文件讀取和轉(zhuǎn)換的功能外,還提供了緩存讀取(buffered)的功能。最后,我們通過對(duì)br對(duì)象調(diào)用readLine()方法,可以逐行的讀取文件。

(緩存讀取是在內(nèi)存中開辟一片區(qū)域作為緩存,該區(qū)域存放FileReader讀出的文本流。當(dāng)該緩存的內(nèi)容被讀走后(比如readLine()命令),緩存會(huì)加載后續(xù)的文本流。)

BufferedReader()是一個(gè)裝飾器(decorator),它接收一個(gè)原始的對(duì)象,并返回一個(gè)經(jīng)過裝飾的、功能更復(fù)雜的對(duì)象。修飾器的好處是,它可以用于修飾不同的對(duì)象。我們這里被修飾的是從文件中讀取的文本流。其他的文本流,比如標(biāo)準(zhǔn)輸入,網(wǎng)絡(luò)傳輸?shù)牧鞯鹊龋伎梢员籅ufferedReader()修飾,從而實(shí)現(xiàn)緩存讀取。

 下圖顯示了br的工作方式,數(shù)據(jù)自下而上流動(dòng):

 

上述的裝飾過程與Linux中的文本流思想很相似。在Linux中,我們使用類似函數(shù)的方式來(lái)處理和傳遞文本流。在Java中,我們使用了裝飾器。但它們的目的都類似,就是實(shí)現(xiàn)功能的模塊化和自由組合。

 更多的組合

事實(shí)上,Java提供了豐富的裝飾器。FileReader中合并了讀取和轉(zhuǎn)換兩個(gè)步驟,并采用了常用的默認(rèn)設(shè)置,比如編碼采取unicode。我們可以使用FileInputStream + InputStreamReader的組合來(lái)替代FileReader,從而分離讀取字節(jié)和轉(zhuǎn)換兩個(gè)步驟,并對(duì)兩個(gè)過程有更好的控制。

(當(dāng)然,F(xiàn)ileReader的使用更加方便。InputStreamReader是將FileInputStream轉(zhuǎn)換成一個(gè)Reader,用于處理unicode文本)

箭頭表示數(shù)據(jù)流動(dòng)方向

 流的讀寫來(lái)自于四個(gè)基類: InputStream, OutputStream, Reader和Writer。InputStream和Reader是處理讀取操作,OutputStream和Writer是處理寫入操作。它們都位于java.io包中。繼承關(guān)系如下:

 java.io

 此外,IOException有如下衍生類:

IOException

 Reader和Writer及其衍生類是處理unicode文本。如我們看到的Buffered Reader, InputStreamReader或者FileReader。

InputStream和OutputStream及其衍生類是處理字節(jié)(byte)流。計(jì)算機(jī)中的數(shù)據(jù)都可以認(rèn)為是字節(jié)形式,所以InputStream和OutputStream可用于處理更加廣泛的數(shù)據(jù)。比如我們可以使用下面的組合來(lái)讀取壓縮文件中包含的數(shù)據(jù)(比如整數(shù)):

箭頭表示數(shù)據(jù)流動(dòng)方向

 我們從壓縮文件中讀出字節(jié)流,然后解壓縮,最終讀出數(shù)據(jù)。

 寫入

寫入(write)操作與讀取操作相似。我們可以通過使用裝飾,實(shí)現(xiàn)復(fù)雜的寫入功能。這里是一個(gè)簡(jiǎn)單的寫入文本的例子:

import java.io.*;public class Test{  public static void main(String[] args)  {    try {      String content = "Thank you for your fish.";      File file = new File("new.txt");      // create the file if doesn't exists      if (!file.exists()) {        file.createNewFile();      }      FileWriter fw = new FileWriter(file.getAbsoluteFile());      BufferedWriter bw = new BufferedWriter(fw);      bw.write(content);      bw.close();    }    catch(IOException e) {      System.out.println("IO Problem");    }  }}

上面創(chuàng)建了file對(duì)象,用于處理文件路徑。

總結(jié)

這里只是對(duì)Java IO的基本介紹。Java的IO相對(duì)比較復(fù)雜。Java程序員需要花一些時(shí)間來(lái)熟悉java.io中的類及其功能。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 正宁县| 苍溪县| 新营市| 盐亭县| 文山县| 阜南县| 苗栗县| 罗江县| 张家口市| 昌宁县| 板桥市| 固镇县| 茌平县| 南澳县| 临澧县| 项城市| 英超| 遵义市| 隆回县| 景东| 沐川县| 怀柔区| 海阳市| 汽车| 六安市| 平昌县| 五指山市| 罗源县| 湘乡市| 贵德县| 深泽县| 绥中县| 浦东新区| 安阳县| 唐河县| 松原市| 松原市| 兰西县| 新蔡县| 宁都县| 长宁区|