1. 程式人生 > >瘋狂Java學習筆記(023)

瘋狂Java學習筆記(023)

位元組流:
抽象基類:
InputStream:
    實現子類:
    FileInputStream:
    構造方法:
    FileInputStream(File file):
    FileInputStream(String name):
    方法:
    int read():
    int read(byte[] bys):
    
    緩衝位元組輸入流:
    BufferedInputStream:
    構造方法:
    BufferedInputStream(InputStream in):
    BufferedInputStream(InputStream in,
int size): 方法: int read(): int read(byte[] bys): OutputStream: 實現子類: FileOutputStream: 構造方法: FileOutputStream(File file): FileOutputStream(String name): FileOutputStream(File file,boolean append): FileOutputStream(String name,boolean append): 方法:
void write(int value): void write(byte[] bys): void write(byte[] bys,int off,int len): 緩衝位元組輸出流: BufferedOutputStream: 構造方法: BufferedOutputStream(OutputStream out): BufferedOutputStream(OutputStream out,int size): 方法: void write(int value): void write(byte[] bys):
void write(byte[] bys,int off,int len): 字元流: 抽象基類: Reader: 實現子類: 轉換流: InputSteramReader: 構造方法: InputStreamReader(InputStream in): InputStreamReader(InputStream in,String charsetName): 方法: int read(): int read(char[] chs): 簡化子類: FileReader: 構造方法: FileReader(File file): FileReader(String name): 方法和父類一樣!!! 緩衝字元輸入流: BufferedReader: 構造方法: BufferedReader(Reader in): BufferedReader(Reader in,int size): 方法: int read(): int read(char[] chs): 特殊方法: String readLine(): Writer: 實現子類: 轉換流: OutputStreamWriter: 構造方法: OutputStreamWriter(OutputStream out): OutputStreamWriter(OutputStream out,String charsetName): 方法: void write(int value): void write(char[] chs): void write(char[] chs,int off,int len): void write(String s): void write(String s,int off,int len): 簡化子類: FileWriter: 構造方法: FileWriter(File file): FileWriter(String name): 方法和父類一樣!!! 緩衝字元輸出流: BufferedWriter: 構造方法: BufferedWriter(Writer out): BufferedWriter(Writer out,int size): 方法: void write(int value): void write(char[] chs): void write(char[] chs,int off,int len): void write(String s): void write(String s,int off,int len): 特殊方法: void newLine():

 一、資料操作流

 針對不同資料型別操作的流,屬於位元組流.底層包裝的是基本的位元組流,在讀寫資料的次數上進行了增強!

 

DataOutputStream:
    DataOutputStream(OutputStream out):
    方法:
    void writeInt(int i):
    void writeLong(long l):
    void writeDouble(double d):
    void writeFloat(float f):
    void writeUTF(String s):

 1.寫出方法的原始碼

 通過檢視writeInt方法的原始碼:

  發現實際上就是呼叫了底層位元組流的四次write方法,依次將一個int型資料的四個位元組寫出到底層流中!!!寫出的順序是高位在前!!!其它方法原理相同!

 

  long型資料是先寫到一個位元組陣列中,然後一次性將整個陣列寫出到底層的流中。

2.writeUTF(String s):

  • 使用的是修改版的UTF-8編碼:
  • 先寫出兩個位元組的控制位元組:表示真實字串編碼後的位元組數!!
  • 然後寫出的是字串真實的位元組陣列!
  • 即:寫出資料的長度:最短:2+字串長度
  • 最長:2+字串長度*3!

3.DateInputStream:

  屬於位元組流,在讀取不同資料型別的時候,進行了次數上的控制。

   構造方法:

  DataInputStream(InputStream in):

  方法:

  int read();

  int readInt();

  long readLong();

  ........

二、讀取方法的原始碼

  舉例:以readInt方法為例,檢視如何還原資料:

   

  實際上,就是一次從底層流中讀取四個位元組,並按照高位在前的順序,將int值還原。

1. readLong( ):方法

  

  依次從底層的流中讀取八個位元組,並做相應的移位運算,將long型資料還原!!

