java bufferedwriter 写入tab_Java基础-IO流
流的原理
在Java程序中,對于數據的輸入/ 輸出操作以“流” (stream) 方式進 行;
J2SDK提供了各種各樣的“流”類, 用以獲取不同種類的數據;程序 中通過標準的方法輸入或輸出數 據。
Java的流類型一般位于 java . IO 包中
數據源
data source. 提供原始數據的原始媒介。常見的:數據庫、文件、其他程序、內存、網絡連接、IO設備。
數據源就像水箱,流就像水管中流著的水流,程序就是我們最終的用戶。 流是一個抽象、動 態的概念,是一連串連續動態的數據集合。
流的分類
流的方向:
輸入流:數據源到程序(InputStream、Reader讀進來)
輸出流:程序到目的地(OutPutStream、Writer寫出去)
處理數據單元:
字節流:按照字節讀取數據(InputStream、OutputStream)
字符流:按照字符讀取數據(Reader、Writer)
功能不同:
節點流:可以直接從數據源或目的地讀寫數據。
處理流(包裝流):不直接連接到數據源或目的地,是其他流進行封裝。目的主要是簡化操作和提高性能.
節點流和處理流的關系:
節點流處于io操作的第一線,所有操作必須通過他們進行;
處理流可以對其他流進行處理(提高效率或操作靈活性)
IO流類的體系
InputStream和OutputStream
Java語言中最基本的兩個字節輸入輸出類。
其他所有字節輸入輸出流類都繼承自這兩個基類。
這兩個類都是抽象類,不能創建它們的實例,只能使用它們的子類.
Reader和Writer
Java語言中最基本的兩個字符輸入輸出類。
其他所有字符輸入輸出流類都繼承自這兩個基類。
這兩個類都是抽象類,不能創建它們的實例,只能使用它們的子類
FileInputStream/FileOutputStream
使用FileInputStream讀取文件內容
abstract int read( );
int read( byte b[ ] );
int read( byte b[ ], int off, int len );
int available( );
close( );
使用FileOutputStream寫內容到文件
abstract void write( int b );
void write( byte b[ ] );
void write( byte b[ ], int off, int len );
void flush( );
void close( );
使用FileInputStream/FileOutputStream復制文件
FileReader和FileWriter
使用FileReader和FileWriter完成文件復制
緩沖字節流
BufferedInputStream和BufferedOutputStream
FileInputStream和FileOutputStream是節電流
BufferedInputStream和BufferedOutputStream是處理流(包裝流)
讀文件和寫文件都使用了緩沖區,減少了讀寫次數,從而提高了效率
當創建這兩個緩沖流的對象時時,會創建了內部緩沖數組,缺省使用32字節大小的緩沖區.
當讀取數據時,數據按塊讀入緩沖區,其后的讀操作則直接訪問緩沖區
當寫入數據時,首先寫入緩沖區,當緩沖區滿時,其中的數據寫入所連接的輸出流。使用方 法flush()可以強制將緩沖區的內容全部寫入輸出流
關閉流的順序和打開流的順序相反.只要關閉高層流即可,關閉高層流其實關閉的底層節點流Flush的使用:
手動將buffer中內容寫入文件
緩沖字符流
BufferedReader
readLine() 讀取一個文本行的數據
BufferedWriter
newLine(); 寫入一個行分隔符。
使用緩沖字符流是復制文本文件常用的方式
轉換流
InputStreamReader和OutputStreamWriter
用于將字節流轉化成字符流,字符流與字節流之間的橋梁
InputStreamReader的作用是把InputStream轉換成Reader
OutputStreamWriter的作用是把OutputStream轉換成Writer
存在將字節流轉換成字符流的轉換流,因為字符流操作文本更簡單
不存在把字符流轉換成字節流的轉換流,因為沒有必要
System. in 代表標準輸入,即鍵盤輸入,是InputStream的
打印流
PrintStream
PrintStream提供了一系列的print()和println(),可以實現將基本數據類型格式化成字符串輸出。 對象類型將先調用
toString(),然后輸出該方法返回的字符串
System.out就是PrintStream的一個實例,代表顯示器
System.err 也是PrintStream的一個實例,代表顯示器
PrintStream的輸出功能非常強大,通常需要輸出文本內容,都可以將輸出流包裝成 PrintStream后進行輸出
PrintStream的方法都不拋出IOException
PrintWriter
PrintStream的對應字符流,功能相同,方法對應。
PrintWriter的方法也不拋出IOException
復制文件時可以使用PrintWriter代替BufferedWriter完成,更簡單
緩沖字節流
DataInputStream和DataOutputStream
提供了可以存取所有Java基礎類型數據(如:int,double 等)和String的方法。
處理流,只針對字節流,二進制文件
對象序列化
對象序列化 (Serialization)
將Java對象轉換成字節序列(IO字節流)
對象反序列化 (DeSerialization)
從字節序列中恢復Java對象
為什么序列化
序列化以后的對象可以保存到磁盤上,也可以在網絡上傳輸,使得不同的計算機可以共享對 象.(序列化的字節序列是平臺無關的)
對象序列化的條件
只有實現了Serializable接口的類的對象才可以被序列化。Serializable接口中沒有任何的方法,實現 該接口的類不需要實現額外的方法。
如果對象的屬性是對象,屬性對應類也必須實現Serializable接口
序列化能保存的元素
只能保存對象的非靜態成員變量
不能保存任何成員方法和靜態的成員變量
不保存transient成員變量
如果一個對象的成員變量是一個對象,這個對象的成員變量也會保存
串行化保存的只是變量的值,對于變量的任何修飾符,都不能保存
使用對象流把一個對象寫到文件時不僅保證該對象是序列化的,而且該對象的成員 對象也必須是可序列化的。
如果一個可序列化的對象包含對某個不可序列化的對象的引用,那么整個序列化操 作將會失敗,并且會拋出一NotSerializableException。我們可以將這個引用標記為 transient,那么對象仍然可以序列化。
同一個對象多次序列化的處理
所有保存到磁盤中的對象都有一個序列化編號
序列化一個對象中,首先檢查該對象是否已經序列化過
如果沒有,進行序列化
如果已經序列化,將不再重新序列化,而是輸出編號即可
如果不希望某些屬性(敏感)序列化,或不希望出現遞歸序列
為屬性添加transient關鍵字(完成排除在序列化之外)
自定義序列化(不僅可以決定哪些屬性不參與序列化,還可以定義屬性具體如何序列化)
序列化版本不兼容
修改了實例屬性后,會影響版本號,從而導致反序列化不成功
解決方案:為Java對象指定序列化版本號serialVersionUID
字節/字符數組/字符串流
ByteArrayInutStream和ByteArrayOutputStream
數據源或目的地為:字節數組
只有字節流,沒有字符流
節點流
CharArrayReader和CharArrayWriter
數據源或目的地為:字符數組
只有字符流,沒有字節流
節點流
StringReader和StringWriter
數據源或目的地為:字符串
只有字符流,沒有字節流
節點流
IO總結
總結
以上是生活随笔為你收集整理的java bufferedwriter 写入tab_Java基础-IO流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 约里克地狱送葬稀有吗
- 下一篇: java object转map_Java