Java文件管理操作的知識點整理
一.基本文件操作
獲取及判斷文件屬性
代碼示例如下:
import java.io.IOException; public class test { public static void main(String[] args) throws IOException { File file = new File("./test.txt"); System.out.println(file.getParent()); System.out.println(file.getName()); System.out.println(file.getPath()); System.out.println(file.getAbsolutePath()); System.out.println(file.getCanonicalPath()); //創建文件前 System.out.println(file.exists()); System.out.println(file.isDirectory()); System.out.println(file.isFile()); System.out.println("---------------"); //創建文件後 file.createNewFile(); System.out.println(file.exists()); System.out.println(file.isDirectory()); System.out.println(file.isFile()); //刪除文件 System.out.println("--------------"); file.delete(); System.out.println(file.exists()); } }
getParent():獲取上級目錄,若無指定則返回null
getName():獲取當前文件名
getPath():獲取以工作目錄為基準的相對路徑
getAbsolutePath():獲取以盤頭為起始點的絕對路徑
getCanonicalPath():同上,但是會進行一些精簡
exists():判斷文件是否存在
isDirectory():判斷文件是否是目錄
isFile():判斷文件是否是文件
delete():刪除文件
上述代碼的運行結果如下:
創建及修改文件
import java.io.File; import java.io.IOException; public class test { public static void main(String[] args) throws IOException { File file = new File("./test.txt"); file.createNewFile(); //退出時刪除 file.deleteOnExit(); System.out.println(file.exists()); } }
deleteOnExit():退出時刪除
createNewFile():創建對應文件
public class test { public static void main(String[] args) throws IOException { File file = new File("./test"); //創建單級目錄 file.mkdir(); //創建多級目錄 File file1 = new File("test1/a/11"); file1.mkdirs(); } }
上述代碼運行結果如下:
mkdir():根據路徑創建單級目錄
mkdirs():根據路徑創建多級目錄
public class test { public static void main(String[] args) throws IOException { File file1 = new File("test"); File file2 = new File("test1"); //重命名 file1.renameTo(file2); } }
renameTo():將一個文件的名字賦值給另一個文件
二.文件讀寫
讀文件
字節流
我們事先準備一個test.txt文件,裡面包含內容"Hello".
public class test { public static void main(String[] args) throws IOException { File file = new File("text1.txt"); file.createNewFile(); //打開文件 InputStream inputStream = new FileInputStream("text1.txt"); //讀文件 while(true){ int b = inputStream.read(); if(b == -1){ break; } System.out.println(b); } //關閉文件 inputStream.close(); } }
實際上,read()有很多個版本,具體如下:
上述代碼中使用的是第一個版本,一次讀取一個字節,並將這個字節的內容作為返回值返回,如果讀取到文件結束符(EOF),則返回-1.
第二個版本要求一個"輸出型參數"—一個字節數組.read()會從文件裡把內容全部讀入該字節數組中,若溢出則截斷.
第三個版本與第二個版本相似,隻不過允許通過參數控制數據的傳入起點和終點(也即允許傳入的數據長度).
上述代碼的運行結果如下:
可見讀取的是"Hello"每個字符對應的ASCII碼值.
這樣可讀性無疑是很低的,我們可以將其轉為字符串的形式輸出,代碼示例如下:
public class test { public static void main(String[] args) throws IOException { File file = new File("text1.txt"); file.createNewFile(); //打開文件 InputStream inputStream = new FileInputStream("text1.txt"); //讀文件 byte[] b = new byte[1024]; int len = inputStream.read(b); String s = new String(b,0,len,"utf8"); System.out.println(s); //關閉文件 inputStream.close(); } }
我們可以通過讀出來的字節數組,反向構造出其原本的字符串,這樣就能得到"Hello"瞭,但這樣無疑很麻煩.因此,對於這種非二進制的數組,我們可以使用字符流.
字符流
字符流對應著Reader和FileReader兩個關鍵字.
public class test { public static void main(String[] args) throws IOException { File file = new File("text1.txt"); file.createNewFile(); //打開文件 Reader reader = new FileReader("text1.txt"); char[] buffer = new char[1024]; int len = reader.read(buffer); for (int i = 0; i < len; i++) { System.out.print(buffer[i]); } reader.close(); } }
這樣輸出出來的直接就是"Hello",而不是ASCII碼值.
其他要點
1.InputStream和Reader兩個都是抽象類,沒辦法直接實例化.因此我們需要借助他們的子類FileInputStream和FileReader來實例化.
2.我們創建的文件都在硬盤上,直接操作的話比較困難.因此我們嘗試在內存上創建一個媒介,間接的操作硬盤上的文件.我們將InputStream和Reader這種媒介成為句柄(Handler).
3.上述代碼的寫法實際上是不嚴謹的,因為一旦程序在運行途中拋出瞭異常,代碼末尾的close()就無法執行.因此我們應該把close()放在finally下.保證在文件描述符表上的資源得以釋放.
4.關於文件描述符表:文件描述符表可以簡單理解成PCB中的一個數組/順序表.數組中的每個元素都對應著當前進程打開的文件.這個數組的下標,就稱為"文件描述符".每當我們打開一個文件時,就會在文件描述符表中占據一個位置;每次關閉文件,都會釋放一個位置.然而文件描述表的長度是存在上限的,如果在進程中一直打開文件而不釋放,這就會導致進程在後續打開文件的時候拋出異常.
5.實際上,我們有一套更實用的方法從文件中讀取內容,代碼示例如下:
public class test { public static void main(String[] args) throws IOException { File file = new File("text1.txt"); file.createNewFile(); InputStream inputStream = new FileInputStream("text1.txt"); Scanner scanner = new Scanner(inputStream); String s = scanner.next(); System.out.println(s); } }
我們可以將InputStream作為Scanner構造函數的參數,這樣我們就可以使用Scanner靈活讀取文件內部的內容.
寫文件
字節流
對於字節流的輸入方式,我們有OutputStream和FileOutputStream這一套組合.
public class test { public static void main(String[] args) throws IOException { File file = new File("text1.txt"); file.createNewFile(); try(OutputStream outputStream = new FileOutputStream("text1.txt")){ outputStream.write('h'); outputStream.write('e'); outputStream.write('l'); outputStream.write('l'); outputStream.write('o'); }catch(IOException e){ e.printStackTrace(); } } }
字符流
對於字符流的輸入方式,我們有Writer和FileWriter這一套組合.
public class test { public static void main(String[] args) throws IOException { File file = new File("text1.txt"); file.createNewFile(); try(Writer writer = new FileWriter("text1.txt")){ writer.write("hello"); }catch(IOException e){ e.printStackTrace(); } } }
字節流封裝
與讀取文件內容部分一樣,我們可以將字節流封裝,其可以靈活的向文件內寫內容.
public class test { public static void main(String[] args) throws IOException { File file = new File("text.txt"); file.createNewFile(); try(OutputStream outputStream = new FileOutputStream("text.txt")){ PrintWriter printWriter = new PrintWriter(outputStream); printWriter.println("hello"); printWriter.flush(); }catch (IOException e){ e.printStackTrace(); } } }
此處封裝過後,就可以如常規輸出一樣,向文件裡輸入內容.代碼中flush()的作用在於清空輸入緩沖區的內容,使println()輸出的內容能成功到文件中.
其他要點
上述代碼中我們把OutputStream等輸入輸出流放在try()中,其目的是在代碼結束後可以自動調用close()方法釋放文件描述符表,防止忘記.這要求這個類要實現Closeable接口.
到此這篇關於Java文件管理操作的知識點整理的文章就介紹到這瞭,更多相關Java文件管理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java的File類和IO流其實真的不難
- Java中的字節,字符輸出流與字節和字符輸入流的簡單理解
- Java進階核心之InputStream流深入講解
- Java inputstream和outputstream使用詳解
- 新手瞭解java IO基礎知識(二)