1. 程式人生 > >Java基礎----位元組流

Java基礎----位元組流

package cn.itcast.input;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


/*
 File類:用於描述一個檔案或者資料夾
 
 通過File物件我們可以讀取檔案或者資料夾的屬性資料,如果我們需要讀取檔案的內容資料,那麼我們需要使用IO流技術。
 
 IO流(Input  Output)
 
 IO流解決的問題:解決裝置與裝置之間的資料傳輸問題。  記憶體---->硬碟   硬碟----》記憶體
 
 IO流技術
 
 
 IO流分類:
     如果是按照資料的流向劃分:   (判斷使用輸入流還是輸出流的依據:以當前程式作為參照物,觀察資料是流入還是流出,如果流出則使用輸出流,如果資料是流入,則使用輸入流)
        輸入流
       
         輸出流
         
  如果按照處理的單位劃分:
  
  位元組流:位元組流讀取得都是檔案中二進位制資料,讀取到二進位制資料不會經過任何處理。
  
  字元流:字元流讀取的資料是以字元為單位。字元流也是讀取檔案中的二進位制資料,不過會把這些二進位制資料轉換成我們能識別的字元。
  1111000100----->字元
  
  字元流 = 位元組流 + 解碼
  
輸入位元組流:


-------|InputStream 所有輸入位元組流的基類 抽象類
----------|FileInputStream  讀取檔案資料的輸入位元組流


使用FileInputStream 讀取檔案資料的步驟:
1.找到目標檔案
2.建立資料輸入的通道
3.讀取檔案中的資料
4.關閉資源,實際上就是釋放資源。
  
  
 */
public class Demo1 {


public static void main(String[] args) throws IOException {
readTest1();
readTest2();
readTest3();
readTest4();



}
//方式四:使用緩衝陣列配合迴圈一起讀取資料

public static void readTest4() throws IOException{
long startTime = System.currentTimeMillis();
//找到目標檔案
    File file = new File("F:\\a.txt");
   
//建立資料的輸入通道
        FileInputStream fileInputStream = new FileInputStream(file);
//建立緩衝陣列配合迴圈讀取檔案資料
        int length = 0;//儲存 每次讀取到的位元組數。
        byte[] buf = new byte[256];//儲存讀取到的資料      緩衝陣列 的長度一般是1024的倍數,因為與計算機的處理單位。  理論上緩衝陣列越大,效率越高
        
        while((length = fileInputStream.read(buf))!=-1){//read方法如果讀取到了檔案的末尾,那麼會返回-1表示。
       
System.out.println(new String(buf,0,length));
        }
      //關閉資源
      fileInputStream.close();
      long endTime = System.currentTimeMillis();
      System.out.println("讀取的時間4是:"+ (endTime-startTime));
}

//方式三:使用緩衝陣列讀取.缺點:無法讀取到完整一個檔案的資料
    public static void readTest3() throws IOException{
    //找到目標檔案
    File file = new File("F:\\a.txt");
    //建立資料的輸入通道
        FileInputStream fileInputStream = new FileInputStream(file);
    //建立緩衝位元組陣列,讀取檔案的資料。
        byte[] buf = new byte[1024];//相當於超市裡面的購物車。
        int length = fileInputStream.read(buf);//如果使用read讀取資料傳入位元組陣列,那麼資料是儲存到位元組陣列中的,而這時候read方法的返回值是表示的是本次讀取了幾個位元組資料到位元組陣列中。
        System.out.println("length:"+length);
        //使用位元組陣列構建字串
        String content = new String(buf,0,length);
        System.out.println("內容是:"+content);
        //關閉資源
        
        fileInputStream.close();
    }
//方式二:使用迴圈讀取檔案的資料
public static void readTest2() throws IOException  {
long startTime = System.currentTimeMillis();
//找到目標檔案
File file = new File("F:\\a.txt");
//建立資料的輸入通道
FileInputStream fileInputStream = new FileInputStream(file);

//讀取檔案中的資料
int content = 0;//宣告該變數用於儲存讀取到的資料
while((content = fileInputStream.read())!=-1){
System.out.println((char)content);
}

//關閉資源
fileInputStream.close();
long endTime = System.currentTimeMillis();
System.out.println("讀取的時間是:"+ (endTime-startTime));
}
//讀取方式一:無法讀取完整一個檔案的資料
public static void readTest1() throws IOException{
//1.找到目標檔案
File file = new File("F:\\a.txt");
//建立資料輸入的通道

        FileInputStream fileInputStream = new FileInputStream(file);
        
//讀取檔案中的資料
int content = fileInputStream.read();//read() 讀取一個位元組的資料,把讀取的資料返回。
System.out.println("讀取到的內容:"+(char)content);
//關閉資源,實際上就是釋放資源。
fileInputStream.close();

}


}


package cn.itcast.input;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;


/*
 問題1:讀取玩一個檔案資料的時候,我不關閉資源有什麼影響?
 答案:資原始檔一旦使用完畢
 
 
 */
public class Demo2 {


public static void main(String[] args) throws IOException {
//找到目標檔案
File file = new File("F:\\a.txt");

//建立資料的輸入通道
FileInputStream fileInputStream = new FileInputStream(file);


//建立緩衝位元組陣列讀取檔案
byte[] buf = new byte[8];
int length = 0;

while ((length = fileInputStream.read(buf))!=-1){
System.out.println(new String(buf,0,length));//
//System.out.println(Arrays.toString(buf));
}
//釋放檔案資源
fileInputStream.close();

}


}


package cn.itcast.output;
/*
 --------|OutputStream  是所有輸出位元組流的父類。抽象類
 ------------|FileOutputStream  向檔案輸出資料的輸出位元組流
 
 FileOutputStream如何使用:
 1.找到目標檔案
 2.建立資料的輸出通道。
 3.把資料轉換成位元組陣列寫出。
 4.關閉資源
 
 FileOutputStream要注意的細節:
 1.使用FileOutputStream的時候,如果目標檔案不存在,那麼會自動建立目標檔案物件。
 2.使用FileOutputStream寫資料的時候,如果目標檔案已經存在,那麼會先清空目標檔案中的資料,然後再寫入資料。
 3.使用FileOutputStream寫資料的時候,如果目標檔案已經存在,需要在原資料基礎上追加資料的時候應該使用new FileOutputStream(file,true)建構函式
 4使用FileOutputStream的write方法寫資料的時候,雖然接收的是一個int型別的資料,但是真正寫出的只是一個位元組的資料。只是把低八位的二進位制資料寫出,其他二十四位資料全部丟失。
 
 00000000-00000000-00000000-00000001-11111111
 */
import java.io.File;


import java.io.FileOutputStream;
import java.io.IOException;


public class Demo1 {


public static void main(String[] args) throws IOException {
writeTest1();
writeTest2();
writeTest3();


}

//使用位元組陣列把資料寫出
public static void writeTest3() throws IOException{
//找到目標檔案
File file = new File("F:\\b.txt");
//建立資料的輸出通道
FileOutputStream fileOutputStream = new FileOutputStream(file,true);
//把資料寫出
String data= "abc";
byte[] buf = data.getBytes();
fileOutputStream.write(buf,0,2);//0:從位元組陣列的指定索引值開始寫, 2:寫出兩個位元組


//關閉資源
fileOutputStream.close();
}
//使用位元組陣列把資料寫出
public static void writeTest2() throws IOException{
//找到目標檔案
File file = new File("F:\\b.txt");
//建立資料的輸出通道
FileOutputStream fileOutputStream = new FileOutputStream(file,true);
//把資料寫出
String data= "\r\n hello world";
fileOutputStream.write(data.getBytes());


//關閉資源
fileOutputStream.close();
}


//每次只能寫一個位元組的資料出去
public static void writeTest1() throws IOException{
//找到目標檔案
File file = new File("F:\\b.txt");
//建立資料的輸出通道
FileOutputStream fileOutputStream = new FileOutputStream(file);
//把資料寫出
fileOutputStream.write('h');
fileOutputStream.write('e');
fileOutputStream.write('l');
fileOutputStream.write('l');
fileOutputStream.write('o');

//關閉資源
fileOutputStream.close();
}


}



