IO流和Properties IO流 IO流是指電腦與外部世界或者一個程式與電腦的其餘部分的之間的介面。它對於任何電腦系統都非常關鍵, 因而所有 I/O 的主體實際上是內置在操作系統中的。單獨的程式一般是讓系統為它們完成大部分的工作。 在 Java 編程中,一直使用流的方式完成 I/O。所有 ...
IO流和Properties
IO流
IO流是指電腦與外部世界或者一個程式與電腦的其餘部分的之間的介面。它對於任何電腦系統都非常關鍵,
因而所有 I/O 的主體實際上是內置在操作系統中的。單獨的程式一般是讓系統為它們完成大部分的工作。
在 Java 編程中,一直使用流的方式完成 I/O。所有 I/O 都被視為單個的位元組的移動,
通過一個稱為 Stream 的對象一次移動一個位元組。流 I/O 用於與外部世界接觸。它也在內部使用,
用於將對象轉換為位元組,然後再轉換回對象。輸入也叫做讀取數據,輸出也叫做作寫出數據。
概述
- IO流是設備間的數據的傳輸.
- IO流的輸入和輸出(基於程式的角度,而不是基於文件的角度)
IO流的分類
數據流向:
- 輸入流: 文件到程式
- 輸出流: 程式到文件
數據類型(電腦內的數據存儲都是以位元組的形式存儲的):
- 位元組流: 所有的文件都可以使用位元組流操作
- 字元流: 在文本文件的讀取的時候,我們需要將位元組轉化為字元.
幾個位元組表示一個字元? 不一定.
基類
數據流向:
- 輸入流:
- 輸出流:
數據類型:
- 位元組流:
- 位元組輸入流(InputStream):將記憶體中的數據輸如入到指定的設備上
- 位元組輸出流(OutputStream):將設備上的數據輸出到設備上
- 字元流:
- 字元輸出流
- 字元輸入流
FileOutputStream
構造方法(如果指定的文件不存在,則創建對象;存在,會清空文件中的數據(除非使用後兩個構造方法,字元流同理)):
- public FileOutputStream(File file) :創建文件輸出流以寫入由指定的 File對象表示的文件。
- public FileOutputStream(String name) : 創建文件輸出流以指定的名稱寫入文件(name表示操作文件的路徑)。
- FileOutputStream(File file, boolean append) : 創建文件輸出流以寫入由指定的 File對象表示的文件,boolean類型表示是否追加內容。
- FileOutputStream(String name, boolean append) : 創建文件輸出流以指定的名稱寫入文件,boolean類型表示是否追加內容。
常用方法:
- void write(int b) : 將指定的位元組寫出到文件中(97 -> a)。
- void write(byte[] b) : 將位元組數組中的位元組寫出到文件中。
- void write(byte[] b, int off, int len) : off表示位元組數組起始的索引位置,輸出len個位元組長度到文件中的
- void close() : 關閉此文件輸出流並釋放與此流相關聯的任何系統資源。
使用步驟:
- 創建流
- 寫入流
關閉流
public static void main(String[] args) throws Exception { // 使用構造方法創建FileOutputStream對象 FileOutputStream fos = new FileOutputStream("F:\\bbb\\wangzhi.txt"); // FileOutputStream fos2 = new FileOutputStream(new File("F:\\bbb\\wangzhi.txt")); // 調用write方法向文件中輸出內容 // int位元組,查詢ASICC表 fos.write(97); fos.write(65); fos.write(98); fos.write(66); fos.write(99); fos.write(new byte[]{67,100,68}); fos.close(); }
FileInputStream
構造方法(文件必須存在,不存在拋異常):
- FileInputStream(File file) : 通過打開與實際文件的連接創建一個 FileInputStream ,該文件由文件系統中的 File對象 file命名。
- FileInputStream(String name) : 通過打開與實際文件的連接來創建一個 FileInputStream ,該文件由文件系統中的路徑名 name命名。
常用方法:
- int read() : 從該輸入流讀取一個位元組的數據。
- int read(byte[] b) : 從該輸入流讀取最多 b.length個位元組的數據為位元組數組(返回的是讀取到的位元組的個數)。
void close() : 關閉此文件輸入流並釋放與流相關聯的任何系統資源。
// 使用位元組流複製圖片 public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("D:\\美女.jpg"); FileOutputStream fos = new FileOutputStream("F:\\bbb\\美女.jpg"); /*long start = System.currentTimeMillis(); byte[] arr = new byte[1024 * 4]; int len; while((len = fis.read(arr)) != -1){ fos.write(arr,0,len); } long end = System.currentTimeMillis(); System.out.println(end - start);*/ byte[] arr1 = new byte[1024 * 4]; int len1; StringBuilder sb = new StringBuilder(); while((len1 = fis.read(arr1)) != -1){ sb.append(new String(arr1,0,len1)); } fos.write(sb.toString().getBytes()); /*System.out.println(System.currentTimeMillis() - end);*/ fos.close(); fis.close(); }
字元流
使用位元組流去讀中文(一個中文占據3個位元組)可能出現亂碼.
- Writer: 寫數據的流
- FileWriter
- Reader: 讀數據的流
- FileReader
FileReader
構造方法:
- FileReader(String fileName)
創建一個新的 FileReader ,給定要讀取的文件的名稱。 - FileReader(File file)
創建一個新的 FileReader ,給出 File讀取。
常用方法:
- int read()
讀一個字元
- int read(char[] cbuf)
將字元讀入數組。 - void close()
關閉流並釋放與之相關聯的任何系統資源。
FileWriter
構造方法:
- FileWriter(File file)
給一個File對象構造一個FileWriter對象。
- FileWriter(File file, boolean append)
給一個File對象構造一個FileWriter對象。 - FileWriter(String fileName)
構造一個給定文件名的FileWriter對象。
- FileWriter(String fileName, boolean append)
構造一個FileWriter對象,給出一個帶有布爾值的文件名,表示是否附加寫入的數據。
常用方法:
- void write(char[] cbuf)
寫入一個字元數組。
- void write(int c)
寫一個字元
- void write(String str)
寫一個字元串
- void write(String str, int off, int len)
寫一個字元串的一部分。 - void flush()
刷新流。
void close()
關閉流,先刷新。// 複製txt文件 public static void main(String[] args) throws IOException { // 創建字元輸入流 FileReader fr = new FileReader("wangzhi.txt"); // 創建字元輸出流 FileWriter fw = new FileWriter("wangzhi2.txt"); // 讀取資源 char[] arr = new char[1024]; int len; StringBuilder sb = new StringBuilder(); while((len = fr.read(arr)) != -1){ sb.append(arr); } fw.write(sb.toString()); // 關閉流 fw.close(); fr.close(); }