javaI/O流小结
【README】
1.本文總結java IO讀取或寫入數據的方式和相關類說明;
2.java IO建立在流之上的。輸入流讀取數據,輸出流寫入數據;
3.過濾器流-filter stream,可以串連(修飾)到輸入流和輸出流上;
4.補充:
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 {4.輸出過濾器流 FilterOuputStream 子類;??
public class FilterOutputStream extends OutputStream {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.其他原始閱讀器和書寫器(不依賴底層輸入輸出流)
【2.1】過濾器閱讀器和書寫器
1,過濾器閱讀器和書寫器列表
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流小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java之Socket与HTTP区别
- 下一篇: (转)HttpURLConnection