/*4使用FileOutputStream的write方法寫資料的時候,雖然接收的是一個int型別的資料,但是真正寫出的只是一個位元組的資料。只是把低八位的二進位制資料寫出,其他二十四位資料全部丟失。
 
 00000000-00000000-00000000-00000001-11111111
 */


package cn.itcast.output;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;


public class Demo2 {


public static void main(String[] args) throws IOException {
writeTest();
readTest();


}


public static void readTest() throws IOException {
//找到目標檔案
File file = new File("F:\\c.txt");
//建立資料的輸出通道
FileInputStream fileInputStream = new FileInputStream(file);
//建立緩衝輸入讀取檔案資料
byte[] buf = new byte[4];
//讀取檔案資料
int length = fileInputStream.read(buf);

System.out.println("位元組陣列的內容:"+Arrays.toString(buf));
//關閉資源
fileInputStream.close();
}

public static void writeTest() throws IOException {
//找到目標檔案
File file = new File("F:\\c.txt");
//建立資料的輸出通道
FileOutputStream fileOutputStream = new FileOutputStream(file);
//把資料寫出
fileOutputStream.write(511);
//關閉資源
fileOutputStream.close();
}


}


package cn.itcast.output;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


/*
 
 需求:拷貝一張圖片
 
 */
public class CopyImage {


public static void main(String[] args) throws IOException {
// 找到目標檔案
File inFile = new File("F:\\1.jpg");
File destFile = new File("E:\\1.jpg");

//建立資料的輸入輸出通道
FileInputStream fileInputStream = new FileInputStream(inFile);
//每次建立一個FileOutputStream的時候,預設情況下FileOutputStream的指標是指向了檔案的開始位置。每寫出一次,指向都會出現相應移動
FileOutputStream fileOutputStream = new FileOutputStream(destFile);
//建立緩衝資料邊讀邊寫
byte[] buf = new byte[1024];
int length = 0;
while((length = fileInputStream.read(buf))!=-1){//最後一次只剩下了824個位元組
fileOutputStream.write(buf, 0, length);
}

//關閉資源原則:先開後關,後開先關。
fileOutputStream.close();
fileInputStream.close();



}


}



package cn.itcast.buffered;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


/*
 我們清楚讀取檔案資料使用緩衝陣列讀取效率更高,sun也知道使用緩衝陣列讀取效率更高,那麼
這時候sun給我們提供了一個-----緩衝輸入位元組流物件,讓我們可以更高效率的讀取檔案。


 輸入位元組流體系:
 -----|InputStream  輸入位元組流的基類。抽象
 ---------|FileInputStream 讀取檔案資料的輸入位元組流
 ---------|BufferedInputStream緩衝輸入位元組流,緩衝位元組流的出現
 其實該類內部只不過是維護了一個8kb的位元組陣列而已。 


注意: 凡是緩衝流都不具備讀寫檔案的能力。


使用BufferedInputStream的步驟 :
1. 找到目標檔案。
2. 建立資料 的輸入通道
3. 建立緩衝 輸入位元組流流
4. 關閉資源
 */


public class Demo1 {

public static void main(String[] args) throws IOException {
readTest2();
}

public static void readTest2() throws IOException{
//找到目標檔案
File file = new File("F:\\a.txt");
//建立資料的輸入通道
FileInputStream fileInputStream= new FileInputStream(file);
//建立緩衝輸入位元組流
//疑問一:為甚麼建立BufferedInputStream的時候都需要傳遞FileInputStream?BufferedInputStream本身不具備讀檔案的能力,所以需要藉助FileInputStream來讀寫檔案的資料
BufferedInputStream bufferedInputStream= new BufferedInputStream(fileInputStream);
//讀取檔案資料
bufferedInputStream.read();




FileOutputStream fileOutputStream= new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream= new BufferedOutputStream(fileOutputStream);
fileOutputStream.write(null);

//讀取檔案資料
int content = 0 ;
//疑問二:BufferedInputStream出現 的目的是了提高讀取檔案的效率,但是BufferedInputStream的read方法每次讀取一個位元組的資料
//而FileInputStreram每次也是讀取一個位元組的資料,那麼BufferedInputStream效率高從何而來?
while((content = fileInputStream.read())!=-1){
System.out.print((char)content);
}

//關閉資源
bufferedInputStream.close();//呼叫BufferedInputStream的close方法實際上關閉的是FileinputStream.
}




//讀取檔案的時候我們都是使用緩衝陣列讀取。效率會更加高
public static void readTest() throws IOException{
File file = new File("F:\\a.txt");
//建立陣列通道
FileInputStream fileInputStream = new FileInputStream(file);
//建立緩衝陣列讀取資料
byte[] buf = new byte[1024*8];
int length = 0; 
while((length = fileInputStream.read(buf))!=-1){
System.out.print(new String(buf,0,length));
}
//關閉資源
fileInputStream.close();
}


}




package cn.itcast.buffered;


import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


/*
 輸入位元組流體系:
 -----|OutputStream  所有輸出位元組流的基類。抽象
 ---------|FileOutputStream 讀取檔案資料的輸出位元組流
 ---------|BufferedOutputStream 緩衝輸出位元組流,BufferedOutputStream出現的目的是為了提高內部也是維護一個8kb的位元組陣列而已
 
 使用BufferedOutputStream的步驟:
   1.找到目標檔案
   2.建立資料的輸出通道
   3。建立快取輸出位元組流物件
   4. 把資料寫出
   
   BufferedOutputStream 要注意的細節
1. 使用BufferedOutStream寫資料的時候,它的write方法是是先把資料寫到它內部維護的位元組陣列中。
  2. 使用BufferedOutStream寫資料的時候,它的write方法是是先把資料寫到它內部維護的位元組陣列中,如果需要把資料真正的寫到硬碟上面,需要
  呼叫flush方法或者是close方法、 或者是內部維護的位元組陣列已經填滿資料的時候。
 
 練習:使用緩衝輸入輸出位元組流拷貝一個圖片
 */
public class Demo2 {


public static void main(String[] args) throws IOException {
// 找到目標檔案
File file = new File("F:\\a.txt");
//建立資料的輸出通道
FileOutputStream fileOutputStream = new FileOutputStream(file);
//建立快取輸出位元組流物件
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
//把資料寫出
bufferedOutputStream.write("hello".getBytes());
//把快取陣列中內部的資料寫到硬碟上
//bufferedOutputStream.flush();
bufferedOutputStream.close();

}


}



package cn.itcast.buffered;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


/*
  練習:使用緩衝輸入輸出位元組流拷貝一個圖片
  
 */
public class copyImage {


public static void main(String[] args) throws IOException {
// 找到目標檔案
File inFile = new File("F:\\1.jpg");
File outFile = new File("E:\\1.jpg");
//建立資料輸入輸出通道
FileInputStream fileInputStream = new FileInputStream(inFile);
FileOutputStream fileOutputStream = new FileOutputStream(outFile);


//建立緩衝輸入輸出流
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
   //邊讀變寫
int content = 0;
//int length = bufferedInputStream.read(buf);/如果傳入了緩衝陣列,內容是儲存到緩衝陣列中,返回值是儲存到緩衝陣列中的位元組個數。
while((content = bufferedInputStream.read())!=-1){//如果使用read方法沒有傳入緩衝陣列,那麼返回值是讀取到的內容。
bufferedOutputStream.write(content);
bufferedOutputStream.flush();
}

//關閉資源
bufferedOutputStream.close();
bufferedOutputStream.close();

}


}