通過問題來掌握Java中的IO關鍵概念並理解其結構關係

總體概覽

Java中的IO,一直是編程中不可忽視的一大塊技術組成內容,需要掌握。


下面總體來鳥瞰一下IO中的字符流和字節流,以及相關總體構成類圖的組成關係,然後我們在具體看看一些核心概念和內容。

通過問題來掌握Java中的IO關鍵概念並理解其結構關係

IO存儲關係

通過問題來掌握Java中的IO關鍵概念並理解其結構關係

Java IO類關係圖

基礎問題

  1. 什麼是IO流?

    它是一種數據的流從源頭流到目的地。比如文件拷貝,輸入流和輸出流都包括了。輸入流從文件中讀取數據存儲到進程(process)中,輸出流從進程中讀取數據然後寫入到目標文件。

  2. 字節流和字符流的區別。

    字節流在JDK1.0中就被引進了,用於操作包含ASCII字符的文件。JAVA也支持其他的字符如Unicode,為了讀取包含Unicode字符的文件,JAVA語言設計者在JDK1.1中引入了字符流。ASCII作為Unicode的子集,對於英語字符的文件,可以使用字節流也可以使用字符流。

  3. Java中流類的超類主要有那些?

  • java.io.InputStream

  • java.io.OutputStream

  • java.io.Reader

  • java.io.Writer

4.FileInputStream和FileOutputStream是什麼?

這是在拷貝文件操作的時候,經常用到的兩個類。在處理小文件的時候,它們性能表現還不錯,在大文件的時候,最好使用BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)。

示例如下:

public class InputAndOutputBuffering{ public static void main(String args[]) throws IOException {FileInputStream fistream = new FileInputStream("myFile.txt");BufferedInputStream bistream = new BufferedInputStream(fistream);FileOutputStream fostream = new FileOutputStream("yourFile.txt");BufferedOutputStream bostream = new BufferedOutputStream(fostream);int temp; while( ( temp = bistream.read() ) != -1 ) {bostream.write(temp);System.out.print((char) temp);}bostream.close();fostream.close();bistream.close();fistream.close();}}

5.字節流和字符流,你更喜歡使用哪一個?

個人來說,更喜歡使用字符流,因為他們更新一些。許多在字符流中存在的特性,字節流中不存在。比如使用BufferedReader而不是BufferedInputStreams或DataInputStream,使用newLine()方法來讀取下一行,但是在字節流中我們需要做額外的操作。

6.System.out.println()是什麼?

println是PrintStream的一個方法。out是一個靜態PrintStream類型的成員變量,System是一個java.lang包中的類,用於和底層的操作系統進行交互。

7.什麼是Filter流?

Filter Stream是一種IO流主要作用是用來對存在的流增加一些額外的功能,像給目標文件增加源文件中不存在的行數,或者增加拷貝的性能。

8.有哪些可用的Filter流?

主要由4個可用的filter Stream。兩個字節filter stream,兩個字符filter stream. 分別是FilterInputStream, FilterOutputStream, FilterReader and FilterWriter.這些類是抽象類,不能被實例化的。

9.在字節流的讀取端Filter流的子類?

  • LineNumberInputStream 給目標文件增加行號

  • DataInputStream 有些特殊的方法如readInt(),和等可以讀取一個 int, double和一個string一次性的,

  • BufferedInputStream 增加性能

  • PushbackInputStream 推送要求的字節到系統中

10.SequenceInputStream的作用?

在拷貝多個文件到一個目標文件的時候是非常有用的。可以使用很少的代碼實現。示例如下:

public class CopyTwoFiles { public static void main(String args[]) throws IOException {FileInputStream fistream1 = new FileInputStream("D:\source\src\A.txt"); // 第一個源文件FileInputStream fistream2 = new FileInputStream("E:\source\src\B.txt"); //第二個源文件SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);FileOutputStream fostream = new FileOutputStream("C.txt"); // 目標文件int temp; while( ( temp = sistream.read() ) != -1) {System.out.print( (char) temp ); // 控制檯輸出fostream.write(temp); // 寫入文件}fostream.close();sistream.close();fistream1.close();fistream2.close();}}

11.說說PrintStream和PrintWriter

他們兩個的功能相同,但是屬於不同的分類。字節流和字符流。他們都有println()方法。

12.在文件拷貝的時候,那一種流可以提升更多的性能?

在字節流的時候,使用BufferedInputStream和BufferedOutputStream。在字符流的時候,使用BufferedReader 和 BufferedWriter

13.說說管道流(Piped Stream)

有四種管道流, PipedInputStream, PipedOutputStream, PipedReader 和 PipedWriter.在多個線程或進程中傳遞數據的時候管道流非常有用。

14.說說File類

它不屬於 IO流,也不是用於文件操作的,它主要用於知道一個文件的屬性,讀寫權限,大小等信息。

15.說說RandomAccessFile?

它在java.io包中是一個特殊的類,既不是輸入流也不是輸出流,它兩者都可以做到。他是Object的直接子類。通常來說,一個流只有一個功能,要麼讀,要麼寫。但是RandomAccessFile既可以讀文件,也可以寫文件。 DataInputStream 和 DataOutStream有的方法,在RandomAccessFile中都存在。


文末提示

如果有興趣,您可以在補充一些關於Java有關IO的內容。這裡就簡單說這些了。

原文為英文:https://way2java.com/java-questions/io-streams/

通過問題來掌握Java中的IO關鍵概念並理解其結構關係


分享到:


相關文章: