Java IO 流

來源:互聯網
上載者:User

標籤:pat   orm   ott   資料   border   有用   nav   ring   clear   

 

 

關於物件導向的方法的一個說明。 對於多態而言,可以使用子類來執行個體化父類,這對於物件導向有很重要的作用,但是,子類中的一些專屬的方法父類就掉用不到了,這個時候可以使用向下轉型,將父類進行強行的資料轉型,就可以使用這些方法了

位元組流和字元流

位元組流InputStream/OutputStream ,只能操作byte
字元流Reader/Writer

FileoutputStream(File f)

位元組流本身是只能操作byte的。
對於這一個類,如果檔案不存在會自動建立
write()方法預設會將檔案進行覆蓋
可以使用構造方法FileoutputStream(File f,boolean append),這樣就可以指定要不要使用追加模式

FileoutputStream(File f)

方法- available() 獲得可以讀取的位元組數

字元流

一般一個字元為兩個位元組,可以直接操作字串
會用到緩衝區
FileWriter/FileReader
預設依然是覆蓋,要追加只要和FileoutputStream類似加boolean標誌就好了Filereader讀取到char/char[]

位元組流和字元流的不同

位元組流是直接與檔案操作,不會用到緩衝區字元流資料先放在緩衝區,然後再從緩衝區寫到檔案,要記得fiush()或者close()

位元組-字元的轉換流
  1. InputStreamReader
    將一個輸入位元組流轉為字元流,是Reader的子類
  2. OutputStreamWriter
    將一個輸出位元組流轉為字元流,是Writer的子類

FileWriter是OutputStreamWriter的子類FileReader是OutputStreamReader的子類

記憶體操作流

ByteArrayInputStream(byte[])
將byte中是資料寫入記憶體中
ByteArrayOutputStream()
實際的意思就是說,通過輸入資料流將資料寫入到記憶體裡面,然後通過輸出資料流把記憶體裡面的東西取出來!

    private static void tesByteArrayInputStream() {    // 建立ByteArrayInputStream位元組流,內容是ArrayLetters數組    ByteArrayInputStream bais = new ByteArrayInputStream(ArrayLetters);    // 從位元組流中讀取5個位元組    for (int i=0; i<LEN; i++) {        // 若能繼續讀取下一個位元組,則讀取下一個位元組        if (bais.available() >= 0) {            // 讀取“位元組流的下一個位元組”            int tmp = bais.read();            System.out.printf("%d : 0x%s\n", i, Integer.toHexString(tmp));        }    }    // 若“該位元組流”不支援標記功能,則直接退出    if (!bais.markSupported()) {        System.out.println("make not supported!");        return ;    }    // 標記“位元組流中下一個被讀取的位置”。即--標記“0x66”,因為因為前面已經讀取了5個位元組,所以下一個被讀取的位置是第6個位元組”    // (01), ByteArrayInputStream類的mark(0)函數中的“參數0”是沒有實際意義的。    // (02), mark()與reset()是配套的,reset()會將“位元組流中下一個被讀取的位置”重設為“mark()中所儲存的位置”    bais.mark(0);    // 跳過5個位元組。跳過5個位元組後,位元組流中下一個被讀取的值應該是“0x6B”。    bais.skip(5);    // 從位元組流中讀取5個資料。即讀取“0x6B, 0x6C, 0x6D, 0x6E, 0x6F”    byte[] buf = new byte[LEN];    bais.read(buf, 0, LEN);    // 將buf轉換為String字串。“0x6B, 0x6C, 0x6D, 0x6E, 0x6F”對應字元是“klmno”    String str1 = new String(buf);    System.out.printf("str1=%s\n", str1);    // 重設“位元組流”:即,將“位元組流中下一個被讀取的位置”重設到“mark()所標記的位置”,即0x66。    bais.reset();    // 從“重設後的位元組流”中讀取5個位元組到buf中。即讀取“0x66, 0x67, 0x68, 0x69, 0x6A”    bais.read(buf, 0, LEN);    // 將buf轉換為String字串。“0x66, 0x67, 0x68, 0x69, 0x6A”對應字元是“fghij”    String str2 = new String(buf);    System.out.printf("str2=%s\n", str2);}

}

管道流

管道流就是實現兩個進程之間的通訊

PipeOutputStream PipeInputStream 使用的時候要使用connect()把輸入輸出資料流串連起來,Connect是PipeOutputStream的方法,用來串連一個PipeInputStream

列印流PrintStream

定義了很多的print和pringtln方法,可以列印任意資料類型
System.out就是定位在輸出裝置的PrintStream

構造方法,指定輸出的位置PrintSTream(OutputStream out)

這樣列印輸出更加方便了,PrintStream就是OutputStream的子類,可以方便的進行輸出,這樣的設計稱之為裝飾設計模式

PrintWriter與上面的類似格式化輸出

類似於C語言的格式化輸出 %d,%s,%f,%c

ps.printf("姓名%s,年齡:%d",a,b);
System.in以及BufferedReader(字元流)

是一個InputStream

    BufferedReader buf=null;    buf=new BufferedReader(new InputStreamReader(System.in));    String str=null;    try {        while ((str=buf.readLine())!=null){            System.out.println(str);        }    } catch (IOException e) {        e.printStackTrace();    }
