12章(三)Java流與文件操作

 

一、字節流

1、字節輸入流InputStream類

InputStream類是所有面向字節的輸入流的父類,爲java.io包中的抽象類。

Public abstract class InputStream extends Object

2、InputStream類中聲明瞭用於字節流輸入的多個方法

read() 從流中講稿數據

skip() 跳過流中若干字節數

available() 返回流中可用字節數

mark() 在流中標記一個位置

reset() 返回標記過的位置

markSupport() 是否支持標記和復位操作

close() 關閉流

3、字節輸出流OutputStream類

    OutputStream類爲所有面向字節的輸出流的父類,爲JAVA.io的抽象類。

    Public abstract class OuputStream extends Object

4、OutputStream類中聲明瞭用於字節流輸出的多個方法

    write(int b) 將一個整數輸出到流中

    write(byte[] b) 將數組中的數據輸出到流中

write(byte[] b,int off,int len) 將數組b中從off指定的位置開始len長度的數據輸出到流中。

flush() 將緩衝區中的數據強制送出。

close() 關閉流

二、文件字節輸入/輸出流類FileInputStream/FileOutputStream

    InputStream類和OutputStream類者是抽象類,文件數據流類FileInputStream和FileOutputStream是用於進行文件輸入/輸出處理的字節流類,其數據對象是文件。

1、  文件字節輸入流類FileInputStream

FileInputStream用於順序訪問本地文件。

(1)       構造方法

Public FileInputStream(String name) throws FileNotFoundException

Public FileInputStream(File file) throws FileNotFoundException

注:name爲文件名,file爲文件類File的對象,即可以以文件名或File對象構造文件輸入流對象。

    (2)讀取字節的方法

        Public int read() 從輸入流中讀取一字節數據,返回下一字節數據,如果已達到文件末尾,則返回-1

        Public int read(byte[] b) 從輸入流中將最多b.length字節的數據讀入一個byte數組中,返回讀入緩衝區的字節總數,如果已經到達文件末尾而沒有更多的數據,返回-1

        Public int read(byte[] b,int off,int len) 從輸入流中讀取最多len個字節,存入字節數組b中(從off位置開始起),返回實際讀入的字節數。

(2)       關閉輸入流

close() 方法關閉流,並釋放相關的系統資源。

三、Java的標準數據流

1、標準輸入System.in

    System.in作爲字節輸入流類InputStream的對象,實現標準的輸入,使用其read()方法從鍵盤接收數據。

2、  標準輸出System.out

System.out是打印流類PrintStream的對象,用來實現標準輸出。

3、  標準的錯誤輸出System.err

System.err與System.out相同,以PrintStream類的對象err實現標準的錯誤輸出。

四、例子

字節流可以操作任何數據

字符流使用的是字符數組;字節流使用的是字節數組

1、FileInputStream和FileOutputStream的使用。

FileOutputStream fos = new FileOutputStream("a.txt");

fos.write(12);//直接將數據寫入到了目的地。

fos.close();//只關閉資源。

FileInputStream fis = new FileInputStream("a.txt");

//fis.available();//獲取關聯的文件的字節數。

//如果文件體積不是很大,可以這樣操作。

byte[] buf = new byte[fis.available()];//創建一個剛剛好的緩衝區。但是這有一個弊端,就是文件過大,大小超出jvm的內容空間時,會內存溢出。

fis.read(buf);

System.out.println(new String(buf));

2、編寫程序copy一個圖片。

package com.hbsi.io;

import java.io.*;

public class CopyImageDemo {

    public static void main(String[] args){

       //複製---從源文件中讀取數據,寫入到目標文件

       //輸入流---FileInputStream  BufferedInputStream    輸出流---FileOutputStream  BufferedOutputStream

       FileInputStream fis=null;

       FileOutputStream fos=null;

       BufferedInputStream bis=null;

       BufferedOutputStream bos=null;

      

       try {

           fis=new FileInputStream("res/未命名.jpg");

           bis=new BufferedInputStream(fis);

           fos=new FileOutputStream("res/圖片1.jpg");

           bos=new BufferedOutputStream(fos);

           int  n=0;

           while((n=bis.read())!=-1){

              bos.write(n);

           }

       } catch (FileNotFoundException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }finally{

           if(bis!=null){

              try {

                  bis.close();

                  bos.close();

              } catch (IOException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }

           }

             

       }

      

    }

}

 

五、補充----轉換流

    OutputStreamWriter:是Writer的子類,將輸出的字符流變爲字節流,即:將一個字符流的輸出對象變爲字節流的輸出對象。字符到字節的橋樑

InputStreamReader:是Reader的子類,將輸入的字節流變爲字符流,即:將一個字節流的輸入對象變爲字符流的輸入對象。字節到字符的橋樑

OutputStreamWriter和InputStreamReader的構造—他們本身是字符流,又具有轉換的作用,因此在構造的時候,需要傳入字節流對象

public OutputStreamWriter(OutputStream out)

public OutputStreamWriter(OutputStream out, String charsetName)

public InputStreamReader(InputStream in)

public  InputStreamReader(InputStream in, String charsetName)

 

操作文件的字符流FileReader和FileWriter是轉換流的子類,因此從他們的繼承關係就可以清楚的發現,不管是使用字節流還是字符流實際上最終都是以字節的形式操作輸入和輸出的。

注意:在使用FileReader操作文本數據時,該對象使用的是默認的編碼表。如果要使用指定編碼表時,必須使用轉換流。
發佈了42 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章