java io运用_Java IO相关使用
date: 2020-06-14 14:42:22
updated: 2020-08-21 17:35:45
Java IO相關使用
1. 文件
創建 File 對象的三種方式
一個路徑名:File(String pathname)
一個父路徑名和子路徑名:File(File parent, String child) 或 File(String parent, String child)
一個URI (統一資源標識符):File(URI uri)
有文件時覆蓋,無文件時創建。
通過 f.getAbsolutePath() 和 f.getCanonicalPath() 可獲取文件的絕對路徑和規范路徑
f.delete() 會立即刪除文件,而 f.deleteOnExit() 會延遲刪除,直到JVM調用該方法
File 對象不可變,始終表示文件的路徑名。文件經過創建、刪除后,File 對象依舊是原始的路徑名,并不代表實際的文件。
2. 輸入字節流
抽象基類是 InputStream 類,結構關系如下:
InputStream
|
+--FileInputStream
|
+--ByteArrayInputStream
|
+--PipedInputStream
|
+--FilterInputStream
|
+--BufferedInputStream
|
+--PushbackInputStream
|
+--DataInputStream
|
+--ObjectInputStream
基類的基本方法如下:
方法
描述
read()
讀取一個字節并將讀取的字節作為int返回。當到達輸入流的結尾時,它返回-1。
read(byte[] buffer)
讀取最大值直到指定緩沖區的長度。它返回在緩沖區中讀取的字節數。如果到達輸入流的結尾,則返回-1。
read(byte[] buffer,int offset, int length)
讀取最大值到指定長度字節。數據從偏移索引開始寫入緩沖區。它返回讀取的字節數,如果到達輸入流的結束它返回-1。
close()
關閉輸入流
available()
返回可以從此輸入流讀取但不阻塞的估計字節數。
2.1 BufferedInputStream
通過緩沖數據向輸入流添加功能。維護一個內部緩沖區以存儲從底層輸入流讀取的字節。
import java.io.*;
public static void main(String[] args) throws IOException {
String filePath = "/Users/mxxct/Desktop/md_meter.java";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
byte[] buffer = new byte[1024]; // 長度為1024個字節的緩沖區
int len = -1; // 偏移量,或本次讀取的字節數
StringBuilder content = null;
// 此次讀取的字節數賦值給 len,如果等于 -1 說明已經讀完了
while((len = bis.read(buffer)) != -1){
content.append(new String(buffer, 0, len));
}
System.out.println(content);
bis.close();
}
3. 輸出字節流
FileOutputStream fos = new FileOutputStream(destFile); 創建一個 FileOutputStream 對象,如果文件不存在,會嘗試創建文件,但必須處理異常 FileNotFoundException,需要放在 try-catch 里面。
如果文件包含數據,數據會被覆蓋。如果要追加,需要添加一個第二個參數,true 表示追加。
fos.write(int b)
fos.write(byte[] b)
fos.write(byte[] b, int off, int len)
由于輸出的是字節流,所以只能 write int 或 byte[],如果是字符串的話,通過 getBytes() 方法可以返回字節數組
通過 fos.flush() 方法刷新輸出流:將 write 里的字節緩存清出,寫入到目標處。
4. 管道
管道IO基于生產者--消費者模式,PipedOutputStream 負責把數據寫入到管道里,相當于生產者, PipedInputStream 負責讀取管道里的數據
兩種連接管道的方式
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
pis.connect(pos); /* Connect the two ends */
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis, 2048); // 緩沖區容量為2048字節
當創建管道時,可以設置管道容量。 如果管道的緩沖區已滿,則嘗試在管道上寫入將會被阻止。
5. 字符輸入流
Reader是所有的輸入字符流的父類,它是一個抽象類
FilterReader是所有自定義具體裝飾流的父類,其子類PushbackReader對Reader對象進行裝飾,會增加一個行號
InputStreamReader是一個連接字節流和字符流的橋梁,它將字節流轉變為字符流。FileReader可以說是一個達到此功能、常用的工具類,在其源代碼中明顯使用了將FileInputStream轉變為Reader的方法。我們可以從這個類中得到一定的技巧。Reader中各個類的用途和使用方法基本和InputStream中的類使用一致。后面會有Reader與InputStream的對應關系。
BufferedReader reader = new BufferedReader(new FileReader(filePath));
String str;
while((str=reader.readLine())!=null){
System.out.println(str);
}
6. 字符輸出流
問:字節流與字符流有什么區別?
答:計算機中的一切最終都是以二進制字節形式存在的,對于我們經常操作的字符串,在寫入時其實都是先將字符轉成對應的字節,然后將字節寫入到輸出流,在讀取時其實都是先讀到的是字節,然后將字節直接使用或者轉換為字符給我們使用。由于對于字節和字符兩種操作的需求比較廣泛,所以 Java 專門提供了字符流與字節流相關IO類。
對于程序運行的底層設備來說永遠都只接受字節數據,所以當我們往設備寫數據時無論是字節還是字符最終都是寫的字節流。字符流是字節流的包裝類,所以當我們將字符流向字節流轉換時要注意編碼問題(因為字符串轉成字節數組的實質是轉成該字符串的某種字節編碼)。
字符流和字節流的使用非常相似,但是實際上字節流的操作不會經過緩沖區(內存)而是直接操作文本本身的,而字符流的操作會先經過緩沖區(內存)然后通過緩沖區再操作文件。
1、字節流在操作的時候本身是不會用到緩沖區(內存)的,是與文件本身直接操作的,而字符流在操作的時候是使用到緩沖區的
2、字節流在操作文件時,即使不關閉資源(close方法),文件也能輸出,但是如果字符流不使用close方法的話,則不會輸出任何內容,說明字符流用的是緩沖區,并且可以使用flush方法強制進行刷新緩沖區,這時才能在不close的情況下輸出內容
3、Reader類的read()方法返回類型為int :作為整數讀取的字符(占兩個字節共16位),范圍在 0 到 65535 之間 (0x00-0xffff),如果已到達流的末尾,則返回 -1
inputStream的read()雖然也返回int,但由于此類是面向字節流的,一個字節占8個位,所以返回 0 到 255 范圍內的 int 字節值。如果因為已經到達流末尾而沒有可用的字節,則返回值 -1。因此對于不能用0-255來表示的值就得用字符流來讀取!比如說漢字.
4、字節流與字符流主要的區別是他們的的處理方式
字節流:處理字節和字節數組或二進制對象;
字符流:處理字符、字符數組或字符串。
問:什么是緩沖區?有什么作用?
答:緩沖區就是一段特殊的內存區域,很多情況下當程序需要頻繁地操作一個資源(如文件或數據庫)則性能會很低,所以為了提升性能就可以將一部分數據暫時讀寫到緩存區,以后直接從此區域中讀寫數據即可,這樣就顯著提升了性能。
對于 Java 字符流的操作都是在緩沖區操作的,所以如果我們想在字符流操作中主動將緩沖區刷新到文件則可以使用 flush() 方法操作。
問:如何選擇字節流和字符流?
答:如果是文本文件通常使用字符流,而像視頻,圖片,音頻等文件都是二進制數據使用字節流。當然文本文件也可以使用字節流來操作,字節流更通用。
如果只是復制純文本文件不做顯示操作,哪個流都可以,如果要顯示純文本就用字符流。
問:為什么對于字符流中都有flush方法,但是字節流中沒有?
字節流的操作不會經過緩沖區(內存)而是直接操作文本本身的,而字符流的操作會先經過緩沖區(內存)然后通過緩沖區再操作文件。
總結
以上是生活随笔為你收集整理的java io运用_Java IO相关使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旅游保险网上怎么买
- 下一篇: java实现三个数字的随机组合_JAVA