Java中文件的讀寫方法之IO流詳解
1.File類
1.1File類概述和構(gòu)造方法
- File類介紹
- 它是文件和目錄路徑名的抽象表示
- 文件和目錄是可以通過File封裝成對象的
- 對于File而言,其封裝的并不是一個真正存在的文件,僅僅是一個路徑名而已。它可以是存在的,也可以是不存在的。將來是要通過具體的操作把這個路徑的內(nèi)容轉(zhuǎn)換為具體存在的
- File類的構(gòu)造方法
- 示例代碼
public class FileDemo01 { public static void main(String[] args) { //File(String pathname):通過將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建新的 File實例。 File f1 = new File("E:\\yijizhichang\\java.txt"); System.out.println(f1); //File(String parent, String child):從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實例。 File f2 = new File("E:\\yijizhichang","java.txt"); System.out.println(f2); //File(File parent, String child):從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實例。 File f3 = new File("E:\\yijizhichang"); File f4 = new File(f3,"java.txt"); System.out.println(f4); } }
這是我的目錄,大家在執(zhí)行代碼的時候?qū)⒛夸洆Q成自己電腦上的,不過目錄中最好全是英文,不能包含中文。
1.2File類創(chuàng)建功能
- 方法分類
- 示例代碼
public class FileDemo02 { public static void main(String[] args) throws IOException { //需求1:我要在E:\\yijizhichang目錄下創(chuàng)建一個文件java.txt File f1 = new File("E:\\yijizhichang\\java.txt"); System.out.println(f1.createNewFile()); System.out.println("--------"); //需求2:我要在E:\\yijizhichang目錄下創(chuàng)建一個目錄JavaSE File f2 = new File("E:\\yijizhichang\\JavaSE"); System.out.println(f2.mkdir()); System.out.println("--------"); //需求3:我要在E:\\yijizhichang目錄下創(chuàng)建一個多級目錄JavaWEB\\HTML File f3 = new File("E:\\yijizhichang\\JavaWEB\\HTML"); // System.out.println(f3.mkdir()); System.out.println(f3.mkdirs()); System.out.println("--------"); //需求4:我要在E:\\yijizhichang目錄下創(chuàng)建一個文件javase.txt File f4 = new File("E:\\yijizhichang\\javase.txt"); // System.out.println(f4.mkdir()); System.out.println(f4.createNewFile()); } }
同理,大家也要把相關(guān)的目錄換成自己的。
1.3File類判斷和獲取功能
- 判斷功能
- 獲取功能
- 示例代碼
public class FileDemo04 { public static void main(String[] args) { //創(chuàng)建一個File對象 File f = new File("myFile\\java.txt"); System.out.println(f.isDirectory()); System.out.println(f.isFile()); System.out.println(f.exists()); System.out.println(f.getAbsolutePath()); System.out.println(f.getPath()); System.out.println(f.getName()); System.out.println("--------"); File f2 = new File("E:\\yijizhichang"); String[] strArray = f2.list(); for(String str : strArray) { System.out.println(str); } System.out.println("--------"); File[] fileArray = f2.listFiles(); for(File file : fileArray) { if(file.isFile()) { System.out.println(file.getName()); } } } }
1.4File類刪除功能
- 方法分類
- 示例代碼
public class FileDemo03 { public static void main(String[] args) throws IOException { //需求1:在當前模塊目錄下創(chuàng)建java.txt文件 File f1 = new File("myFile\\java.txt"); //需求2:刪除當前模塊目錄下的java.txt文件 System.out.println(f1.delete()); System.out.println("--------"); //需求3:在當前模塊目錄下創(chuàng)建yijizhichang目錄 File f2 = new File("myFile\\yijizhichang"); //需求4:刪除當前模塊目錄下的yijizhichang目錄 System.out.println(f2.delete()); System.out.println("--------"); //需求5:在當前模塊下創(chuàng)建一個目錄yijizhichang,然后在該目錄下創(chuàng)建一個文件java.txt File f3 = new File("myFile\\yijizhichang"); File f4 = new File("myFile\\yijizhichang\\java.txt"); //需求6:刪除當前模塊下的目錄yijizhichang System.out.println(f4.delete()); System.out.println(f3.delete()); } }
- 絕對路徑和相對路徑的區(qū)別:
- 絕對路徑:完整的路徑名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\yijizhichang\java.txt
- 相對路徑:必須使用取自其他路徑名的信息進行解釋。例如:myFile\\java.txt
2.遞歸
2.1遞歸
- 遞歸的介紹
- 以編程的角度來看,遞歸指的是方法定義中調(diào)用方法本身的現(xiàn)象
- 把一個復(fù)雜的問題層層轉(zhuǎn)化為一個與原問題相似的規(guī)模較小的問題來求解
- 遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計算
- 遞歸的基本使用
public class DiGuiDemo { public static void main(String[] args) { //回顧不死神兔問題,求第20個月兔子的對數(shù) //每個月的兔子對數(shù):1,1,2,3,5,8,... int[] arr = new int[20]; arr[0] = 1; arr[1] = 1; for (int i = 2; i < arr.length; i++) { arr[i] = arr[i - 1] + arr[i - 2]; } System.out.println(arr[19]); System.out.println(f(20)); } public static int f(int n) { if(n==1 || n==2) { return 1; } else { return f(n - 1) + f(n - 2); } } }
- 遞歸的注意事項:
- 遞歸一定要有出口。否則內(nèi)存溢出
- 遞歸雖然有出口,但是遞歸的次數(shù)也不宜過多。否則內(nèi)存溢出
2.2遞歸求階乘
- 案例需求
? 用遞歸求5的階乘,并把結(jié)果在控制臺輸出
- 代碼實現(xiàn)
public class DiGuiDemo01 { public static void main(String[] args) { //調(diào)用方法 int result = jc(5); //輸出結(jié)果 System.out.println("5的階乘是:" + result); } //定義一個方法,用于遞歸求階乘,參數(shù)為一個int類型的變量 public static int jc(int n) { //在方法內(nèi)部判斷該變量的值是否是1 if(n == 1) { //是:返回1 return 1; } else { //不是:返回n*(n-1)! return n*jc(n-1); } } }
2.3遞歸遍歷目錄
- 案例需求
? 給定一個路徑(E:\\yijizhichang),通過遞歸完成遍歷該目錄下所有內(nèi)容,并把所有文件的絕對路徑輸出在控制臺
- 代碼實現(xiàn)
public class DiGuiDemo02 { public static void main(String[] args) { //根據(jù)給定的路徑創(chuàng)建一個File對象 File srcFile = new File("E:\\yijizhichang"); //調(diào)用方法 getAllFilePath(srcFile); } public static void getAllFilePath(File srcFile) { //獲取給定的File目錄下所有的文件或者目錄的File數(shù)組 File[] fileArray = srcFile.listFiles(); //遍歷該File數(shù)組,得到每一個File對象 if(fileArray != null) { for(File file : fileArray) { //判斷該File對象是否是目錄 if(file.isDirectory()) { //是:遞歸調(diào)用 getAllFilePath(file); } else { //不是:獲取絕對路徑輸出在控制臺 System.out.println(file.getAbsolutePath()); } } } } }
3.IO流
3.1 IO流概述和分類
- IO流介紹
- IO:輸入/輸出(Input/Output)
- 流:是一種抽象概念,是對數(shù)據(jù)傳輸?shù)目偡Q。也就是說數(shù)據(jù)在設(shè)備間的傳輸稱為流,流的本質(zhì)是數(shù)據(jù)傳輸
- IO流就是用來處理設(shè)備間數(shù)據(jù)傳輸問題的。
- 常見的應(yīng)用:文件復(fù)制;文件上傳;文件下載
- IO流的分類
- 按照數(shù)據(jù)的流向
- 輸入流:讀數(shù)據(jù)
- 輸出流:寫數(shù)據(jù)
- 按照數(shù)據(jù)類型來分
- 字節(jié)流
- 字節(jié)輸入流
- 字節(jié)輸出流
- 字符流
- 字符輸入流
- 字符輸出流
- IO流的使用場景
- 如果操作的是純文本文件,優(yōu)先使用字符流
- 如果操作的是圖片、視頻、音頻等二進制文件。優(yōu)先使用字節(jié)流
- 如果不確定文件類型,優(yōu)先使用字節(jié)流。字節(jié)流是萬能的流
3.2字節(jié)流寫數(shù)據(jù)
- 字節(jié)流抽象基類
- InputStream:這個抽象類是表示字節(jié)輸入流的所有類的超類
- OutputStream:這個抽象類是表示字節(jié)輸出流的所有類的超類
- 子類名特點:子類名稱都是以其父類名作為子類名的后綴
- 字節(jié)輸出流
- FileOutputStream(String name):創(chuàng)建文件輸出流以指定的名稱寫入文件
- 使用字節(jié)輸出流寫數(shù)據(jù)的步驟
- 創(chuàng)建字節(jié)輸出流對象(調(diào)用系統(tǒng)功能創(chuàng)建了文件,創(chuàng)建字節(jié)輸出流對象,讓字節(jié)輸出流對象指向文件)
- 調(diào)用字節(jié)輸出流對象的寫數(shù)據(jù)方法
- 釋放資源(關(guān)閉此文件輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源)
- 示例代碼
public class FileOutputStreamDemo01 { public static void main(String[] args) throws IOException { //創(chuàng)建字節(jié)輸出流對象 FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt"); fos.write(97); //最后都要釋放資源 fos.close(); } }
3.3字節(jié)流寫數(shù)據(jù)的三種方式
- 寫數(shù)據(jù)的方法分類
- 示例代碼
public class FileOutputStreamDemo02 { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt"); fos.write(bys,1,3); //釋放資源 fos.close(); } }
3.4字節(jié)流寫數(shù)據(jù)的兩個小問題
- 字節(jié)流寫數(shù)據(jù)如何實現(xiàn)換行
- windows:\r\n
- linux:\n
- mac:\r
- 字節(jié)流寫數(shù)據(jù)如何實現(xiàn)追加寫入
- public FileOutputStream(String name,boolean append)
- 創(chuàng)建文件輸出流以指定的名稱寫入文件。如果第二個參數(shù)為true ,則字節(jié)將寫入文件的末尾而不是開頭
- 示例代碼
public class FileOutputStreamDemo03 { public static void main(String[] args) throws IOException { //創(chuàng)建字節(jié)輸出流對象 FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt",true); //寫數(shù)據(jù) for (int i = 0; i < 10; i++) { fos.write("hello".getBytes()); fos.write("\r\n".getBytes()); } //釋放資源 fos.close(); } }
3.5字節(jié)流寫數(shù)據(jù)加異常處理
- 異常處理格式
- ?
?try-catch-finally?
?
- ?
try{ 可能出現(xiàn)異常的代碼; }catch(異常類名 變量名){ 異常的處理代碼; }finally{ 執(zhí)行所有清除操作; }
- finally特點
- 被finally控制的語句一定會執(zhí)行,除非JVM退出
- 示例代碼
public class FileOutputStreamDemo04 { public static void main(String[] args) { //加入finally來實現(xiàn)釋放資源 FileOutputStream fos = null; try { fos = new FileOutputStream("myByteStream\\fos.txt"); fos.write("hello".getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { if(fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
3.6字節(jié)流讀數(shù)據(jù)(一次讀一個字節(jié)數(shù)據(jù))
- 字節(jié)輸入流
- FileInputStream(String name):通過打開與實際文件的連接來創(chuàng)建一個FileInputStream ,該文件由文件系統(tǒng)中的路徑名name命名
- 字節(jié)輸入流讀取數(shù)據(jù)的步驟
- 創(chuàng)建字節(jié)輸入流對象
- 調(diào)用字節(jié)輸入流對象的讀數(shù)據(jù)方法
- 釋放資源
- 示例代碼
public class FileInputStreamDemo01 { public static void main(String[] args) throws IOException { //創(chuàng)建字節(jié)輸入流對象 //FileInputStream(String name) FileInputStream fis = new FileInputStream("myByteStream\\fos.txt"); int by; while ((by=fis.read())!=-1) { System.out.print((char)by); } //釋放資源 fis.close(); } }
3.7字節(jié)流復(fù)制文本文件
- 案例需求
? 把“E:\yijizhichang\\窗里窗外.txt”復(fù)制到模塊目錄下的“窗里窗外.txt”
- 實現(xiàn)步驟
- 復(fù)制文本文件,其實就把文本文件的內(nèi)容從一個文件中讀取出來(數(shù)據(jù)源),然后寫入到另一個文件中(目的地)
- 數(shù)據(jù)源:
? E:\\yijizhichang\\窗里窗外.txt --- 讀數(shù)據(jù) --- InputStream --- FileInputStream
- 目的地:
? myByteStream\\窗里窗外.txt --- 寫數(shù)據(jù) --- OutputStream --- FileOutputStream
- 代碼實現(xiàn)
public class CopyTxtDemo { public static void main(String[] args) throws IOException { //根據(jù)數(shù)據(jù)源創(chuàng)建字節(jié)輸入流對象 FileInputStream fis = new FileInputStream("E:\\yijizhichang\\窗里窗外.txt"); //根據(jù)目的地創(chuàng)建字節(jié)輸出流對象 FileOutputStream fos = new FileOutputStream("myByteStream\\窗里窗外.txt"); //讀寫數(shù)據(jù),復(fù)制文本文件(一次讀取一個字節(jié),一次寫入一個字節(jié)) int by; while ((by=fis.read())!=-1) { fos.write(by); } //釋放資源 fos.close(); fis.close(); } }
3.8字節(jié)流讀數(shù)據(jù)(一次讀一個字節(jié)數(shù)組數(shù)據(jù))
- 一次讀一個字節(jié)數(shù)組的方法
- public int read(byte[] b):從輸入流讀取最多b.length個字節(jié)的數(shù)據(jù)
- 返回的是讀入緩沖區(qū)的總字節(jié)數(shù),也就是實際的讀取字節(jié)個數(shù)
- 示例代碼
public class FileInputStreamDemo02 { public static void main(String[] args) throws IOException { //創(chuàng)建字節(jié)輸入流對象 FileInputStream fis = new FileInputStream("myByteStream\\fos.txt"); byte[] bys = new byte[1024]; //1024及其整數(shù)倍 int len; while ((len=fis.read(bys))!=-1) { System.out.print(new String(bys,0,len)); } //釋放資源 fis.close(); } }
3.9字節(jié)流復(fù)制圖片
- 案例需求
? 把“E:\\yijizhichang\\mn.jpg”復(fù)制到模塊目錄下的“mn.jpg”
- 實現(xiàn)步驟
- 根據(jù)數(shù)據(jù)源創(chuàng)建字節(jié)輸入流對象
- 根據(jù)目的地創(chuàng)建字節(jié)輸出流對象
- 讀寫數(shù)據(jù),復(fù)制圖片(一次讀取一個字節(jié)數(shù)組,一次寫入一個字節(jié)數(shù)組)
- 釋放資源
- 代碼實現(xiàn)
public class CopyJpgDemo { public static void main(String[] args) throws IOException { //根據(jù)數(shù)據(jù)源創(chuàng)建字節(jié)輸入流對象 FileInputStream fis = new FileInputStream("E:\\yijizhichang\\mn.jpg"); //根據(jù)目的地創(chuàng)建字節(jié)輸出流對象 FileOutputStream fos = new FileOutputStream("myByteStream\\mn.jpg"); //讀寫數(shù)據(jù),復(fù)制圖片(一次讀取一個字節(jié)數(shù)組,一次寫入一個字節(jié)數(shù)組) byte[] bys = new byte[1024]; int len; while ((len=fis.read(bys))!=-1) { fos.write(bys,0,len); } //釋放資源 fos.close(); fis.close(); } }
總結(jié)
本文主要給大家介紹了Java中文件的讀寫方法。主要包括文件File類、遞歸以及IO流,并且通過大量的案例加以說明。這里需要說明的是:本文中的代碼所涉及到的路徑或者文件都是本人的,大家得換成自己的,并且大家可以在網(wǎng)上自行找一些材料作為讀入或者寫入的材料,不過路徑最好是英文的,不要包含中文,防止JVM讀取失敗。這也就是本人沒有貼出運行示意圖的原因。不過本文中的代碼都是正確的,如果大家粘貼在自己編譯器報錯,可能是你的路徑?jīng)]有,或者文件不存在,最多就是需要自己將需要的包導(dǎo)進去。
到此這篇關(guān)于Java中文件的讀寫方法之IO流詳解的文章就介紹到這了,更多相關(guān)Java IO流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java經(jīng)典算法匯總之選擇排序(SelectionSort)
選擇排序也是比較簡單的一種排序方法,原理也比較容易理解,選擇排序在每次遍歷過程中只記錄下來最小的一個元素的下標,待全部比較結(jié)束之后,將最小的元素與未排序的那部分序列的最前面一個元素交換,這樣就降低了交換的次數(shù),提高了排序效率。2016-04-04Eclipse開發(fā)JavaWeb項目配置Tomcat的方法步驟
本文主要介紹了Eclipse開發(fā)JavaWeb項目配置Tomcat的方法步驟,首先介紹eclipse開發(fā)JavaWeb項目需要配置的相關(guān)環(huán)境,使用tomcat軟件在本地搭建服務(wù)器,然后再在eclipse環(huán)境下配置tomcat,感興趣的可以了解一下2021-08-08springboot jpa分庫分表項目實現(xiàn)過程詳解
這篇文章主要介紹了springboot jpa分庫分表項目實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01SpringBoot集成thymeleaf渲染html模板的步驟詳解
這篇文章主要給大家詳細介紹了SpringBoot集成thymeleaf如何使實現(xiàn)html模板的渲染,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以參考下2023-06-06Spring Cloud Gateway Hystrix fallback獲取異常信息的處理
這篇文章主要介紹了Spring Cloud Gateway Hystrix fallback獲取異常信息的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07