日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

javaI/O流小结

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javaI/O流小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【README】

1.本文總結java IO讀取或寫入數據的方式和相關類說明;

2.java IO建立在流之上的。輸入流讀取數據,輸出流寫入數據;

3.過濾器流-filter stream,可以串連(修飾)到輸入流和輸出流上;

4.補充:

  • 補充1:java流操作數據的單位是字節
  • 補充2:流是同步的。 當程序請求一個流讀寫一段數據時,在做操作前,它要等待讀寫的數據到達或可用;
  • 補充3:javaIO的實現方式還包括通道和緩存區的非阻塞IO;
  • 5.閱讀器reader或書寫器writer,可以串鏈到輸入流和輸出流上,操作數據的單位是字符


    【1.1】java流

    【1.1】java輸入輸出流基類(操作字節)

    java基本輸出流類是? OutputStream;寫入字節;

    java基本輸入流類是 InputStream; 讀取字節;


    【1.2】過濾器流(操作字節,對字節加工或把字節轉為字符)

    1.過濾器基類是 FilterInputStream, FilterOutputStream;分別繼承 InputStream, OuputStream;

    2.過濾器分為2種:

  • 過濾器流;過濾器流主要將原始數據作為字節處理;如壓縮數據或解釋為二進制數字;
  • 閱讀器和書寫器;把不同編碼格式的字節轉為字符文本進行處理;
  • 3.輸入過濾器流 FilterInputStream 子類列表

    public class FilterInputStream extends InputStream {
  • DataInputStream;二進制讀寫數據;
  • GZIPInputStream;壓縮;
  • HttpInputStream;支持http連接;
  • TelnetInputStream;只是telnet連接;模擬客戶端登錄服務器協議;
  • ZipInputStream; 壓縮;
  • 4.輸出過濾器流 FilterOuputStream 子類;??

    public class FilterOutputStream extends OutputStream {
  • DataOutputStream;
  • GZIPOutputStream;
  • HttpSendOutputStream;
  • TelnetOutputStream;
  • ZipOutputStream;
  • 5.多個過濾器流如何串鏈在一起處理字節流;


    ?

    【1.2.1】多個過濾器鏈在一起

    1.把 FileInputStream 和 BufferedInputStream 串鏈在一起?

    @Testpublic void t1() throws Exception {FileInputStream fis = new FileInputStream("D:\\temp\\hello5.txt");BufferedInputStream bis = new BufferedInputStream(fis);}

    ?


    【1.3】緩沖流(操作字節,緩沖)

    1.分為輸入緩沖流 BufferedInputStream, 輸出緩沖流 BufferedOutputStream ;

    2.緩沖流的作用

    • 2.1 對于輸入緩沖流而言, 一次性不是讀取一個字節,而是讀取多個字節如1k個字節,減少磁盤io,提高讀取性能;
    • 2.2 對于輸出緩沖流而言,一次性不是寫入一個字節,而是寫入多個字節如1k;特別對于網絡連接,一次發送一個字節,每次報文頭開銷40字節,即每發送1個字節就會附加40個字節報文頭,性能非常低下;若一次寫入多個字節,則報文頭開銷占比會小很多,傳輸效率大大增加;

    【1.4】PringStream(操作字節,丟棄)

    PrintStream 是有害的;應該避開它;

    • 問題1,因為 println() 的輸出與平臺有關;
    • 問題2,PrintStream假定使用所在平臺的默認編碼方式;
    • 問題3,printStream 吞掉所有異常;

    【1.5】數據流(操作字節,二進制格式)

    1.數據流基本類, DataInputStream, DataOutputStream ; 可以用二進制格式讀寫java基本數據類型和字符串;

    try(DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\temp\\hello2.txt")))) {dataOutputStream.write("hellworld2.這里是中國".getBytes(StandardCharsets.UTF_8));}

    【2】閱讀器和書寫器(操作字符)

    1.閱讀器和書寫器, 操作數據的單位是字符而不是字節;

    2.基類分別為 Reader, Writer ;

    3.它們最重要的子類是 InputStreamReader 和 OutputStreamWriter類(依賴底層輸入輸出流);分別把字節轉為字符進行讀取,把字符轉為字節進行寫入; 可以在創建實例時指定字符編碼方式,不用每次處理的時候都去指定編碼方式

    4.其他原始閱讀器和書寫器(不依賴底層輸入輸出流)

  • FileReader
  • FileWriter
  • StringReader
  • StringWriter
  • CharArrayReader
  • CharArrayWriter
  • // 書寫器 try (OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream("D:\\temp\\hello4.txt")), StandardCharsets.UTF_8)) {outputStreamWriter.write("helloworld4.這里是中國"); }// 閱讀器 try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("D:\\temp\\hello4.txt"), StandardCharsets.UTF_8)) {StringBuilder stringBuilder = new StringBuilder();int c = 0;while((c = inputStreamReader.read()) != -1) {stringBuilder.append((char)c);}System.out.println();System.out.println(stringBuilder.toString()); }

    【2.1】過濾器閱讀器和書寫器

    1,過濾器閱讀器和書寫器列表

  • BufferedReader;緩沖讀取器;
  • BuffererWriter; 緩沖寫入器;
  • LineNumberReader;
  • PushbackReader;
  • PrintWriter;(用于替換PrintStream,但也存在小問題)
  • 2,BufferedReader

    有1個readLine(),可以讀取一行字符,并作為字符串返回;?

    try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\temp\\hello4.txt"), StandardCharsets.UTF_8))) {String result = bufferedReader.readLine();System.out.println(result); }

    【3】流關閉方式

    1. 方式1, 通過 try-finally 塊關閉; 把關閉流代碼放在 finally 里面;

    2.方式2,java7引入了 帶資源的try構造方式,可以更簡潔地完成流關閉;如下:

    try(DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\temp\\hello2.txt")))) {dataOutputStream.write("hellworld2.這里是中國".getBytes(StandardCharsets.UTF_8));}

    【3.1】如何優雅關閉流

    1. 之所以使用帶資源的try的構造方式新建的流可以自動關閉,其原因在于, 流實現了 AutoCloseable 接口, 如下:以 DataOutputStream 為例;

    public class DataOutputStream extends FilterOutputStream implements DataOutput { ...public class FilterOutputStream extends OutputStream { ...public abstract class OutputStream implements Closeable, Flushable { ...public interface Closeable extends AutoCloseable { ...public interface AutoCloseable {void close() throws Exception; }

    2. close方法如下實現的? 參見 FilterOutputStream.close() 方法 ;? 所以它在關閉流的時候,會先刷新緩沖到底層流;

    public void close() throws IOException {try (OutputStream ostream = out) { // 這里其實也是一個 try資源塊 flush();}}public void flush() throws IOException {out.flush();}

    3.我們再看下 AutoCloseable 的類說明如下:

    一個可能持有資源(例如文件或套接字句柄)直到關閉的對象。 AutoCloseable 對象的 close() 方法在退出 try-with-resources 塊時自動調用,該塊已在資源規范標頭中聲明了該對象。 這種構造確保及時釋放,避免資源耗盡異常和否則可能發生的錯誤。
    API注意事項:

    即使不是所有的子類或實例都擁有可釋放的資源,基類也有可能實現 AutoCloseable,而且實際上很常見。

    對于必須完全通用的代碼,或者當知道 AutoCloseable 實例需要資源釋放時,建議使用 try-with-resources 構造。 但是,當使用 java.util.stream.Stream 等支持基于 I/O 和非基于 I/O 的形式時,使用非 I/O 時通常不需要 try-with-resources 塊 - 基于形式。

    ?


    【4】java IO流小結

    【4.1】輸入輸出字節流類結構

    【4.1.1】常用輸入字節流類結構-InputStream

    ?

    ?【4.1.2】常用輸出字節流類結構-OutputStream


    ?【4.2】輸入輸出字符流類結構

    【4.2.1】常用輸入字符流類結構-Reader

    ?【4.2.2】常用輸出字符流類結構-Writer

    ?

    總結

    以上是生活随笔為你收集整理的javaI/O流小结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。