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