(Java)IO流物件(二)位元組流
阿新 • • 發佈:2018-12-21
【開發常用的編碼表】 GBK 、UTF-8 、ISO-8859-1
【編碼和解碼】
文字 -> 數字: 編碼 。"abc".getBytes() byte[]
數字 -> 文字 : 解碼。 byte[] ={97,98,99} new String(b)
【位元組輸出流OutputStream】抽象類
/* * OutputStream(抽象類) * 位元組輸出流: java.io.OutputStream 所有位元組輸出流的超類 * 作用:從java程式,寫出檔案 * 位元組:每次只操作檔案中一個位元組,可以寫任意檔案 * * write(int b) 將指定的位元組寫入輸出流 * write(byte[] b) 寫將b.length個位元組從指定的byte陣列中寫入輸出流 * write(byte[],int off , int len) 將指定byte陣列中從偏移量off開始的len個位元組寫入次輸出流 * close() 關閉此輸出流,並釋放與之有關的所有系統資源 * * 注意:流物件操作檔案時,自己不做,所有操作依賴於系統資源 */
【FileOutputStream類】檔案寫入、續寫、換行
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /* * A. FileoutputStream 寫入資料檔案 * 構造方法: 引數(File 封裝檔案) (String 字串的檔名) * * 流物件使用步驟: * 1. 建立流子類的物件,繫結資料目的 * 2. 呼叫流物件的方法write寫 * 3. 釋放資源close * * 注意:流物件的構造方法,可以建立檔案,如果檔案存在直接覆蓋 * * B. 檔案的續寫和換行 */ public class FileOutputStreamDemo1 { public static void main(String[] args) throws IOException { function_2(); } //A. 寫入資料 public static void function_1() throws IOException{ FileOutputStream fos = new FileOutputStream("E:\\workspace\\Demo\\ab.txt"); // 流物件的方法write寫資料 寫入一個位元組 // 1. 寫入檔案是字母 d fos.write(100); // 寫入100 fos.write(49); fos.write(48); fos.write(48); // 2. 寫位元組陣列 a b c d byte[] bytes = {97,98,99,100}; fos.write(bytes); // 寫位元組陣列額一部分 a b fos.write(bytes,0,2); // 寫入位元組陣列的簡便方式 寫入"Hello World" ,getBytes()將字串轉為位元組 fos.write(" Hello World".getBytes()); // 關閉資源 fos.close(); } //B. 檔案的續寫和換行 // 1. 續寫:在FileOutputStream構造方法的第二個引數加入 true // 2. 換行:寫入換行,符號換行 \r\n 可以寫在上一行的末尾 或 下一行的開頭 public static void function_2() throws IOException{ File file = new File("E:\\workspace\\Demo\\ab1.txt"); FileOutputStream fos = new FileOutputStream(file,true); fos.write("Hello\r\n".getBytes()); fos.write("World".getBytes()); fos.close(); } /* 列印輸出: Hello World */ }
【IO中的異常處理】
import java.io.FileOutputStream; import java.io.IOException; /* * IO流的異常處理 try catch finally */ public class FileOutputStreamIOEDemo1 { public static void main(String[] args) { // 1.保證流物件 fos 變數 作用域足夠 FileOutputStream fos = null; // try 外邊宣告變數,try內建立物件 try{ fos = new FileOutputStream("E:\\workspace\\Demo\\ab2.txt"); fos.write(100); }catch(IOException ex){ System.out.println(ex.getMessage()); throw new RuntimeException("檔案寫入失敗,重試"); }finally{ try{ //2. 若建立流物件失敗,即fos==null,不需要close if(fos != null) fos.close(); }catch(IOException ex){ throw new RuntimeException("關閉資源失敗"); } } } }
【位元組輸入流InputStream】超類
/*
* InputStream 所有位元組輸入流的超類
* 作用:讀取任意檔案,每次只讀取一個位元組
* 讀取方法:
* int read() 讀取一個位元組
* int read(byte[] b) 讀取一定量的位元組,儲存到陣列中
*
*/
【位元組輸入流FileInputStream】
import java.io.FileInputStream;
import java.io.IOException;
/*
* FileInputStream 讀取檔案
* 構造方法:為這個流物件繫結資料來源
* 引數(File 型別物件) (String 物件)
*
* 輸入流讀取檔案的步驟:
* 1. 建立位元組輸入流的子類物件
* 2. 呼叫讀取方法read 讀取
* 3. 關閉資源
*
* read()方法,read()執行一次,就會自動讀取下一位元組
* 返回的是讀取到的位元組,讀取到結尾後返回 -1
*/
public class FileInputDemo1 {
public static void main(String[] args) throws IOException {
FileInputStream fos = new FileInputStream("E:\\workspace\\Demo\\ab.txt"); // 檔案中元素為ABC
// 使用迴圈方法讀取檔案一個位元組,迴圈結束條件read()方法返回 -1
int len = 0;
while((len=fos.read()) != -1){
//System.out.println(len); // 65 66 67
System.out.print((char)len); // A B C
}
/* 注意
while(fos.read() != -1){
System.out.println(fos.read()); // 66 -1
}
*/
/*
// 獲取一個位元組,呼叫方法read,返回int
int i = fos.read();
System.out.println(i); // 獲取的是65 但真實檔案中是 A
i = fos.read();
System.out.println(i); // 獲取的是66 但真實檔案中是 B
i = fos.read();
System.out.println(i); // 獲取的是67 但真實檔案中是 C
i = fos.read();
System.out.println(i); // 檔案中沒有元素,返回 -1
*/
// 關閉資源
fos.close();
}
}
import java.io.FileInputStream;
import java.io.IOException;
/*
* FileInputStream 讀取檔案
* 讀取方法 int read(byte[] b)
* 引數:陣列b起緩衝作用,提高效率
* 返回值int: 表示讀取到多少個有效的位元組數
*/
public class FileInputDemo2 {
public static void main(String[] args) throws IOException {
FileInputStream fos = new FileInputStream("E:\\workspace\\Demo\\ab.txt"); // 檔案中元素為ABCDE
// 建立位元組陣列
byte[] b = new byte[2];
int len = 0;
// 使用迴圈讀取一個檔案
while((len = fos.read(b)) != -1){
System.out.print(new String(b,0,len)); // ABCDE
}
// 關閉資源
fos.close();
}
}
/*
int len = fos.read(b);
System.out.println( new String(b)); // AB
System.out.println(len); // 2
len = fos.read(b);
System.out.println(new String(b)); // CD
System.out.println(len); // 2
len = fos.read(b);
System.out.println(new String(b)); // E
System.out.println(len); //
len = fos.read(b);
System.out.println(new String(b)); // E
System.out.println(len); //
*/
【位元組流複製檔案】效率最快的方法
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 將資料來源:E:\\workspace\\Demo\\a\\jdk+api+1.8_China.zip
* 複製到:E:\\workspace\\Demo\\b\\jdk+api+1.8_China.zip
*/
public class Copy {
public static void main(String[] args) {
// 定義兩個流物件變數
FileInputStream fis = null;
FileOutputStream fos = null;
try{
// 建立2個流物件,繫結資料來源 和 資料目的
fis = new FileInputStream("E:\\workspace\\Demo\\a\\jdk+api+1.8_China.zip");
fos = new FileOutputStream("E:\\workspace\\Demo\\b\\jdk+api+1.8_China.zip");
// 採用陣列快取提高效率
byte[] b = new byte[1024];
int len = 0;
while((len = fis.read(b)) != -1){
fos.write(b,0,len);
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("檔案複製失敗");
}finally{
try{
if(fos != null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("資源釋放失敗");
}finally{
try{
if(fis != null)
fis.close();
}catch(IOException ex){
throw new RuntimeException("資源釋放失敗");
}
}
}
}
}