三、自定義工具類

  例如:實現int型資料和long型資料的原生陣列的轉換操作:

/*
 * 資料操作的工具類:
 * 
 * 方便int型long型資料和位元組陣列之間的轉換!
 */
public class DataTools {
    //私有構造方法
    private DataTools(){}
    
    //獲取int型資料的陣列:高位在前
    public static byte[] int2Bytes(int i){
        //建立一個數組,存放int型資料的四個位元組
        byte[] bys = new byte[4];
        //將int型資料轉換成四個位元組
        bys[0] = (byte)(i >> 24);
        bys[1] = (byte)(i >> 16);
        bys[2] = (byte)(i >> 8);
        bys[3] = (byte)(i >> 0);
        return bys;
    }
    
    //從陣列還原int資料:高位在前
    public static int bytes2Int(byte[] bys){
        int i0 = (bys[0] & 0xFF) << 24;
        int i1 = (bys[1] & 0xFF) << 16;
        int i2 = (bys[2] & 0xFF) << 8;
        int i3 = (bys[3] & 0xFF) << 0;
        return i0 + i1 + i2 + i3;
    }
    
    //long -> byte[] : 高位在前
    public static byte[] long2Bytes(long l){
        byte[] bys = new byte[8];
        bys[0] = (byte)(l >> 56);
        bys[1] = (byte)(l >> 48);
        bys[2] = (byte)(l >> 40);
        bys[3] = (byte)(l >> 32);
        bys[4] = (byte)(l >> 24);
        bys[5] = (byte)(l >> 16);
        bys[6] = (byte)(l >> 8);
        bys[7] = (byte)(l >> 0);
        return bys;
    }
    
    //byte[] -> long : 高位在前
    public static long bytes2Long(byte[] bys){
        long l0 = ((long)bys[0] & 0xFF) << 56;
        long l1 = ((long)bys[1] & 0xFF) << 48;
        long l2 = ((long)bys[2] & 0xFF) << 40;
        long l3 = ((long)bys[3] & 0xFF) << 32;
        long l4 = ((long)bys[4] & 0xFF) << 24;
        long l5 = ((long)bys[5] & 0xFF) << 16;
        long l6 = ((long)bys[6] & 0xFF) << 8;
        long l7 = ((long)bys[7] & 0xFF) << 0;
        return l0 | l1 | l2 | l3 | l4 | l5 | l6 | l7;
    }
    //通過封裝jdk提供的資料流寫出指定型別的資料
    public static void writeInt(OutputStream out,int value) throws Exception{
        DataOutputStream dos = new DataOutputStream(out);
        dos.writeInt(value);
        dos.close();
    }
}
  • 使用場景:凡是需要寫出超過一個位元組的場景,都可以使用!
  • 使用系統提供的資料操作流或者使用位元組定義的工具類!
  • 自定義工具類的優點:不用開流和關流!直接使用即可!

 四、列印流

  按位元組操作的位元組流列印流和按字元操作的字元列印流,都是隻有輸出,沒有輸入。

1.位元組列印流

PrintStream:
構造方法:
PrintStream(File file):
PrintStream(String name):
PrintStream(OutputStream out):
PrintStream(OutputStream out,boolean autoFlush):

方法:
print():不換行輸出
println():換行輸出

都是把引數轉換成字串再輸出!!!

 如:以printin(int value)為例:

2.System.out的本質

/*
 * System.out 實際上就是一個位元組列印流!!!
 * 
 */
public class PrintStreamDemo2 {

    public static void main(String[] args) {
        //相當於獲取了控制檯的引用!
        PrintStream ps = System.out;
        ps.println("abc");
        ps.println(300);
        ps.close();
    }
}

 

五、字元列印流

 

PrintWriter:
構造方法:
PrintWriter(File file):
PrintWriter(String name):
PrintWriter(OutputStream out):
PrintWriter(OutputStream out,boolean autoFlush):
PrintWriter(Writer out):
PrintWriter(Writer out,boolean autoFlush):