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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java bufferedwriter 写入tab_Java基础-IO流

發(fā)布時(shí)間:2023/12/19 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java bufferedwriter 写入tab_Java基础-IO流 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

流的原理
在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ù)源就像水箱,流就像水管中流著的水流,程序就是我們最終的用戶。 流是一個(gè)抽象、動 態(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語言中最基本的兩個(gè)字節(jié)輸入輸出類。
其他所有字節(jié)輸入輸出流類都繼承自這兩個(gè)基類。
這兩個(gè)類都是抽象類,不能創(chuàng)建它們的實(shí)例,只能使用它們的子類.

Reader和Writer

Java語言中最基本的兩個(gè)字符輸入輸出類。
其他所有字符輸入輸出流類都繼承自這兩個(gè)基類。
這兩個(gè)類都是抽象類,不能創(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)建這兩個(gè)緩沖流的對象時(shí)時(shí),會創(chuàng)建了內(nèi)部緩沖數(shù)組,缺省使用32字節(jié)大小的緩沖區(qū).
當(dāng)讀取數(shù)據(jù)時(shí),數(shù)據(jù)按塊讀入緩沖區(qū),其后的讀操作則直接訪問緩沖區(qū)
當(dāng)寫入數(shù)據(jù)時(shí),首先寫入緩沖區(qū),當(dāng)緩沖區(qū)滿時(shí),其中的數(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() 讀取一個(gè)文本行的數(shù)據(jù)
BufferedWriter
newLine(); 寫入一個(gè)行分隔符。

使用緩沖字符流是復(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的一個(gè)實(shí)例,代表顯示器

System.err 也是PrintStream的一個(gè)實(shí)例,代表顯示器

PrintStream的輸出功能非常強(qiáng)大,通常需要輸出文本內(nèi)容,都可以將輸出流包裝成 PrintStream后進(jìn)行輸出

PrintStream的方法都不拋出IOException
PrintWriter
PrintStream的對應(yīng)字符流,功能相同,方法對應(yīng)。
PrintWriter的方法也不拋出IOException
復(fù)制文件時(shí)可以使用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成員變量

如果一個(gè)對象的成員變量是一個(gè)對象,這個(gè)對象的成員變量也會保存

串行化保存的只是變量的值,對于變量的任何修飾符,都不能保存

使用對象流把一個(gè)對象寫到文件時(shí)不僅保證該對象是序列化的,而且該對象的成員 對象也必須是可序列化的。

如果一個(gè)可序列化的對象包含對某個(gè)不可序列化的對象的引用,那么整個(gè)序列化操 作將會失敗,并且會拋出一NotSerializableException。我們可以將這個(gè)引用標(biāo)記為 transient,那么對象仍然可以序列化。

同一個(gè)對象多次序列化的處理

所有保存到磁盤中的對象都有一個(gè)序列化編號

序列化一個(gè)對象中,首先檢查該對象是否已經(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。