1:Java語(yǔ)言定義了許多類專門負(fù)責(zé)各種方式的輸入或者輸出才漆,這些類都被放在java.io包中。其中佛点,
所有輸入流類都是抽象類InputStream(字節(jié)輸入流)醇滥,或者抽象類Reader(字符輸入流)的子類;
而所有輸出流都是抽象類OutputStream(字節(jié)輸出流)或者Writer(字符輸出流)的子類超营。
【首先需要明白的是:流是干什么的鸳玩??演闭?(為了永久性的保存數(shù)據(jù))
? 根據(jù)數(shù)據(jù)流向的不同分為輸入流和輸出流不跟;
? 根據(jù)處理數(shù)據(jù)類型的不同分為字符流和字節(jié)流;】
【然后需要明白的是輸入模式和輸出模式是誰(shuí)流向誰(shuí):
InputStream(字節(jié)輸入流)和Reader(字符輸入流)通俗的理解都是讀(read)的船响。
OutputStream(字節(jié)輸出流)和Writer(字符輸出流)通俗的理解都是寫(writer)的躬拢。】
最后下面搞清楚各種流的類型的該怎么用,誰(shuí)包含誰(shuí)见间,理清思路聊闯。
2:InputStream類是字節(jié)輸入流的抽象類,是所有字節(jié)輸入流的父類米诉,InputStream類具有層次結(jié)構(gòu)如下圖所示菱蔬;
3:java中的字符是Unicode編碼的,是雙字節(jié)的史侣。InputStream是用來(lái)處理字節(jié)的拴泌,在處理字符文本時(shí)很不方便。Java為字符文本的輸入提供了專門的一套類Reader惊橱。Reader類是字符輸入流的抽象類蚪腐,所有字符輸入流的實(shí)現(xiàn)都是它的子類。
4:輸出流OutputStream類是字節(jié)輸入流的抽象類税朴,此抽象類表示輸出字節(jié)流的所有類的超類回季。
5:Writer類是字符輸出流的抽象類,所有字符輸出類的實(shí)現(xiàn)都是它的子類正林。
6:File類是IO包中唯一代表磁盤文件本身的對(duì)象泡一。通過(guò)File來(lái)創(chuàng)建,刪除觅廓,重命名文件鼻忠。File類對(duì)象的主要作用就是用來(lái)獲取文本本身的一些信息。如文本的所在的目錄杈绸,文件的長(zhǎng)度帖蔓,讀寫權(quán)限等等矮瘟。(有的需要記憶,比如isFile(),isDirectory(),exits();有的了解即可塑娇。使用的時(shí)候查看API)
詳細(xì)如下:
File類(File類的概述和構(gòu)造方法)
A:File類的概述
File更應(yīng)該叫做一個(gè)路徑
文件路徑或者文件夾路徑
路徑分為絕對(duì)路徑和相對(duì)路徑
? ? ? ?絕對(duì)路徑是一個(gè)固定的路徑,從盤符開(kāi)始
相對(duì)路徑相對(duì)于某個(gè)位置,在eclipse下是指當(dāng)前項(xiàng)目下,在dos下
查看API指的是當(dāng)前路徑
文件和目錄路徑名的抽象表示形式
B:構(gòu)造方法
File(String pathname):根據(jù)一個(gè)路徑得到File對(duì)象
File(String parent, String child):根據(jù)一個(gè)目錄和一個(gè)子文件/目錄得到File對(duì)象
File(File parent, String child):根據(jù)一個(gè)父File對(duì)象和一個(gè)子文件/目錄得到File對(duì)象
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)建文件夾,如果父文件夾不存在钝吮,會(huì)幫你創(chuàng)建出來(lái)
(使用createNewFile()文件創(chuàng)建的時(shí)候不加.txt或者其他后綴也是文件,不是文件夾板辽;使用mkdir()創(chuàng)建文件夾的時(shí)候奇瘦,如果起的名字是比如aaa.txt也是文件夾不是文件;)
注意事項(xiàng):
如果你創(chuàng)建文件或者文件夾忘了寫盤符路徑劲弦,那么耳标,默認(rèn)在項(xiàng)目路徑下。
File類(File類的重命名和刪除功能)
A:重命名和刪除功能
public boolean renameTo(File dest):把文件重命名為指定的文件路徑
public boolean delete():刪除文件或者文件夾
B:重命名注意事項(xiàng)
如果路徑名相同邑跪,就是改名次坡。
如果路徑名不同,就是改名并剪切画畅。
C:刪除注意事項(xiàng):
Java中的刪除不走回收站砸琅。
要?jiǎng)h除一個(gè)文件夾剖煌,請(qǐng)注意該文件夾內(nèi)不能包含文件或者文件夾
File類(File類的判斷功能)
A:判斷功能
public boolean isDirectory():判斷是否是目錄
public boolean isFile():判斷是否是文件
public boolean exists():判斷是否存在
public boolean canRead():判斷是否可讀
public boolean canWrite():判斷是否可寫
public boolean isHidden():判斷是否隱藏
File類(File類的獲取功能)
A:獲取功能
public String getAbsolutePath():獲取絕對(duì)路徑
public String getPath():獲取路徑
public String getName():獲取名稱
public long length():獲取長(zhǎng)度欧芽。字節(jié)數(shù)
public long lastModified():獲取最后一次的修改時(shí)間,毫秒值
????????????????public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數(shù)組
public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數(shù)組
File類(文件名稱過(guò)濾器的概述及使用)
A:文件名稱過(guò)濾器的概述
public String[] list(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數(shù)組
public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數(shù)組
list()獲取某個(gè)目錄下所有的文件或者文件夾:
案例演示:
獲取某種格式的文件比如獲取某種后綴的圖片媚狰,并輸出文件名:
下面演示獲取文件夾下面子目錄里面的文件獲纫А(并沒(méi)有完全獲取子目錄的子目錄等等诱篷,僅僅獲取了子一級(jí)目錄):
A:文件名稱過(guò)濾器的概述
public String[] list(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
7:下面以一些字節(jié)輸入輸出流具體的案例操作(操作的時(shí)候認(rèn)清自己使用的是字節(jié)流還是字符流):
注意:read()方法讀取的是一個(gè)字節(jié),為什么返回是int,而不是byte
字節(jié)輸入流可以操作任意類型的文件,比如圖片音頻等,這些文件底層都是以二進(jìn)制形式的存儲(chǔ)的,如果每次讀取都返回byte,有可能在讀到中間的時(shí)候遇到111111111;那么這11111111是byte類型的-1,我們的程序是遇到-1就會(huì)停止不讀了,后面的數(shù)據(jù)就讀不到了,所以在讀取的時(shí)候用int類型接收,如果11111111會(huì)在其前面補(bǔ)上雳灵;24個(gè)0湊足4個(gè)字節(jié),那么byte類型的-1就變成int類型的255了這樣可以保證整個(gè)數(shù)據(jù)讀完,而結(jié)束標(biāo)記的-1就是int類型
FileInputStream的單個(gè)字節(jié)讀茸厮:
FileOutputStream的單個(gè)字節(jié)寫入:
FileInputStream和FileOutputStream定義小數(shù)組進(jìn)行讀寫操作:(文件拷貝也是這樣。)
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會(huì)一次性從文件中讀取8192個(gè), 存在緩沖區(qū)中, 返回給程序一個(gè)
* 程序再次讀取時(shí), 就不用找文件了, 直接從緩沖區(qū)中獲取
* 直到緩沖區(qū)中所有的都被使用過(guò), 才重新從文件中讀取8192個(gè)
* C.BufferedOutputStream
* BufferedOutputStream也內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組)
* 程序向流中寫出字節(jié)時(shí), 不會(huì)直接寫到文件, 先寫到緩沖區(qū)中
* 直到緩沖區(qū)寫滿, BufferedOutputStream才會(huì)把緩沖區(qū)中的數(shù)據(jù)一次性寫到文件里
面試題:小數(shù)組的讀寫和帶Buffered的讀取哪個(gè)更快?
* 定義小數(shù)組如果是8192個(gè)字節(jié)大小和Buffered比較的話
* 定義小數(shù)組會(huì)略勝一籌,因?yàn)樽x和寫操作的是同一個(gè)數(shù)組
* 而Buffered操作的是兩個(gè)數(shù)組
IO流(flush和close方法的區(qū)別)
flush()方法: 用來(lái)刷新緩沖區(qū)的,刷新后可以再次寫出(字節(jié)緩沖流內(nèi)置緩沖區(qū)岛啸,如果沒(méi)有讀取出來(lái),可以使用flush()刷新來(lái))
close()方法:用來(lái)關(guān)閉流釋放資源的的,如果是帶緩沖區(qū)的流對(duì)象的close()方法,不但會(huì)關(guān)閉流,還會(huì)再關(guān)閉流之前刷新緩沖區(qū),關(guān)閉后不能再寫出
8:字符流FileReader和FileWriter
字符流是什么
* 字符流是可以直接讀寫字符的IO流
* 字符流讀取字符, 就要先讀取到字節(jié)數(shù)據(jù), 然后轉(zhuǎn)為字符. 如果要寫出字符, 需要把字符轉(zhuǎn)為字節(jié)再寫出.
IO流(什么情況下使用字符流)
* 字符流也可以拷貝文本文件, 但不推薦使用. 因?yàn)樽x取時(shí)會(huì)把字節(jié)轉(zhuǎn)為字符, 寫出時(shí)還要把字符轉(zhuǎn)回字節(jié).
* 程序需要讀取一段文本, 或者需要寫出一段文本的時(shí)候可以使用字符流
* 讀取的時(shí)候是按照字符的大小讀取的,不會(huì)出現(xiàn)半個(gè)中文
* 寫出的時(shí)候可以直接將字符串寫出,不用轉(zhuǎn)換為字節(jié)數(shù)組
IO流(字符流是否可以拷貝非純文本的文件)
* 不可以拷貝非純文本的文件
* 因?yàn)樵谧x的時(shí)候會(huì)將字節(jié)轉(zhuǎn)換為字符,在轉(zhuǎn)換過(guò)程中,可能找不到對(duì)應(yīng)的字符,就會(huì)用?代替,寫出的時(shí)候會(huì)將字符轉(zhuǎn)換成字節(jié)寫出去
* 如果是?,直接寫出,這樣寫出之后的文件就亂了,看不了了
一些面試題鏈接: