IO流 2018-05-07

字節(jié)流和字符流:

1字節(jié)流(均為抽象類):在字節(jié)流中定義了方法read(),用于從字節(jié)流中讀取對象:

public abstract int read() throws IOException;

這是抽象方法,它從字節(jié)流中讀取一個(gè)字節(jié),到了末尾返回-1,否則返回讀入的字節(jié),它會一直

阻塞,直到返回讀取的是字節(jié)或是-1,字節(jié)流不支持緩存,每次調(diào)用都會伴隨著一次磁盤io,

效率低,要想使用內(nèi)存緩沖區(qū)提高讀取效率,應(yīng)該使用BufferedInputStream

(1)字節(jié)輸入流:inputStream

(2)字節(jié)輸出流:outputStream

2 字符流

字符流處理的最基本單位是Unicode碼元(2字節(jié)),它用來處理文本數(shù)據(jù)

字符輸出流:把要寫入文件的字符序列(實(shí)際上是Unicode碼元序列)轉(zhuǎn)為指定編碼方式下的字節(jié)序列,然后再寫入到文件中;

輸入字符流:把要讀取的字節(jié)序列按指定編碼方式解碼為相應(yīng)字符序列(實(shí)際上是Unicode碼元序列從)從而可以存在內(nèi)存中催式。

由于字符流在輸出前實(shí)際上是要完成Unicode碼元序列到相應(yīng)編碼方式的字節(jié)序列的轉(zhuǎn)換,

所以它會使用內(nèi)存緩沖區(qū)來存放轉(zhuǎn)換后得到的字節(jié)序列喘蟆,等待都轉(zhuǎn)換完畢再一同寫入磁盤文件中摩骨。

3字符流和字節(jié)流的區(qū)別:

字節(jié)流操作的基本單元為字節(jié)擎椰;字符流操作的基本單元為Unicode碼元秉沼。

字節(jié)流默認(rèn)不使用緩沖區(qū)州刽;字符流使用緩沖區(qū)呕寝。

字節(jié)流通常用于處理二進(jìn)制數(shù)據(jù)勋眯,實(shí)際上它可以處理任意類型的數(shù)據(jù),但它不支持直接寫入或讀取Unicode碼元下梢;

字符流通常處理文本數(shù)據(jù)客蹋,它支持寫入及讀取Unicode碼元。

對象流

Java中可以通過對象流將一個(gè)序列化的對象保存到硬盤中孽江,或者硬盤中讀取一個(gè)對象讶坯。對象流的存儲和讀取包含以下幾點(diǎn)內(nèi)容:

1、所保存的對象必須實(shí)現(xiàn)Serializable接口岗屏。

2辆琅、 所保存的對象的屬性也必須實(shí)現(xiàn)Serializable接口。

3这刷、 最好要給該對象提供一個(gè)版本號婉烟,private static final long serialVersionId。

例:

class Person implements Serializable {

//實(shí)現(xiàn)序列化接口暇屋,其中的String隅很,int也都是實(shí)現(xiàn)了Serializable的,不然就會報(bào)錯(cuò)

? private static final long serialVersionUID = 7072662597320618920L;

? String name;

? int age;

? public Person(String name, int age) {

? ? this.name = name;

? ? this.age = age;

? }

? @Override

? public String toString() {

? ? return "Person [name=" + name + ", age=" + age + "]";

? }

}

public class ObjectStreamTest {

? private ObjectInputStream ips;

? @Test

? public void outStreamTest() throws Exception {

? ? File file = new File("D:/person.txt");

? ? Person p1 = new Person("hanking", 24);

? ? Person p2 = new Person("Hust", 120);

? ? FileOutputStream fos = new FileOutputStream(file);

? ? ObjectOutputStream ops = new ObjectOutputStream(fos);

? ? ops.writeObject(p2);

? ? ops.writeObject(p1);

? ? ops.flush();

? ? ops.close();

? }

? @Test

? public void InStreamTest() throws Exception {

? ? ips = new ObjectInputStream(new FileInputStream("D:/person.txt"));

? ? Person p1 = (Person) ips.readObject();

? ? System.out.println(":" + p1);

? ? Person p2 = (Person) ips.readObject();

? ? System.out.println(":" + p2);

? ? ips.close();

? }

}

輸入輸出流

file類File類是IO包中唯一代表磁盤文件本身的對象率碾。通過File來創(chuàng)建,刪除屋彪,重命名文件所宰。

File類對象的主要作用就是用來獲取文本本身的一些信息。如文本的所在的目錄畜挥,文件的長度仔粥,讀寫權(quán)限等等

file構(gòu)造方法

  File(String pathname):根據(jù)一個(gè)路徑得到File對象

  File(String parent, String child):根據(jù)一個(gè)目錄和一個(gè)子文件/目錄得到File對象

  File(File parent, String child):根據(jù)一個(gè)父File對象和一個(gè)子文件/目錄得到File對象

File類(File類的創(chuàng)建功能)

  A:創(chuàng)建功能

    public boolean createNewFile():創(chuàng)建文件 如果存在這樣的文件,就不創(chuàng)建了

    public boolean mkdir():創(chuàng)建文件夾 如果存在這樣的文件夾蟹但,就不創(chuàng)建了

    public boolean mkdirs():創(chuàng)建文件夾,如果父文件夾不存在躯泰,會幫你創(chuàng)建出來

File類(File類的重命名和刪除功能)

File類的重命名和刪除功能

    public boolean renameTo(File dest):把文件重命名為指定的文件路徑

    public boolean delete():刪除文件或者文件夾

  重命名注意事項(xiàng)

    如果路徑名相同,就是改名华糖。

    如果路徑名不同麦向,就是改名并剪切。

  刪除注意事項(xiàng):

    Java中的刪除不走回收站客叉。

    要?jiǎng)h除一個(gè)文件夾诵竭,請注意該文件夾內(nèi)不能包含文件或者文件夾

File類(File類的判斷功能)

  判斷功能

    public boolean isDirectory():判斷是否是目錄

    public boolean isFile():判斷是否是文件

    public boolean exists():判斷是否存在

    public boolean canRead():判斷是否可讀

    public boolean canWrite():判斷是否可寫

    public boolean isHidden():判斷是否隱藏

File類(File類的獲取功能)

  獲取功能

    public String getAbsolutePath():獲取絕對路徑

    public String getPath():獲取路徑

    public String getName():獲取名稱

    public long length():獲取長度话告。字節(jié)數(shù)

    public long lastModified():獲取最后一次的修改時(shí)間,毫秒值

    public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數(shù)組

    public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數(shù)組

public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數(shù)組

public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數(shù)組

過濾器:

? public class FileTest {


? public static void main(String[] args){

? ? ? ? ? File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll");


? ? ? ? String[] str=file.list(new FilenameFilter() {//過濾器卵慰,匿名內(nèi)部類


? ? ? ? ? ? @Override

? ? ? ? ? ? public boolean accept(File dir, String name) {

? ? ? ? ? ? ? ? // TODO Auto-generated method stub

? ? ? ? ? ? ? ? //System.out.println(dir);//獲取文件的路徑

? ? ? ? ? ? ? ? //System.out.println(name);//獲取文件的名字

? ? ? ? ? ? ? ? File f=new File(dir,name);

? ? ? ? ? ? ? ? return f.isFile() && f.getName().endsWith(".jpg");

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? for(String s : str){

? ? ? ? ? ? System.out.println(s);

? ? ? ? }


? ? }

}

1 read () 方法沙郭,這個(gè)方法 從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié)。返回 0 到 255 范圍內(nèi)的 int 字節(jié)值裳朋。如果因?yàn)橐呀?jīng)到達(dá)流末尾而沒有可用的字節(jié)病线,則返回值 -1 。

2read (byte[] b,int off,int len) 方法鲤嫡, 將輸入流中最多 len 個(gè)數(shù)據(jù)字節(jié)讀入 byte 數(shù)組送挑。嘗試讀取 len 個(gè)字節(jié),但讀取的字節(jié)也可能小于該值泛范。

以整數(shù)形式返回實(shí)際讀取的字節(jié)數(shù)让虐。

3read (byte[] b) 方法, 從輸入流中讀取一定數(shù)量的字節(jié)罢荡,并將其存儲在緩沖區(qū)數(shù)組 b 中赡突。以整數(shù)形式返回實(shí)際讀取的字節(jié)數(shù)。

IO流(BufferedInputStream和BufferOutputStream拷貝)

* A:緩沖思想

  * 字節(jié)流一次讀寫一個(gè)數(shù)組的速度明顯比一次讀寫一個(gè)字節(jié)的速度快很多区赵,

  * 這是加入了數(shù)組這樣的緩沖區(qū)效果惭缰,java本身在設(shè)計(jì)的時(shí)候,

  * 也考慮到了這樣的設(shè)計(jì)思想笼才,所以提供了字節(jié)緩沖區(qū)流

* B.BufferedInputStream

  * BufferedInputStream內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組)

  * 從BufferedInputStream中讀取一個(gè)字節(jié)時(shí)

  * BufferedInputStream會一次性從文件中讀取8192個(gè), 存在緩沖區(qū)中, 返回給程序一個(gè)

  * 程序再次讀取時(shí), 就不用找文件了, 直接從緩沖區(qū)中獲取

  * 直到緩沖區(qū)中所有的都被使用過, 才重新從文件中讀取8192個(gè)

* C.BufferedOutputStream

  * BufferedOutputStream也內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組)

  * 程序向流中寫出字節(jié)時(shí), 不會直接寫到文件, 先寫到緩沖區(qū)中

  * 直到緩沖區(qū)寫滿, BufferedOutputStream才會把緩沖區(qū)中的數(shù)據(jù)一次性寫到文件里

:小數(shù)組的讀寫和帶Buffered的讀取哪個(gè)更快?

  * 定義小數(shù)組如果是8192個(gè)字節(jié)大小和Buffered比較的話

  * 定義小數(shù)組會略勝一籌,因?yàn)樽x和寫操作的是同一個(gè)數(shù)組

  * 而Buffered操作的是兩個(gè)數(shù)組

8:字符流FileReader和FileWriter

字符流是什么

  * 字符流是可以直接讀寫字符的IO流

  * 字符流讀取字符, 就要先讀取到字節(jié)數(shù)據(jù), 然后轉(zhuǎn)為字符. 如果要寫出字符, 需要把字符轉(zhuǎn)為字節(jié)再寫出.

IO流(什么情況下使用字符流)

* 字符流也可以拷貝文本文件, 但不推薦使用. 因?yàn)樽x取時(shí)會把字節(jié)轉(zhuǎn)為字符, 寫出時(shí)還要把字符轉(zhuǎn)回字節(jié).

* 程序需要讀取一段文本, 或者需要寫出一段文本的時(shí)候可以使用字符流

* 讀取的時(shí)候是按照字符的大小讀取的,不會出現(xiàn)半個(gè)中文

* 寫出的時(shí)候可以直接將字符串寫出,不用轉(zhuǎn)換為字節(jié)數(shù)組

IO流(字符流是否可以拷貝非純文本的文件)

* 不可以拷貝非純文本的文件

* 因?yàn)樵谧x的時(shí)候會將字節(jié)轉(zhuǎn)換為字符,在轉(zhuǎn)換過程中,可能找不到對應(yīng)的字符,就會用?代替,寫出的時(shí)候會將字符轉(zhuǎn)換成字節(jié)寫出去

* 如果是?,直接寫出,這樣寫出之后的文件就亂了,看不了了

字符流的使用

public class FileTest {


? ? public static void main(String[] args) throws Exception{

? ? ? ? BufferedReader br=new BufferedReader(new FileReader("aaa.txt"));

? ? ? BufferedWriter bw=new BufferedWriter(new FileWriter("bbb.txt"));

? ? ? ? //BufferedReader和BufferedWriter的使用:

? ? ? ? int b;

? ? ? ? while((b=br.read())!=-1){

? ? ? ? ? ? bw.write((char)b);

? ? ? ? }

? ? ? ? br.close();

? ? ? ? bw.close();

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漱受,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骡送,更是在濱河造成了極大的恐慌昂羡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摔踱,死亡現(xiàn)場離奇詭異虐先,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)派敷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蛹批,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篮愉,你說我怎么就攤上這事腐芍。” “怎么了试躏?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵猪勇,是天一觀的道長。 經(jīng)常有香客問我颠蕴,道長埠对,這世上最難降的妖魔是什么络断? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮项玛,結(jié)果婚禮上貌笨,老公的妹妹穿的比我還像新娘。我一直安慰自己襟沮,他們只是感情好锥惋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著开伏,像睡著了一般膀跌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上固灵,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天捅伤,我揣著相機(jī)與錄音,去河邊找鬼巫玻。 笑死丛忆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仍秤。 我是一名探鬼主播熄诡,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诗力!你這毒婦竟也來了凰浮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苇本,失蹤者是張志新(化名)和其女友劉穎袜茧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓣窄,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惫周,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了康栈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喷橙,死狀恐怖啥么,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贰逾,我是刑警寧澤悬荣,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疙剑,受9級特大地震影響氯迂,放射性物質(zhì)發(fā)生泄漏践叠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一嚼蚀、第九天 我趴在偏房一處隱蔽的房頂上張望禁灼。 院中可真熱鬧,春花似錦轿曙、人聲如沸弄捕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽守谓。三九已至,卻和暖如春您单,著一層夾襖步出監(jiān)牢的瞬間斋荞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工虐秦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留平酿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓羡疗,卻偏偏與公主長得像染服,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子叨恨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概述 java.io 包幾乎包含了所有操作輸入柳刮、輸出需要的類。所有這些流類代表了輸入源和輸出目標(biāo)痒钝。java.io ...
    Steven1997閱讀 9,194評論 1 25
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理秉颗,服務(wù)發(fā)現(xiàn),斷路器送矩,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 一蚕甥、基礎(chǔ)知識:1、JVM栋荸、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,383評論 0 4
  • 原諒我這一生不羈放縱愛自由 愛自由 愛自由 我追求的 我希望的 我迫切的 我痛恨的 我憎惡的 我唾棄的 與其庸庸碌...
    淋雨情節(jié)閱讀 140評論 0 0
  • 她還在香甜的睡著菇怀,任清側(cè)過臉,看著她晌块,眼里滿是愛意爱沟,看她的小嘴,還不時(shí)抿兩下匆背,夢見什么了呼伸?夢見在喝奶吧除了奶,她什...
    天黎琉璃閱讀 722評論 7 15