輸入輸出重新導向
System.setOut(new PrintStream(new FileOutputStream("D:/a.txt")));

實際上in、out、err就是System的三個常量,可以通過set方法改變,然後就完成了重新導向的作用。

Scanner

在java.util包中,可以實現BufferedReader的全部功能,是一個工具類

  • 預設的分隔字元是空格,可以自行設定
  • 非常強大,可以接受多種類型的資料,但是對於日期類型沒有支援,可以使用Scanner.hasNext(Pattern)/next(Pattern)匹配來取出資料
  • 可以接受File,做一系列檔案操作

    Scanner scanner=new Scanner(System.in);scanner.useDelimiter("\n");//修改分割符int a=0;float f=0f;String date=null;if(scanner.hasNextInt()){    a=scanner.nextInt();}if(scanner.hasNextFloat()){    f=scanner.nextFloat();}if(scanner.hasNext("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")){    date=scanner.next("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");}System.out.println(a+" "+f+" "+date);try {    Date date1=new SimpleDateFormat("yy-MM-dd hh:mm:ss").parse(date);    System.out.println(date1);} catch (ParseException e) {    e.printStackTrace();}
合并流壓縮流

支援三種格式的壓縮,zip/jar/Gzip,這裡以zip為例另外兩種都是一樣的
ZipEntry,就是壓縮檔目錄下的每一個檔案

  • ZipOutputStream(OutputStream)
    • PutNextEntry(ZipEntry ?)

可以將檔案、檔案夾進行壓縮

ZipFile類

專門表示壓縮檔的類

回退流字元編碼
獲得本機編碼System.getProperity("file.encoding")

常見的編碼格式

  • iso8859-1單位元組編碼,只能表示英文
  • GBK國標,表示漢字
  • unicode 16進位兩個位元組的編碼,最標準的,但是不相容iso-8859-1
  • utf 變長的編碼,一個字元長度1--6不等,可以表示所有語言的字元、
關於io流的結構

輸入資料流

  • InputStream
    • ByteArrayInputStream(byte[])
    • FileInputStream(File)
    • PipedInputStream
    • SequenceInputStream(InputStream,InputStream)
    • FilterInputStream
      • BufferedInputStream(InputStream)
      • PushbackInputStream
      • DataInputStream
        • ObjectInputStream

輸出資料流

  • OutputStream
    • ByteArrayOutputStream
    • FileOutputStream
    • PipedOutputStream
    • FilterOutputStream
      • BufferedOutputStream
      • PrintWriter
      • DataOutputStream
        • ObjectOutputStream

常見的方法

                        InputStream是輸入位元組資料用的類,所以InputStream類提供了3種重載的read方法.Inputstream類中的常用方法:                      1   public abstract int read( ):讀取一個byte的資料,傳回值是高位補0的int類型值。                      2   public int read(byte b[ ]):讀取b.length個位元組的資料放到b數組中。傳回值是讀取的位元組數。該方法實際上是調用下一個方法實現的                      3   public int read(byte b[ ], int off, int len):從輸入資料流中最多讀取len個位元組的資料,存放到位移量為off的b數組中。                      4   public int available( ):返回輸入資料流中可以讀取的位元組數。注意:若輸入阻塞,當前線程將被掛起,如果InputStream對象調用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調用才有用,                      5   public long skip(long n):忽略輸入資料流中的n個位元組,傳回值是實際忽略的位元組數, 跳過一些位元組來讀取                      6   public int close( ) :我們在使用完後,必須對我們開啟的流進行關閉.                     OutputStream提供了3個write方法來做資料的輸出,這個是和InputStream是相對應的。                      1. public void write(byte b[ ]):將參數b中的位元組寫到輸出資料流。                      2. public void write(byte b[ ], int off, int len) :將參數b的從位移量off開始的len個位元組寫到輸出資料流。                      3. public abstract void write(int b) :先將int轉換為byte類型,把低位元組寫入到輸出資料流中。                      4. public void flush( ) : 將資料緩衝區中資料全部輸出,並清空緩衝區。                      5. public void close( ) : 關閉輸出資料流並釋放與流相關的系統資源。

java的流類提供了結構化方法,如,底層流和高層過濾流。
而高層流不是從輸入裝置讀取,而是從其他流讀取。同樣高層輸出資料流也不是寫入輸出裝置,而是寫入其他流。
使用"分層對象(layered objects)",為單個對象動態地,透明地添加功能的做法,被稱為Decorator
Pattern。Decorator模式要求所有包覆在原始對象之外的對象,都必須具有與之完全相同的介面。這使得
decorator的用法變得非常的透明--無論對象是否被decorate過,傳給它的訊息總是相同的。這也是Java I/O
類庫要有"filter(過濾器)"類的原因:抽象的"filter"類是所有decorator的基類

  • DataInputStream 包含了一整套讀取primitive資料的介面
  • BufferedInputStream,為InputStream增加了一個緩衝區,緩衝區的大小是8k
  • PushbackInputStream 有一個"彈壓單位元組"的緩衝區,可以把最後讀到的那個位元組再壓回去
  • DataOutputStream 包括寫入primitive資料的全套介面。
  • PrintStream(inpurstream,boolean autoflush) 列印流
  • BufferedOutputStream 有緩衝區

 

 

Java IO 流

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.