您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何掌握java的IO流”,在日常操作中,相信很多人在如何掌握java的IO流問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何掌握java的IO流”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Q: File類可以用來做目錄操作嗎?
A:可以。
File對象本身可以是目錄。調用file.mkdirs()即可創建目錄。
Q:直接調用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; } } } // 目錄此時為空,可以刪除 return dir.delete(); }
Q: 有哪些方法判斷給定路徑下文件是否存在?
A:
1.File類的exists方法: file.exist(string)
File testFile = new File(testFilePath); if(!testFile .exists()) {...}
2.File類的靜態exist方法, File.exist(Path path)
Path filePath = Paths.get(testFilePath); if (Files.exists(filePath) {...}
注意靜態方法和非靜態方法的區別
說一下以下這些特點對應哪些Input Stream類
字節數組char[] 作為輸入源的Input Stream類是——ByteArrayInputStream
用文件作為輸入源的Input Stream類是?——FileInputStream
用字符串作為輸入源的是?——StringBufferInputStream
用于多線程之間管道通信的輸入源是——PipeInputStream
Q: FilterInputStream是什么?
A: 用于裝飾上面這些輸入流的,可以疊加,每裝飾一層就相當于增加了1個功能。
InputStream inputStream = new FilterInputStream(InputStream)
以下這些特點分別對應哪些FilterInputStream?
裝飾后,不僅可讀字符串,還可讀取例如int、long等java基本類型的是————DataInputStream
DataInputStream里面會支持readInt、readLong等方法。
裝飾后,支持分批緩沖讀取讀取的是————BufferedInputStream
創建BufferedInputStream時,我們會通過它的構造函數指定某個輸入流為參數。BufferedInputStream會將該輸入流數據分批讀取,每次讀取一部分到緩沖中;操作完緩沖中的這部分數據之后,再從輸入流中讀取下一部分的數據。
其他:
PushbackInputStream: 具有1個能回退上一個字節的緩沖區
ObjectInputStream : 一般用于反序列化讀入
LineNumberInputStream: 可跟蹤輸入流中的行號
OutputStream包含
ByteArrayOutputStream 輸出到緩沖區
FileOutputStream 寫到文件
PipedOutputStream 寫入管道
FilterOutputStream
而FilterOutputStream 包含
DataOutputStream (可以out.writexxx各種類型的數據,writeDouble, writeUTF, reader也一樣,可以讀想要的數據類型)、
PringtStream (輸出到文件用這個, 該類.println(str)即可寫入文件)
BufferOutputString
FileOutputStream相關
Q:new FileOutputStream(name, true),這個構造里的true參數是做什么用的?
A:是否支持在文件末追加的意思。
默認是false,指的是覆蓋整個文本。
如果設置成true,會在要寫入的文件后面追加本次寫入的內容。
Q:
BufferOutputStream相關概念(其實是考緩沖區是否需要刷新之類的問題)
BufferOutputStream里的flush()方法是做什么的?
BufferOutputStream調用close后,會觸發flush()來刷新緩沖區嗎?
BufferOutputStream調用close可能會丟數據嗎?
BufferOutputStream多次調用close會報錯嗎?
A:
flush把緩沖區里的數據寫入文件,并刷新緩沖區
close關閉此輸出流并釋放與此相關聯的任何系統資源, 會調用flush,除了flushBuffer,還會調用父類的flush。
不會丟數據,因為上面這條原因。
多次調用不會報錯。
Q: Reader/Writer和InputStream/OutputStream的區別?
A:
InputStream是表示 字節輸入流 的所有類的超類
Reader是用于讀取 字符流 的抽象類
InputStream提供的是字節流的讀取,而非文本讀取,這是和Reader類的根本區別。
即用Reader讀取出來的是char數組或者String ,使用InputStream讀取出來的是byte數組。
Reader/Writer提供兼容Unicode、面向字符的IO功能,為了國際化
用reader讀取標準輸入:
BufferedReader bufr = new BufferedReader(new InputStreamReader(http://System.in));
用Writer進行標準輸出:
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
設置編碼:
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8"); BufferedReader read = new BufferedReader(isr);
Q: 對某對象進行序列化時, 如何讓里面某個敏感成員不被序列化?
A:
方法一:可使用transient關鍵字處理那個敏感成員
方法二:可以通過覆蓋Serializable接口的writeObject和readObject來實現序列化, 但是方法簽名必須是private void writeObject(ObjetOutputStream stream) throw IOException;
方法三: 實現Externalizable接口,可自定義實現writeExternal以及readExternal方法
Q: Externalizable和Serializable哪個快?
A: Externalizable更快。
Q: Externalizable需要產生序列化ID嗎?
A: 采用Externalizable無需產生序列化ID(serialVersionUID)~而Serializable接口則需要
到此,關于“如何掌握java的IO流”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。