溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何掌握java的IO流

發(fā)布時(shí)間:2021-10-12 15:04:01 來源:億速云 閱讀:94 作者:iii 欄目:編程語言

這篇文章主要介紹“如何掌握java的IO流”,在日常操作中,相信很多人在如何掌握java的IO流問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何掌握java的IO流”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

文件API

Q: File類可以用來做目錄操作嗎?

A:可以。

File對(duì)象本身可以是目錄。調(diào)用file.mkdirs()即可創(chuàng)建目錄。

Q:直接調(diào)用file.delete()可以刪除目錄嗎?

A:如果是文件或者空目錄,可以直接刪除。

但如果目錄中有文件或者子目錄,則必須遞歸刪除。

    private static boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
       //遞歸刪除目錄中的子目錄下
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目錄此時(shí)為空,可以刪除
        return dir.delete();
    }

Q: 有哪些方法判斷給定路徑下文件是否存在?

A:

1.File類的exists方法: file.exist(string)

File testFile = new File(testFilePath);
if(!testFile .exists()) {...}

2.File類的靜態(tài)exist方法, File.exist(Path path)

Path filePath = Paths.get(testFilePath);
if (Files.exists(filePath) {...}

注意靜態(tài)方法和非靜態(tài)方法的區(qū)別

字節(jié)輸入流InputStream

說一下以下這些特點(diǎn)對(duì)應(yīng)哪些Input Stream類

  • 字節(jié)數(shù)組char[] 作為輸入源的Input Stream類是——ByteArrayInputStream

  • 用文件作為輸入源的Input Stream類是?——FileInputStream

  • 用字符串作為輸入源的是?——StringBufferInputStream

  • 用于多線程之間管道通信的輸入源是——PipeInputStream

Q: FilterInputStream是什么?

A: 用于裝飾上面這些輸入流的,可以疊加,每裝飾一層就相當(dāng)于增加了1個(gè)功能。

InputStream inputStream = new FilterInputStream(InputStream)

以下這些特點(diǎn)分別對(duì)應(yīng)哪些FilterInputStream?

  • 裝飾后,不僅可讀字符串,還可讀取例如int、long等java基本類型的是————DataInputStream
    DataInputStream里面會(huì)支持readInt、readLong等方法。

  • 裝飾后,支持分批緩沖讀取讀取的是————BufferedInputStream
    創(chuàng)建BufferedInputStream時(shí),我們會(huì)通過它的構(gòu)造函數(shù)指定某個(gè)輸入流為參數(shù)。BufferedInputStream會(huì)將該輸入流數(shù)據(jù)分批讀取,每次讀取一部分到緩沖中;操作完緩沖中的這部分?jǐn)?shù)據(jù)之后,再?gòu)妮斎肓髦凶x取下一部分的數(shù)據(jù)。

  • 其他:
    PushbackInputStream: 具有1個(gè)能回退上一個(gè)字節(jié)的緩沖區(qū)
    ObjectInputStream : 一般用于反序列化讀入
    LineNumberInputStream: 可跟蹤輸入流中的行號(hào)

字節(jié)輸出流OutputStream

OutputStream包含
ByteArrayOutputStream 輸出到緩沖區(qū)
FileOutputStream 寫到文件
PipedOutputStream 寫入管道
FilterOutputStream

而FilterOutputStream 包含

  • DataOutputStream (可以out.writexxx各種類型的數(shù)據(jù),writeDouble, writeUTF, reader也一樣,可以讀想要的數(shù)據(jù)類型)、

  • PringtStream (輸出到文件用這個(gè), 該類.println(str)即可寫入文件)

  • BufferOutputString

FileOutputStream相關(guān)
Q:new FileOutputStream(name, true),這個(gè)構(gòu)造里的true參數(shù)是做什么用的?

A:是否支持在文件末追加的意思。

如何掌握java的IO流

默認(rèn)是false,指的是覆蓋整個(gè)文本。

如果設(shè)置成true,會(huì)在要寫入的文件后面追加本次寫入的內(nèi)容。

Q:

BufferOutputStream相關(guān)概念(其實(shí)是考緩沖區(qū)是否需要刷新之類的問題)

  • BufferOutputStream里的flush()方法是做什么的?

  • BufferOutputStream調(diào)用close后,會(huì)觸發(fā)flush()來刷新緩沖區(qū)嗎?

  • BufferOutputStream調(diào)用close可能會(huì)丟數(shù)據(jù)嗎?

  • BufferOutputStream多次調(diào)用close會(huì)報(bào)錯(cuò)嗎?

A:

  • flush把緩沖區(qū)里的數(shù)據(jù)寫入文件,并刷新緩沖區(qū)

如何掌握java的IO流

  • close關(guān)閉此輸出流并釋放與此相關(guān)聯(lián)的任何系統(tǒng)資源, 會(huì)調(diào)用flush,除了flushBuffer,還會(huì)調(diào)用父類的flush。

  • 不會(huì)丟數(shù)據(jù),因?yàn)樯厦孢@條原因。

  • 多次調(diào)用不會(huì)報(bào)錯(cuò)。

如何掌握java的IO流

Reader和Writer

Q: Reader/Writer和InputStream/OutputStream的區(qū)別?
A:

  • InputStream是表示 字節(jié)輸入流 的所有類的超類
    Reader是用于讀取 字符流 的抽象類
    InputStream提供的是字節(jié)流的讀取,而非文本讀取,這是和Reader類的根本區(qū)別。
    即用Reader讀取出來的是char數(shù)組或者String ,使用InputStream讀取出來的是byte數(shù)組。

  • Reader/Writer提供兼容Unicode、面向字符的IO功能,為了國(guó)際化

  • 用reader讀取標(biāo)準(zhǔn)輸入:
    BufferedReader bufr = new BufferedReader(new InputStreamReader(http://System.in));

  • 用Writer進(jìn)行標(biāo)準(zhǔn)輸出:
    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

設(shè)置編碼:

InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");  
BufferedReader read = new BufferedReader(isr);

序列化問題

Q: 對(duì)某對(duì)象進(jìn)行序列化時(shí), 如何讓里面某個(gè)敏感成員不被序列化?
A:

  • 方法一:可使用transient關(guān)鍵字處理那個(gè)敏感成員

  • 方法二:可以通過覆蓋Serializable接口的writeObject和readObject來實(shí)現(xiàn)序列化, 但是方法簽名必須是private void writeObject(ObjetOutputStream stream) throw IOException;

  • 方法三: 實(shí)現(xiàn)Externalizable接口,可自定義實(shí)現(xiàn)writeExternal以及readExternal方法

Q: Externalizable和Serializable哪個(gè)快?
A: Externalizable更快。

Q: Externalizable需要產(chǎn)生序列化ID嗎?

A: 采用Externalizable無需產(chǎn)生序列化ID(serialVersionUID)~而Serializable接口則需要

到此,關(guān)于“如何掌握java的IO流”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI