![傳智播客java-day18-day21.IO_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/af2215be-6dcd-4067-9b99-204d035a2366/af2215be-6dcd-4067-9b99-204d035a23661.gif)
![傳智播客java-day18-day21.IO_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/af2215be-6dcd-4067-9b99-204d035a2366/af2215be-6dcd-4067-9b99-204d035a23662.gif)
![傳智播客java-day18-day21.IO_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/af2215be-6dcd-4067-9b99-204d035a2366/af2215be-6dcd-4067-9b99-204d035a23663.gif)
![傳智播客java-day18-day21.IO_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/af2215be-6dcd-4067-9b99-204d035a2366/af2215be-6dcd-4067-9b99-204d035a23664.gif)
![傳智播客java-day18-day21.IO_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/af2215be-6dcd-4067-9b99-204d035a2366/af2215be-6dcd-4067-9b99-204d035a23665.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、傳智播客課程文檔 1. File類1.1. File類說(shuō)明存儲(chǔ)在變量,數(shù)組和對(duì)象中的數(shù)據(jù)是暫時(shí)的,當(dāng)程序終止時(shí)他們就會(huì)丟失.為了能夠永久的保存程序中創(chuàng)建的數(shù)據(jù),需要將他們存儲(chǔ)到硬盤(pán)或光盤(pán)的文件中.這些文件可以移動(dòng),傳送,亦可以被其他程序使用.由于數(shù)據(jù)存儲(chǔ)在文件中,所以我們需要學(xué)習(xí)一個(gè)和文件有密切關(guān)系的類,叫做File類,將要掌握獲取文件的屬性以及刪除和重命名文件.最終如何向文件中寫(xiě)入數(shù)據(jù)和從文件中讀取數(shù)據(jù).那么File類關(guān)心的是在磁盤(pán)上文件的存儲(chǔ).File類描述的是一個(gè)文件或文件夾。(文件夾也可以稱為目錄)該類的出現(xiàn)是對(duì)文件系統(tǒng)的中的文件以及文件夾進(jìn)行對(duì)象的封裝??梢酝ㄟ^(guò)對(duì)象的思想來(lái)操作文件以
2、及文件夾。可以用面向?qū)ο蟮奶幚韱?wèn)題,通過(guò)該對(duì)象的方法,可以得到文件或文件夾的信息方便了對(duì)文件與文件夾的屬性信息進(jìn)行操作。文件包含很多的信息:如文件名、創(chuàng)建修改時(shí)間、大小、可讀可寫(xiě)屬性等。1.2. 體驗(yàn)File類檢驗(yàn)指定路徑下是否存在指定的目錄或者文件./ 檢驗(yàn)指定路徑下是否存在指定的目錄或者文件.File file = new File("c:a.txt");System.out.println(file.exists();/ File對(duì)象是否是目錄System.out.println(file.isDirectory();/ 對(duì)象是否是文件 System.out.prin
3、tln(file.isFile();結(jié)論:File對(duì)象也可以表示不存在的文件。其實(shí)代表了一個(gè)抽象路徑構(gòu)建一個(gè)File類的實(shí)例并不會(huì)在機(jī)器上創(chuàng)建一個(gè)文件.不管文件是否存在都可以創(chuàng)建任意文件名的File實(shí)例,可以調(diào)用File實(shí)例的exists方法判斷文件或目錄是否存在1.3. 構(gòu)造一個(gè)File類實(shí)例:new File(String pathname); 通過(guò)將給定路徑來(lái)創(chuàng)建一個(gè)新File實(shí)例。new File(String parent, String child); 根據(jù)parent路徑名字符串和child路徑名創(chuàng)建一個(gè)新File實(shí)例。 parent是指上級(jí)目錄的路徑,完整的路徑為parent+
4、child.new File(File parent, String child); 根據(jù)parent抽象路徑名和child路徑名創(chuàng)建一個(gè)新File實(shí)例。 parent是指上級(jí)目錄的路徑,完整的路徑為parent.getPath()+child.說(shuō)明:如果指定的路徑不存在(沒(méi)有這個(gè)文件或是文件夾),不會(huì)拋異常,這時(shí)file.exists()返回false。新建File對(duì)象File file=new File();public static void main(String args) File file = new File();1:創(chuàng)建File對(duì)象需要導(dǎo)包, import java.io.F
5、ile 2:File對(duì)象沒(méi)有無(wú)參數(shù)構(gòu)造.創(chuàng)建對(duì)象需要傳參.根據(jù)API文檔提示,傳入一個(gè)文件的字符串路徑. String path="c:/a.txt"(a.txt 文件在c盤(pán)下已經(jīng)存在)/file 是一個(gè)文件對(duì)象String path = "c:/a.txt"File file = new File(path);File類的對(duì)象,既可以代表文件也可以代表文件夾。 public static void main(String args) /file 是一個(gè)文件夾String path = "c:/test"File file = new
6、 File(path);1.4. 路徑:路徑就是文件或文件夾所在的位置。1.4.1. 路徑分割符:上下級(jí)文件夾之間使用分隔符分開(kāi):在Windows中分隔符為'',在Unix/Linux中分隔符為'/'??缙脚_(tái)的目錄分隔符更專業(yè)的做法是使用File.separatorChar,這個(gè)值就會(huì)根據(jù)系統(tǒng)得到的相應(yīng)的分割符。例:new File("c:" + File.separatorChar + "a.txt");注意,如果是使用"",則需要進(jìn)行轉(zhuǎn)義,寫(xiě)為""才可以,如果是兩個(gè)"&
7、quot;,則寫(xiě)為""。實(shí)驗(yàn):在以下代碼的path處寫(xiě)不同的路徑試一下,并觀察輸出結(jié)果。File file = new File(path);System.out.println(file.getAbsolutePath();1.4.2. 絕對(duì)路徑與相對(duì)路徑:對(duì)于UNIX平臺(tái),絕對(duì)路徑名的前綴是"/"。相對(duì)路徑名沒(méi)有前綴。對(duì)于Windows平臺(tái),絕對(duì)路徑名的前綴由驅(qū)動(dòng)器號(hào)和一個(gè)":"組成,例"c:."。相對(duì)路徑?jīng)]有盤(pán)符前綴。相對(duì)路徑:相對(duì)路徑是指相對(duì)于某位置的路徑,是指相對(duì)于當(dāng)前目錄。在執(zhí)行Java程序時(shí),相對(duì)路徑
8、為執(zhí)行java命令時(shí)當(dāng)前所在的目錄。實(shí)驗(yàn):在不同的路徑下執(zhí)行java命令運(yùn)行以下程序,并觀察輸出結(jié)果。File file = new File("a.txt");System.out.println(file.getAbsolutePath(); 一般在使用時(shí),建議用絕對(duì)路徑,因?yàn)橄鄬?duì)路徑容易出問(wèn)題,不好確定到底在什么地方。/相對(duì)路徑/File file = new File("src/a.txt");1.5. File類中常用的方法:創(chuàng)建:createNewFile()在指定位置創(chuàng)建一個(gè)空文件,成功就返回true,如果已存在就不創(chuàng)建然后返回falsem
9、kdir()在指定位置創(chuàng)建目錄,這只會(huì)創(chuàng)建最后一級(jí)目錄,如果上級(jí)目錄不存在就拋異常。mkdirs()在指定位置創(chuàng)建目錄,這會(huì)創(chuàng)建路徑中所有不存在的目錄。renameTo(File dest)重命名文件或文件夾,也可以操作非空的文件夾,文件不同時(shí)相當(dāng)于文件的剪切,剪切時(shí)候不能操作非空的文件夾。移動(dòng)/重命名成功則返回true,失敗則返回false。刪除:delete()刪除文件或一個(gè)空文件夾,如果是文件夾且不為空,則不能刪除,成功返回true,失敗返回false。deleteOnExit()在虛擬機(jī)終止時(shí),請(qǐng)求刪除此抽象路徑名表示的文件或目錄,保證程序異常時(shí)創(chuàng)建的臨時(shí)文件也可以被刪除判斷:exis
10、ts()文件或文件夾是否存在。isFile()是否是一個(gè)文件,如果不存在,則始終為false。isDirectory()是否是一個(gè)目錄,如果不存在,則始終為false。isHidden()是否是一個(gè)隱藏的文件或是否是隱藏的目錄。isAbsolute()測(cè)試此抽象路徑名是否為絕對(duì)路徑名。獲?。篻etName()獲取文件或文件夾的名稱,不包含上級(jí)路徑。getPath() 返回絕對(duì)路徑,可以是相對(duì)路徑,但是目錄要指定getAbsolutePath()獲取文件的絕對(duì)路徑,與文件是否存在沒(méi)關(guān)系length()獲取文件的大?。ㄗ止?jié)數(shù)),如果文件不存在則返回0L,如果是文件夾也返回0L。getParent(
11、)返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒(méi)有指定父目錄,則返回null。lastModified()獲取最后一次被修改的時(shí)間。文件夾相關(guān):staic File listRoots()列出所有的根目錄(Window中就是所有系統(tǒng)的盤(pán)符)list()返回目錄下的文件或者目錄名,包含隱藏文件。對(duì)于文件這樣操作會(huì)返回null。list(FilenameFilter filter)返回指定當(dāng)前目錄中符合過(guò)濾條件的子文件或子目錄。對(duì)于文件這樣操作會(huì)返回null。listFiles()返回目錄下的文件或者目錄對(duì)象(File類實(shí)例),包含隱藏文件。對(duì)于文件這樣操作會(huì)返回null。listFiles
12、(FilenameFilter filter)返回指定當(dāng)前目錄中符合過(guò)濾條件的子文件或子目錄。對(duì)于文件這樣操作會(huì)返回null。1.6. 案例:1,列出指定目錄中所有的子文件名與所有的子目錄名。2,列出指定目錄中所有的子文件名與所有的子目錄名,要求目錄名與文件名分開(kāi)列出,格式如下:子目錄:.子文件:.3,列出指定目錄中所有擴(kuò)展名為.java的文件。4,列出指定目錄中所有擴(kuò)展名為.class的文件。5,思考第3與第4題,代碼是不是重復(fù)呢,如果想要列出其中的所有.txt文件,是不是要再寫(xiě)一個(gè)類呢?a, 請(qǐng)自行設(shè)計(jì)一個(gè)工具方法,可以傳遞指定的擴(kuò)展名,工具方法會(huì)過(guò)列出指定目錄中指定擴(kuò)展名的所有子文件與子
13、文件夾。b, 請(qǐng)利用FilenameFilter接口寫(xiě)一個(gè)工具類,可以傳遞指定的過(guò)濾規(guī)則。6,列出指定目錄中所有的子孫文件與子孫目錄名,只需要列出名稱即可。解題: 列出指定目錄中所有的子文件名與所有的子目錄名。需求1:獲取所有的c:/test 即test目錄下的所有文件和文件夾解題思路: 代碼需要封裝,就需要?jiǎng)?chuàng)建方法,并在main方法中調(diào)用和測(cè)試. 方法名要有意義: listAllFilesAndDirs第一步:創(chuàng)建File對(duì)象第二步:查找File類中可用的方法,想要獲取該目錄下的所有子文件和子目錄 第三步:顯示這些文件和文件夾的名稱實(shí)現(xiàn):/* * 列出指定目錄中所有包含的子文件與子目錄 */
14、public static void listAllFilesAndDirs(String path) / 1.創(chuàng)建File對(duì)象,表示這個(gè)目錄File dir = new File(path);/ 2.通過(guò)list方法得到所包含的所有子目錄與子文件名稱String names = dir.list();/ 3顯示這些名稱for (int i = 0; i < names.length; i+) System.out.println(namesi);解題: 列出指定目錄中所有的子文件名與所有的子目錄名,要求目錄名與文件名分開(kāi)列出案例1把文件和文件夾都列了出來(lái),但是無(wú)法區(qū)分文件和文件夾.Fi
15、le類有判斷文件和文件夾的方法,但是list方法返回的是String數(shù)組,這個(gè)list() 方法無(wú)法滿足我們的需求.繼續(xù)查找File的方法.查看api找到 File listFiles() 發(fā)現(xiàn)該方法返回的是一個(gè)File數(shù)組。思路:第一步:創(chuàng)建listAllFilesAndDirs(String path)方法,接受路徑第二步: 創(chuàng)建File對(duì)象表示這個(gè)目錄第三步: 通過(guò)listFiles方法得到所包含的所有子目錄與子文件名稱第四步: 得到所有的文件名集合,與所有的文件夾名集合第五步: 分別顯示文件名與文件夾名實(shí)現(xiàn)public static void listAllFilesAndDirs2(
16、String path) / 1.創(chuàng)建File對(duì)象,表示這個(gè)目錄File dir = new File(path);/ 2通過(guò)listFiles方法得到所包含的所有子目錄與子文件名稱File names = dir.listFiles();/ 3,分別顯示文件名與文件夾名for (int i = 0; i < names.length; i+) File file = namesi;if (file.isFile() System.out.println("子文件:");System.out.println("t" + file.getName()
17、; else if (file.isDirectory() System.out.println("子目錄:");System.out.println("t" + file.getName();實(shí)現(xiàn)二:public static void listAllFilesAndDirs(String path) /1創(chuàng)建File對(duì)象表示這個(gè)目錄File dir = new File(path);/2通過(guò)listFiles方法得到所包含的所有子目錄與子文件名稱File names = dir.listFiles();/3,得到所有的文件名集合,與所有的文件夾名集合
18、List<File> filesList = new ArrayList<File>();List<File> dirsList = new ArrayList<File>();for (int i = 0; i < names.length; i+) File file = namesi;if (file.isFile() filesList.add(file); else if (file.isDirectory() dirsList.add(file);/4,分別顯示文件名與文件夾名System.out.println("子
19、文件:");for (int i = 0; i < filesList.size(); i+) System.out.println("t" + filesList.get(i).getName();System.out.println("子目錄:");for (int i = 0; i < dirsList.size(); i+) System.out.println("t" + dirsList.get(i).getName();練習(xí)3,列出指定目錄中所有擴(kuò)展名為.java的文件。需求: 從指定目錄中找到指定
20、擴(kuò)展名的文件,并列出來(lái)思路 第一步: 創(chuàng)建lsitAllFiles方法,接受路徑和文件后綴名第二步: 獲取所有的子文件和子文件夾第三步: 從中找出符合條件的文件并顯示出來(lái)注意:不同系統(tǒng)對(duì)于路徑的 windows系統(tǒng)使用斜線作為路徑分隔符 "" linux 系統(tǒng)使用反斜線作為路徑分隔符"/"java是跨平臺(tái)的語(yǔ)言,java程序如果部署到linux系統(tǒng)上,如果程序中有File對(duì)象, 可以使用File類separatorChar (字段)public class FileTest2 public static void main(String args) St
21、ring path = "c:" + File.separatorChar + "test"File file = new File(path);listtAllFiles(file, "java");/* * 從指定目錄中找到指定擴(kuò)展名的文件,并列出來(lái) * */public static void listtAllFiles(File dir, String extension) / 1.獲取所有的子文件和子文件夾File files = dir.listFiles();/ 2.從中找出符合條件的文件并顯示出來(lái)for (int i
22、= 0; i < files.length; i+) File file = filesi;/ 3.需要以指定文件后綴結(jié)尾才算符合條件if (file.getName().endsWith(extension) System.out.println(file.getName();練習(xí)4:public class FileTest2 public static void main(String args) String path = "c:" + File.separatorChar + "test"File file = new File(path
23、);listtAllFiles2(file, "txt");/* * FilenameFilter接口寫(xiě)一個(gè)工具類,可以傳遞指定的過(guò)濾規(guī)則。 * 從指定目錄中找到指定擴(kuò)展名的文件,并列出來(lái) * * */public static void listtAllFiles2(File dir, String name) / 1.獲取所有的子文件和子文件夾String files = dir.list(new DirFilter("txt");/ 2顯示名稱for (int i = 0; i < files.length; i+) System.out.p
24、rintln(filesi);class DirFilter implements FilenameFilter private String extension;public DirFilter() public DirFilter(String extension) this.extension = extension;Overridepublic boolean accept(File dir, String name) return name.endsWith(extension);注意: DirFilter 就是實(shí)現(xiàn)了accept 方法.提供給File類的list方法使用.2. IO
25、流體驗(yàn)與簡(jiǎn)介File對(duì)象可以表示存在的文件或文件夾,也可以表示不存在的。我們想要得到文件的內(nèi)容怎么辦,F(xiàn)ile只是操作文件,文件的內(nèi)容如何處理就需要使用io流技術(shù)了。例如在C盤(pán)下有一個(gè)名稱為a.txt的文本文件.想要通過(guò)Java程序讀出來(lái)文件中的內(nèi)容,需要使用IO流技術(shù).同樣想要將程序中的數(shù)據(jù),保存到硬盤(pán)的文件中,也需要IO流技術(shù).讀和寫(xiě)文件文件示例:public class IoTest public static void main(String args) throws FileNotFoundException,IOException writFileTest();readFileTe
26、st();private static void writFileTest() throws FileNotFoundException,IOException / 創(chuàng)建文件對(duì)象File file = new File("c:a.txt");/ 創(chuàng)建文件輸出流FileOutputStream fos = new FileOutputStream(file);fos.write('g');fos.write('z');fos.write('i');fos.write('t');fos.write('c
27、39;);fos.write('a');fos.write('s');fos.write('t');fos.close();private static void readFileTest() throws FileNotFoundException,IOException / 創(chuàng)建文件對(duì)象File file = new File("c:a.txt");/ 創(chuàng)建文件輸入流FileInputStream fis = new FileInputStream(file);/ 有對(duì)多長(zhǎng),就讀多少字節(jié)。for (int i = 0; i
28、 < file.length(); i+) System.out.print(char) fis.read();fis.close();當(dāng)完成流的讀寫(xiě)時(shí),應(yīng)該通過(guò)調(diào)用close方法來(lái)關(guān)閉它,這個(gè)方法會(huì)釋放掉十分有限的操作系統(tǒng)資源.如果一個(gè)應(yīng)用程序打開(kāi)了過(guò)多的流而沒(méi)有關(guān)閉它們,那么系統(tǒng)資源將被耗盡.IO流簡(jiǎn)介:(Input/Output)I/O類庫(kù)中使用“流”這個(gè)抽象概念。Java對(duì)設(shè)備中數(shù)據(jù)的操作是通過(guò)流的方式。表示任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源對(duì)象,或者是有能力接受數(shù)據(jù)的接收端對(duì)象?!傲鳌逼帘瘟藢?shí)際的I/O設(shè)備中處理數(shù)據(jù)的細(xì)節(jié)。IO流用來(lái)處理設(shè)備之間的數(shù)據(jù)傳輸。設(shè)備是指硬盤(pán)、內(nèi)存、鍵盤(pán)錄入
29、、網(wǎng)絡(luò)等。Java用于操作流的對(duì)象都在IO包中。IO流技術(shù)主要用來(lái)處理設(shè)備之間的數(shù)據(jù)傳輸。由于Java用于操作流的對(duì)象都在IO包中。所以使用IO流需要導(dǎo)包如:import java.io.*;IO流的分類流按操作數(shù)據(jù)類型的不同分為兩種:字節(jié)流與字符流。流按流向分為:輸入流,輸出流(以程序?yàn)閰⒄瘴?,輸入到程序,或是從程序輸出?. 字節(jié)流什么是字節(jié)流 計(jì)算機(jī)中都是二進(jìn)制數(shù)據(jù),一個(gè)字節(jié)是8個(gè)2進(jìn)制位.字節(jié)可以表示所有的數(shù)據(jù),比如文本,音頻,視頻.圖片,都是作為字節(jié)存在的.也就是說(shuō)字節(jié)流處理的數(shù)據(jù)非常多。在文本文件中存儲(chǔ)的數(shù)據(jù)是以我們能讀懂的方式表示的。而在二進(jìn)制文件中存儲(chǔ)的數(shù)據(jù)是用二進(jìn)制形式表示的
30、。我們是讀不懂二進(jìn)制文件的,因?yàn)槎M(jìn)制文件是為了讓程序來(lái)讀取而設(shè)計(jì)的。例如,Java的源程序(.java源文件)存儲(chǔ)在文本文件中,可以使用文本編輯器閱讀,但是Java的類(字節(jié)碼文件)存儲(chǔ)在二進(jìn)制文件中,可以被Java虛擬機(jī)閱讀。二進(jìn)制文件的優(yōu)勢(shì)在于它的處理效率比文本文件高。我們已經(jīng)知道File對(duì)象封裝的是文件或者路徑屬性,但是不包含向(從)文件讀(寫(xiě))數(shù)據(jù)的方法。為了實(shí)現(xiàn)對(duì)文件的讀和寫(xiě)操作需要學(xué)會(huì)正確的使用Java的IO創(chuàng)建對(duì)象。字節(jié)流的抽象基類:輸入流:java.io.InputStream輸出流:java.io.OutputStream特點(diǎn):字節(jié)流的抽象基類派生出來(lái)的子類名稱都是以其父類
31、名作為子類名的后綴。如:FileInputStream, ByteArrayInputStream等。說(shuō)明:字節(jié)流處理的單元是一個(gè)字節(jié),用于操作二進(jìn)制文件(計(jì)算機(jī)中所有文件都是二進(jìn)制文件)3.1. InputStream案例:讀取"c:/a.txt"文件中的所有內(nèi)容并在控制臺(tái)顯示出來(lái)。注意:事先準(zhǔn)備一個(gè)a.txt并放到c:/下,不要保存中文。a, 使用read()方法實(shí)現(xiàn)。b, 使用int read(byte b)方法實(shí)現(xiàn)。寫(xiě)代碼讀取"c:/a.txt"文件中的所有的內(nèi)容并在控制臺(tái)顯示出來(lái)實(shí)現(xiàn):查看api文檔(自己一定要?jiǎng)邮?InputStream 有r
32、ead方法,一次讀取一個(gè)字節(jié),OutputStream的write方法一次寫(xiě)一個(gè)int。發(fā)現(xiàn)這兩個(gè)類都是抽象類。意味著不能創(chuàng)建對(duì)象,那么需要找到具體的子類來(lái)使用。通過(guò)查看api文檔,找到了FileInputStream類,該類正是我們體驗(yàn)Io流的一個(gè)輸入流。實(shí)現(xiàn);顯示指定文件內(nèi)容。明確使用流,使用哪一類流?使用輸入流,F(xiàn)ileInputStream第一步:1:打開(kāi)流(即創(chuàng)建流)第二步:2:通過(guò)流讀取內(nèi)容第三步:3:用完后,關(guān)閉流資源顯然流是Java中的一類對(duì)象,要打開(kāi)流其實(shí)就是創(chuàng)建具體流的對(duì)象,由于是讀取硬盤(pán)上的文件,應(yīng)該使用輸入流。所以找到了InputStream類,但是InputStrea
33、m是抽象類,需要使用它的具體實(shí)現(xiàn)類來(lái)創(chuàng)建對(duì)象就是FileInputStream。通過(guò)new 調(diào)用FileInputStream 的構(gòu)造方法來(lái)創(chuàng)建對(duì)象。發(fā)現(xiàn)FileInputStream的構(gòu)造方法需要指定文件的來(lái)源。查看構(gòu)造方法,可以接受字符串也可以接受File對(duì)象。我們通過(guò)構(gòu)建File對(duì)象指定文件路徑。使用流就像使用水管一樣,要打開(kāi)就要關(guān)閉。所以打開(kāi)流和關(guān)閉流的動(dòng)作是比不可少的。如何關(guān)閉流?使用close方法即可,當(dāng)完成流的讀寫(xiě)時(shí),應(yīng)該通過(guò)調(diào)用close方法來(lái)關(guān)閉它,這個(gè)方法會(huì)釋放掉十分有限的操作系統(tǒng)資源.如果一個(gè)應(yīng)用程序打開(kāi)了過(guò)多的流而沒(méi)有關(guān)閉它們,那么系統(tǒng)資源將被耗盡.如何通過(guò)流讀取內(nèi)容?
34、查找api文檔通過(guò)read方法,查看該方法,發(fā)現(xiàn)有返回值,并且是int類型的,該方法一次讀取一個(gè)字節(jié)(byte)3.1.1. 輸入流讀取方式1:read方法()一次讀取一個(gè)字節(jié),讀到文件末尾返回-1.仔細(xì)查看api文檔發(fā)現(xiàn)read方法如果讀到文件的末尾會(huì)返回-1。那么就可以通過(guò)read方法的返回值是否是-1來(lái)控制我們的循環(huán)讀取。/* * 根據(jù)read方法返回值的特性,如果獨(dú)到文件的末尾返回-1,如果不為-1就繼續(xù)向下讀。 * */private static void showContent(String path) throws IOException / 打開(kāi)流FileInputStrea
35、m fis = new FileInputStream(path);int len = fis.read();while (len != -1) System.out.print(char)len);len = fis.read();/ 使用完關(guān)閉流fis.close();我們習(xí)慣這樣寫(xiě):/* * 根據(jù)read方法返回值的特性,如果獨(dú)到文件的末尾返回-1,如果不為-1就繼續(xù)向下讀。 * */private static void showContent(String path) throws IOException / 打開(kāi)流FileInputStream fis = new FileInpu
36、tStream(path);int len;while (len = fis.read() != -1) System.out.print(char) len);/ 使用完關(guān)閉流fis.close();3.1.2. 輸入流讀取方式2:使用read(byte b) 方法。使用緩沖區(qū)(關(guān)鍵是緩沖區(qū)大小的確定)使用read方法的時(shí)候,流需要讀一次就處理一次,可以將讀到的數(shù)據(jù)裝入到字節(jié)數(shù)組中,一次性的操作數(shù)組,可以提高效率。問(wèn)題1:緩沖區(qū)大小那么字節(jié)數(shù)組如何定義?定義多大?可以嘗試初始化長(zhǎng)度為5的byte數(shù)組。通過(guò)read方法,往byte數(shù)組中存內(nèi)容那么該read方法返回的是往數(shù)組中存了多少字節(jié)。/*
37、 * 使用字節(jié)數(shù)組存儲(chǔ)讀到的數(shù)據(jù) * */private static void showContent2(String path) throws IOException / 打開(kāi)流FileInputStream fis = new FileInputStream(path);/ 通過(guò)流讀取內(nèi)容byte byt = new byte5;int len = fis.read(byt);for (int i = 0; i < byt.length; i+) System.out.print(char) byti);/ 使用完關(guān)閉流fis.close();問(wèn)題1: 緩沖區(qū)太小:數(shù)據(jù)讀取不完.測(cè)
38、試發(fā)現(xiàn)問(wèn)題,由于數(shù)組太小,只裝了5個(gè)字節(jié)。而文本的字節(jié)大于數(shù)組的長(zhǎng)度。那么很顯然可以將數(shù)組的長(zhǎng)度定義大一些。例如1024個(gè)。/* * 使用字節(jié)數(shù)組存儲(chǔ)讀到的數(shù)據(jù) * */private static void showContent2(String path) throws IOException / 打開(kāi)流FileInputStream fis = new FileInputStream(path);/ 通過(guò)流讀取內(nèi)容byte byt = new byte1024;int len = fis.read(byt);for (int i = 0; i < byt.length; i+) S
39、ystem.out.print(byti);/ 使用完關(guān)閉流fis.close();問(wèn)題三:緩沖區(qū)有默認(rèn)值.測(cè)試,打印的效果打印出了很多0,因?yàn)閿?shù)組數(shù)組有默認(rèn)初始化值,所以,我們將數(shù)組的數(shù)據(jù)全部都遍歷和出來(lái).現(xiàn)在需要的是取出數(shù)組中的部分?jǐn)?shù)據(jù).需要將循環(huán)條件修改仔細(xì)查看api文檔。發(fā)現(xiàn)該方法read(byte b)返回的是往數(shù)組中存入了多少個(gè)字節(jié)。就是數(shù)組實(shí)際存儲(chǔ)的數(shù)據(jù)個(gè)數(shù)。/* * 使用字節(jié)數(shù)組存儲(chǔ)讀到的數(shù)據(jù) * */private static void showContent2(String path) throws IOException / 打開(kāi)流FileInputStream fis
40、 = new FileInputStream(path);/ 通過(guò)流讀取內(nèi)容byte byt = new byte1024;int len = fis.read(byt);for (int i = 0; i <len; i+) System.out.print(byti);/ 使用完關(guān)閉流fis.close();總結(jié):?jiǎn)栴}一:為什么打印的不是字母而是數(shù)字, 是字母對(duì)應(yīng)的碼值。 如何顯示字符,強(qiáng)轉(zhuǎn)為char即可問(wèn)題二:注意:回車(chē)和換行的問(wèn)題。 windows的換車(chē)和換行是"rn" 對(duì)應(yīng)碼表是13和10 。3.1.3. 輸入流讀取方式3:使用read(byte b,int
41、 off,int len)查看api文檔,b顯然是一個(gè)byte類型數(shù)組,當(dāng)做容器來(lái)使用off,是指定從數(shù)組的什么位置開(kāi)始存字節(jié)len,希望讀多少個(gè)其實(shí)就是把數(shù)組的一部分當(dāng)做流的容器來(lái)使用。告訴容器,從什么地方開(kāi)始裝要裝多少。/* * 把數(shù)組的一部分當(dāng)做流的容器來(lái)使用 * read(byte b,int off,int len) */private static void showContent3(String path) throws IOException / 打開(kāi)流FileInputStream fis = new FileInputStream(path);/ 通過(guò)流讀取內(nèi)容byte b
42、yt = new byte1024;/ 從什么地方開(kāi)始存讀到的數(shù)據(jù)int start = 5;/ 希望最多讀多少個(gè)(如果是流的末尾,流中沒(méi)有足夠數(shù)據(jù))int maxLen = 6;/ 實(shí)際存放了多少個(gè)int len = fis.read(byt, start, maxLen);for (int i = start; i < start + maxLen; i+) System.out.print(char) byti);/ 使用完關(guān)閉流fis.close();需求2:測(cè)試skip方法通過(guò)Io流,讀取"c:/a.txt"文件中的第9個(gè)字節(jié)到最后所有的內(nèi)容并在控制臺(tái)顯示出
43、來(lái)。分析:其實(shí)就是要跳過(guò)文件中的一部分字節(jié),需要查找API文檔??梢允褂胹kip方法skip(long n),參數(shù)跟的是要跳過(guò)的字節(jié)數(shù)。我們要從第9個(gè)開(kāi)始讀,那么要跳過(guò)前8個(gè)即可。/* * skip方法 * * */private static void showContent4(String path) throws IOException / 打開(kāi)流FileInputStream fis = new FileInputStream(path);/ 通過(guò)流讀取內(nèi)容byte byt = new byte1024;fis.skip(8);int len = fis.read(byt);Syste
44、m.out.println(len);System.out.println("*");for (int i = 0; i < len; i+) System.out.println(char) byti);/ 使用完關(guān)閉流fis.close();3.1.4. 輸入流讀取方式4:使用緩沖(提高效率),并循環(huán)讀取(讀完所有內(nèi)容).總結(jié):讀完文件的所有內(nèi)容。很顯然可以使用普通的read方法,一次讀一個(gè)字節(jié)直到讀到文件末尾。為了提高效率可以使用read(byte byt);方法就是所謂的使用緩沖提高效率。我們可以讀取大文本數(shù)據(jù)測(cè)試(大于1K的文本文件.)/* * 使用字節(jié)數(shù)組
45、當(dāng)緩沖 * */private static void showContent5(String path) throws IOException FileInputStream fis = new FileInputStream(path);byte byt = new byte1024;int len = fis.read(byt);System.out.println(len);String buffer = new String(byt, 0, len);System.out.print(buffer);注意:如何將字節(jié)數(shù)組轉(zhuǎn)成字符串? 可以通過(guò)創(chuàng)建字符串對(duì)象即可。發(fā)現(xiàn):一旦數(shù)據(jù)超過(guò)10
46、24個(gè)字節(jié),數(shù)組就存儲(chǔ)不下。如何將文件的剩余內(nèi)容讀完?我們可以通過(guò)通過(guò)循環(huán)保證文件讀取完。/* * 使用字節(jié)數(shù)組當(dāng)緩沖 * */private static void showContent7(String path) throws IOException FileInputStream fis = new FileInputStream(path);byte byt = new byte1024;int len = 0;while (len = fis.read(byt) != -1) System.out.println(new String(byt, 0, len);3.2. Outpu
47、tStream字節(jié)輸出流案例:1,寫(xiě)代碼實(shí)現(xiàn)把"Hello World!"寫(xiě)到"c:/a.txt"文件中。a, c:/a.txt不存在時(shí),測(cè)試一下。b, c:/a.txt存在時(shí),也測(cè)試一下。要寫(xiě)兩個(gè)版本:a, 使用write(int b) 實(shí)現(xiàn)。b, 使用write(byte b) 實(shí)現(xiàn)。2,在已存在的c:/a.txt文本文件中追加內(nèi)容:“Java IO”。顯然此時(shí)需要向指定文件中寫(xiě)入數(shù)據(jù)。使用的就是可以操作文件的字節(jié)流對(duì)象。OutputStream。該類是抽象類,需要使用具體的實(shí)現(xiàn)類來(lái)創(chuàng)建對(duì)象查看API文檔,找到了OutputStream的實(shí)現(xiàn)類Fil
48、eOutputStream 創(chuàng)建FileOutputStream 流對(duì)象,必須指定數(shù)據(jù)要存放的目的地。通過(guò)構(gòu)造函數(shù)的形式。創(chuàng)建流對(duì)象時(shí),調(diào)用了系統(tǒng)底層的資源。在指定位置建立了數(shù)據(jù)存放的目的文件。流程:1:打開(kāi)文件輸出流,流的目的地是指定的文件2:通過(guò)流向文件寫(xiě)數(shù)據(jù)3: 用完流后關(guān)閉流3.2.1. 輸出流寫(xiě)出方式1:使用write(int b)方法,一次寫(xiě)出一個(gè)字節(jié).在C盤(pán)下創(chuàng)建a.txt文本文件import java.io.FileOutputStream;import java.io.IOException;public class IoTest2 public static void ma
49、in(String args) throws IOException String path = "c:a.txt"writeTxtFile(path);private static void writeTxtFile(String path) throws IOException / 1:打開(kāi)文件輸出流,流的目的地是指定的文件FileOutputStream fos = new FileOutputStream(path);/ 2:通過(guò)流向文件寫(xiě)數(shù)據(jù)fos.write('j');fos.write('a');fos.write('v
50、');fos.write('a');/ 3:用完流后關(guān)閉流fos.close();當(dāng)c盤(pán)下的a.txt不存在會(huì)怎么樣?測(cè)試:將c盤(pán)下的a.txt文件刪除,發(fā)現(xiàn)當(dāng)文件不存在時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè),但是創(chuàng)建不了多級(jí)目錄。注意:使用write(int b)方法,雖然接收的是int類型參數(shù),但是write 的常規(guī)協(xié)定是:向輸出流寫(xiě)入一個(gè)字節(jié)。要寫(xiě)入的字節(jié)是參數(shù) b 的八個(gè)低位。b 的 24 個(gè)高位將被忽略。3.2.2. 輸出流寫(xiě)出方式2:使用write(byte b),就是使用緩沖.提高效率.上述案例中的使用了OutputStram 的write方法,一次只能寫(xiě)一個(gè)字節(jié)。成功的向文
51、件中寫(xiě)入了內(nèi)容。但是并不高效,如和提高效率呢?是否應(yīng)該使用緩沖,根據(jù)字節(jié)輸入流的緩沖原理,是否可以將數(shù)據(jù)保存中字節(jié)數(shù)組中。通過(guò)操作字節(jié)數(shù)組來(lái)提高效率。查找API文檔,在OutputStram類中找到了write(byte b)方法,將 b.length 個(gè)字節(jié)從指定的 byte 數(shù)組寫(xiě)入此輸出流中。如何將字節(jié)數(shù)據(jù)保存在字節(jié)數(shù)組中,以字符串為例,”hello , world” 如何轉(zhuǎn)為字節(jié)數(shù)組。顯然通過(guò)字符串的getBytes方法即可。public class IoTest2 public static void main(String args) throws IOException Stri
52、ng path = "c:a.txt"writeTxtFile(path);private static void writeTxtFile(String path) throws IOException / 1:打開(kāi)文件輸出流,流的目的地是指定的文件FileOutputStream fos = new FileOutputStream(path);/ 2:通過(guò)流向文件寫(xiě)數(shù)據(jù)byte byt = "java".getBytes();fos.write(byt);/ 3:用完流后關(guān)閉流fos.close();仔細(xì)查看a.txt文本文件發(fā)現(xiàn)上述程序每運(yùn)行一次
53、,老的內(nèi)容就會(huì)被覆蓋掉。,那么如何不覆蓋已有信息,能夠往a.txt里追加信息呢。查看API文檔,發(fā)現(xiàn)FileOutputStream類中的構(gòu)造方法中有一個(gè)構(gòu)造可以實(shí)現(xiàn)追加的功能FileOutputStream(File file, boolean append) 第二個(gè)參數(shù),append - 如果為 true,則將字節(jié)寫(xiě)入文件末尾處,而不是寫(xiě)入文件開(kāi)始處private static void writeTxtFile(String path) throws IOException / 1:打開(kāi)文件輸出流,流的目的地是指定的文件FileOutputStream fos = new FileOutputStream(path,true);/ 2:通過(guò)流向文件寫(xiě)數(shù)據(jù)byte byt = "java".getBytes();fos.write(byt);/ 3:用完流后關(guān)閉流fos.close
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45155-2024質(zhì)量管理理解、評(píng)價(jià)和改進(jìn)組織的質(zhì)量文化指南
- Perfluoropentane-Dodecafluoropentane-生命科學(xué)試劑-MCE-3888
- Ergocornine-生命科學(xué)試劑-MCE-6625
- 10-Norparvulenone-生命科學(xué)試劑-MCE-1894
- 二零二五年度智能制造股權(quán)融資協(xié)議
- 二零二五年度游戲軟件試用授權(quán)合同
- 二零二五年度企業(yè)退休人員再就業(yè)解除合同協(xié)議
- 2025年度貨運(yùn)駕駛員綠色出行與節(jié)能減排合同
- 2025年度新能源項(xiàng)目電力施工簡(jiǎn)易協(xié)議書(shū)
- 2025年度豪華公寓私人房屋轉(zhuǎn)租管理服務(wù)合同
- 水上水下作業(yè)應(yīng)急預(yù)案
- Jane-Eyre簡(jiǎn)愛(ài)英文課件
- (小學(xué))人教版一年級(jí)下冊(cè)數(shù)學(xué)《認(rèn)識(shí)鐘表》課件
- 2022年?duì)I口市大學(xué)生??紝U锌荚囌骖}及答案
- API520-安全閥計(jì)算PART1(中文版)
- 醫(yī)院信息科考核內(nèi)容標(biāo)準(zhǔn)細(xì)則
- 商務(wù)提成辦法
- 《統(tǒng)計(jì)學(xué)》完整袁衛(wèi)-賈俊平課件
- FZ/T 25001-1992工業(yè)用毛氈
- 電商部售后客服績(jī)效考核表
- 小提琴協(xié)奏曲《梁?!纷V
評(píng)論
0/150
提交評(píng)論