1. 程式人生 > 其它 >聊聊Java的泛型及實現

聊聊Java的泛型及實現

目錄

為初學者而著!

File類

節點流

為什麼要 close ?

Reader和Writer

IO程式程式碼的複用

關注我,帶你瞭解更多知識


為初學者而著!

Java基礎是初學者的起點,是幫助你從小白入門到精通必學基礎課程!

B站最新錄製Java300集>>> 適合準備入行開發的零基礎員學習Java,基於最新JDK13、IDEA平臺講解的,視訊中穿插多個實戰專案。每一個知識點都講解的通俗易懂,由淺入深。不僅適用於零基礎的初學者,有經驗的程式設計師也可做鞏固學習。

配套學習:​2022年Java300集最新錄製課程上線了>>>​

File類

File類是 IO 包中唯一代表磁碟檔案本身的物件,File類定義了一些與平臺無關的方法來操縱檔案

File f = new File("d:/test/1.txt");

常用方法見 API

delete 方法刪除由File物件的路徑所表示 對磁碟檔案或目錄。如果刪除的物件是目錄,該目錄中的內容必須為空。

節點流

我們將IO流類分為兩個大類,節點流類和過濾流類(也叫處理流類)。

1. 程式用於直接操作目標裝置所對應的類叫節點流類

2. 程式也可以通過一個間接流類去呼叫結點流類,以達到更加靈活方便地讀寫各種型別的資料,這個間接流類就是過濾流類(也叫處理流類)

InputStream 與 OutputStream (抽象類[位元組流])

程式可以從中連續 讀取位元組 的物件叫輸入流,用InputStream類完成

int read() // 返回 -1 表示遇到流的末尾,結束
int read(byte[] b) //讀入b.length個直接放入到b中並返回實際讀入的位元組數
int read(byte[] b,int off,int len)
void close() //關閉,通知系統釋放與這個流相關的資源

程式能向其中連續 寫入位元組 的物件叫輸出流,用OutputStream類完成

void write(int b) //將一個直接寫到輸入流
void write(byte[] b) //將整個直接陣列寫到輸出流中
void write(byte[] b,int off,int len) //
void flush() //徹底完成輸出並清空緩衝區
void close() //關閉輸出流

這裡的輸入輸出是針對程式而言的,而非檔案。

輸入: 程式讀取 輸出:程式寫出

將A檔案的內容寫入檔案B中:

我們應該建立一個輸入類來完成對A檔案的操作,再建立一個輸出類來完成對B檔案的操作。

FileInputStream 與 FileOutputStream

這兩個源節點用來操作磁碟檔案,在建立一個FileInputStream物件時通過建構函式指定檔案的路徑和名字,當然這個檔案應當是存在的和可讀的。在建立一個FileOutputStream物件時指定檔案如果存在將要被覆蓋。

只能用來讀取位元組或位元組陣列!!!因此字串需要使用getBytes()方法轉為位元組陣列。

注:unicode是雙位元組的,而ASCII是單位元組的。java中的字元預設使用unicode編碼!

程式設計實現利用FileOutputStream類向檔案寫入一串字元,並用FileInputStream讀出:

public class FileStreamDemo {
public static void main(String[] args) {
File f = new File("Hello.txt");
//輸出到檔案中
try {
FileOutputStream out = new FileOutputStream(f);
byte buf[] = "hello,well".getBytes();//轉成位元組輸出
out.write(buf);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
//從檔案中讀出顯示到螢幕上
try {
FileInputStream in = new FileInputStream(f);
byte[] buff = new byte[1024];
int len = in.read(buff);
System.out.println(new String(buff,0,len));
} catch (Exception e) {
e.printStackTrace();
}
}
}

為什麼要 close ?

Java垃圾回收器只能管理程式中的類的例項物件,沒法去管理系統產生的資源,所以程式要呼叫 close 方法,去通知系統去釋放其自身產生的資源。

這兩個類都只提供了對位元組或位元組陣列進行讀出的方法。對於字串的讀寫,我們還需要進行額外的轉換。

Reader和Writer

1. 抽象類,用於直接讀取字串文字

2. Java為字元文字(直接讀取字串)的輸入輸出專門提供的一套單獨的類,其在處理字串時簡化了我們的程式設計。

對上面的程式進行如下的修改:—— 使用FileWriter 和 FileReader類來實現直接對字串的讀取:

public class FileStreamDemo2 {
public static void main(String[] args) {
File f = new File("Hello.txt");
try {
FileWriter out = new FileWriter(f);
out.write("hello world,hahaha");
out.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
FileReader in = new FileReader(f);
char[] buf = new char[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
} catch (Exception e) {
e.printStackTrace();
}
}
}

FileReader的真正優勢要結合包裝流類才能體現出來!!

PipedInputStream 與 PipedOutputStream

一個PipeInputStream物件必須和一個PipedOutputStream物件進行連線而產生一個通訊管道。

這兩個類主要來完成執行緒之間的通訊。 --- p 266

一個執行緒的PipedInputStream物件能夠從另一個執行緒的PipedOutputStream物件中讀取資料。

void connect(PipedOutputStream src)使此管道輸入流連線到管道輸出流 src。

JDK還提供了PipedWriter和PipedReader這兩個類來用於字串文字的管道通訊。

使用管道流,可以實現各個程式模組之間的鬆耦合通訊。

ByteArrayInputStream 與 ByteArrayOutputStream

1. 使用位元組陣列作為資料來源

2. 作用:使用IO流的方式來完成對位元組陣列內容的讀寫

IO程式程式碼的複用

由於沒有編碼為 -1 的字元,所以OS使用 -1 作為硬碟上的每個檔案的結尾標記

文字檔案與二進位制檔案:

1. 如果一個檔案專用於儲存文字字元的資料,沒有包含字元之外的其他資料,我們稱之為文字檔案

2. 除此之外的檔案就是二進位制檔案

為了支援標準輸入輸出裝置,Java定義了兩個特殊的流物件:System.in 和 System.out

System.in 對應鍵盤,是InPutStream型別的,從鍵盤讀取資料

System.out 對應螢幕,是PrintStream型別的

Scanner類

該類不屬於IO類,而屬於util類

它是一個可以用正則表示式來解析基本型別和字串的簡單文字掃描器

Scanner 使用分隔符模式將其輸入分解為標記,預設情況下該分隔符模式與空白匹配。然後可以使用不同的next 方法將得到的標記轉換為不同型別的值。

例如從鍵盤讀取一行輸入:

<span style="font-size:14px;">      Scanner cin = new Scanner(System.in);
  String name = cin.nextLine();</span>

過濾流與包裝流:

--- 即中間類,為哦我們往IO裝置中寫入各種型別的資料提供了幫助

DataOutputStream
  writeBoolean()
  writeShort()
  writeChar()
  writeInt()
  ......

程式 ---> 包裝流類 ----> 節點流類 ---> 目標

輸入包裝類 -- see p273 的例子

輸出包裝類 --

包裝流的使用:

DataOutputStream(OutputStream out) //將OutputStream包裝為DataOutputStream

BufferedInputStream 與 BufferOutputStream

---緩衝流:對IO進行緩衝

利用緩衝流來進行改善效能

構造方法:

BufferedInputStream(InputStream in)

建立一個帶有32直接緩衝區的緩衝流

BufferedInputStream(InputStream in, int size)

建立具有指定緩衝區大小的緩衝區

BufferedOutputStream(OutputStream out)

建立一個新的緩衝輸出流,以將資料寫入指定的底層輸出流。

BufferedOutputStream(OutputStream out, int size)

建立一個新的緩衝輸出流,以將具有指定緩衝區大小的資料寫入指定的底層輸出流。

DataInputStream 與 DataOutputStream

———— 提供了可讀寫各種基本資料型別資料的各種方法

DataOutputStream提供了3種寫入字串的方法:

1. writeBytes(String s)

2. writeChars(String s)

3. writeUTF(Strng s)

PrintStream類

提供了一系列的print和println方法,可以實現將基本資料型別的格式化成字串輸出。

建構函式:

PrintStream(OutputStream out)
  PrintStream(OutputStream out, boolean autoflush)
  PrintStream(OutputStream out, boolean autoflush, String encoding)

autoflush控制java在遇到換行符(\n)時是否自動清空緩衝區

Java的PrintStream物件具有多個過載的Print和Println方法

在Windows的文字換行是 “\r\n” 而Linux下的文字換行是“\n”

PrintWriter的println方法能根據不同的作業系統生成相應的換行符

PrintWriter類 -- 與PrintStream相對應

該類若設定autoFlush, 其會在使用了println方法後使用自動清空緩衝區

ObjectInputStream 與 ObjectOutputStream

用於儲存和讀取物件的輸入輸出流類。

Java300集2020版教程>>>

Java300集2022版最新教程>>>

想要Java資料或者,學習路線圖的同學,可以在評論區給我說哦~~~

關注我,帶你瞭解更多知識