您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java的File類和IO流實例分析”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java的File類和IO流實例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
IO流概述:
IO:輸入/輸出(Input/Output)
流:是一種抽象概念,是對數據傳輸的總稱。也就是說數據在設備間的傳輸稱為流,流的本質是數據傳輸IO流就是用來處理設備間數據傳輸問題的, 常見的應用:文件復制;文件上傳;文件下載等等,總而言之,涉及到傳輸的,都涉及到流。
IO流體系圖:
既然IO是涉及文件的操作,那么一定離不開文件操作的技術:
File 類是 java.io 包中唯一代表磁盤文件本身的對象。File 類定義了一些方法來操作文件,主要用來獲取或處理與磁盤文件相關的信息,像文件名、 文件路徑、訪問權限和修改日期等,還可以瀏覽子目錄層次結構。
File 類表示處理文件和文件系統的相關信息。File 類不具有從文件讀取信息和向文件寫入信息的功能,它僅描述文件本身的屬性。所以和IO搭配在一起進行讀出和寫入的操作。
先看一張File類常用的方法總匯圖:
使用createNewFile()創建一個文件:
public class test01 { public static void main(String[] args) throws IOException { //先建立一個File對象,并傳入路徑 File file1 = new File("G://abc.txt"); //創建空文件,如果沒有存在則新建一個,并且返回True,如果存在了就返回false System.out.println(file1.createNewFile()); }
如果執行后,該目錄沒有這個文件,那么會創建一個,并且返回true,如果已經存在了,就會返回false,代表創建失敗。
使用mkdir()創建一個目錄:
File file2 = new File("G://a"); System.out.println(file2.mkdir()); //創建一個目錄,如果沒有存在則新建一個,并且返回True,如果存在了就返回false
使用mkdirs()創建多級目錄:
File file3 = new File("G://a//b//c"); System.out.println(file3.mkdirs()); //創建多級目錄,如果沒有存在則新建一個,并且返回True,如果存在了就返回false
接著我們需要使用IO流里面的功能對文件進行輸入和輸出:
先介紹四個常用的流:
字節輸入流:InputStream
字節輸出流:OutputStream
字符輸入流:Reader
字符輸出流:Writer
為什么會有字節和字符兩種流呢?
ASCII 碼中,一個英文字母(不分大小寫)為一個字節,一個中文漢字為兩個字節。
UTF-8 編碼中,一個英文字為一個字節,一個中文為三個字節。
Unicode 編碼中,一個英文為一個字節,一個中文為兩個字節。
所以我們知道計算機讀取數據是一個一個的讀取,當文件里面是數字或者英文的時候,因為都占了一個字節,所以可以正常讀取出來。
那么如果是漢字呢?最少也占了兩個字節,如果把一個漢字拆分讀取,顯示出來肯定是有問題的。
小結:如果數據通過Window自帶的記事本軟件打開,我們還可以讀懂里面的內容,就使用字符流,否則使用字節流。如果你不知道該使用哪種類型的流,就使用字節流!
下面是四種流對應功能的方法名總匯表:
我們使用字節輸出流給abc.txt文件里面寫一句話:
public class test01 { public static void main(String[] args) { try{ //創建輸出流對象: OutputStream fos = null; fos = new FileOutputStream("G://abc.txt"); String str = "今天的博客是IO流"; //先將需要寫入的字符打散成數組: byte[] words = str.getBytes(); //使用寫入的功能 fos.write(words); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
運行后:
我們知道如果文件內是漢字,使用字節輸入流,那么顯示的肯定是亂碼,如果現在文件里面是“我愛中國”這四個字,使用下面這段代碼:
public class test02 { public static void main(String[] args) { //創建字節輸入流對象: InputStream fis = null; try{ fis = new FileInputStream("G://abc.txt"); int data; //fis.read()取到每一個字節通過Ascll碼表轉換成0-255之間的整數,沒有值返回-1 while((data=fis.read())!=-1){ //(char) data 將讀到的字節轉成對應的字符 //中文的字符是2+個字節組成 System.out.print((char) data); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try{ fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
輸出的結果是:
然后把文件內信息換成英文和數字:
結論:有漢字的文件讀取不能用字節流
我們使用字符輸出流給abc.txt文件里面寫幾句話:
public class test03 { public static void main(String[] args) { try{ //使用字符輸出流的FileWriter寫入數據 Writer fw = new FileWriter("G://abc.txt"); fw.write("我們在學Java"); fw.write("一起加油"); fw.close(); //關閉資源 } catch (IOException e) { e.printStackTrace(); } } }
也沒用問題,我們發現,使用字符流寫中文漢字更方便。
可以設置緩存流提高獲取值的效率:
public class test04 { public static void main(String[] args) throws IOException { //創建字符輸入流對象: Reader fr = null; try{ fr = new FileReader("G:/abc.txt"); //借助字符流對象創建了字符緩存區 把字符一個一個的取到后先放到緩存區 //然后一起再讀寫到程序內存來,效率更高 BufferedReader br = new BufferedReader(fr); //先去緩存區一行一行的讀取 String line = br.readLine(); while(line != null){ System.out.println(line); line = br.readLine(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } }
當文件內的信息為多行的時候:
字節流和字符流總結:
IO是文件的輸入和輸出,我們要想去對文件或者寫,或者通過程序發送消息給另外的用戶都要用到流。
IO流分 字節流和字符流,字節流是以字節為單位IO,字符流是以字符為單位IO;通常讀寫圖片、視頻音頻等用字節 流,如果讀寫文件的內容比如中文建議用字符流。
讀到這里,這篇“Java的File類和IO流實例分析”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。