File
路徑
相對路徑
路徑1:“a.txt”
路徑2:“abc\\a.txt”
絕對路徑
路徑1:“c:\\a.txt”
路徑2:“c:\\abc\\a.txt”
- File對象就表示一個路徑,可以是文件的路徑、也可以是文件夾的路徑
- 這個路徑可以是存在的,也允許是不存在的
方法名稱 | 說明 |
---|---|
public File(String pathname) | 根據文件路徑創建文件對象 |
public File(String parent, String child) | 根據父路徑名字符串和子路徑名字符串創建文件對象 |
public File(File parent, String child) | 根據父路徑名對應文件對象和子路徑名字符串創建文件對象 |
常見成員方法
判斷、獲取
方法名稱 | 說明 |
---|---|
public boolean isDirectory() | 判斷此路徑名表示的File是否為文件夾 |
public boolean isFile() | 判斷此路徑名表示的File是否為文件 |
public boolean exists() | 判斷此路徑名表示的File是否存在 |
public long length() | 返回文件的大小(字節數量) |
public String getAbsolutePath() | 返回文件的絕對路徑 |
public String getPath() | 返回定義文件時使用的路徑 |
public String getName() | 返回文件的名稱,帶后綴 |
public long lastModified() | 返回文件的最后修改時間(時間毫秒值) |
創建、刪除
方法名稱 | 說明 |
---|---|
public boolean createNewFile() | 創建一個新的空的文件 |
public boolean mkdir() | 創建單級文件夾 |
public boolean mkdirs() | 創建多級文件夾 |
public boolean delete() | 刪除文件、空文件夾 |
-
createNewFile 創建一個新的空的文件
-
細節1:如果當前路徑表示的文件是不存在的,則創建成功,方法返回true
如果當前路徑表示的文件是存在的,則創建失敗,方法返回false
-
細節2:如果父級路徑是不存在的,那么方法會有異常IOException
-
細節3:createNewFile方法創建的一定是文件,如果路徑中不包含后綴名,則創建一個沒有后綴的文件
-
-
mkdir make Directory,文件夾(目錄)
- 細節1:windows當中路徑是唯一的,如果當前路徑已經存在,則創建失敗,返回false
- 細節2:mkdir方法只能創建單級文件夾,無法創建多級文件夾
-
mkdirs 創建多級文件夾
細節:既可以創建單級的,又可以創建多級的文件夾
-
delete
- 如果刪除的是文件,則直接刪除,不走回收站
- 如果刪除的是空文件夾,則直接刪除,不走回收站
- 如果刪除的是有內容的文件夾,則刪除失敗
獲取并遍歷
方法名稱 | 說明 |
---|---|
public File[] listFiles() | 獲取當前該路徑下所有內容 |
- 當調用者File表示的路徑不存在時,返回null
- 當調用者File表示的路徑是文件時,返回null
- 當調用者File表示的路徑是一個空文件夾時,返回一個長度為0的數組
- 當調用者File表示的路徑是一個有內容的文件夾時,將里面所有文件和文件夾的路徑放在File數組中返回
- 當調用者File表示的路徑是一個有隱藏文件的文件夾時,將里面所有文件和文件夾的路徑放在File數組中返回,包含隱藏文件
- 當調用者File表示的路徑是需要權限才能訪問的文件夾時,返回null
方法名稱 | 說明 |
---|---|
public static File[] listRoots() | 列出可用的文件系統根 |
public String[] list() | 獲取當前該路徑下所有內容 |
public String[] list(FilenameFilter filter) | 利用文件名過濾器獲取當前該路徑下所有內容 |
public File[] listFiles() | 獲取當前該路徑下所有內容 |
public File[] listFiles(FileFilter filter) | 利用文件名過濾器獲取當前該路徑下所有內容 |
public File[] listFiles(FilenameFilter filter) | 利用文件名過濾器獲取當前該路徑下所有內容 |
IO流
分類
純文本文件:Windows自帶的記事本打開能讀懂
FileOutputStream
操作本地文件的字節輸出流,可以把程序中的數據寫到本地文件中。
一、構造方法
構造方法 | 描述 |
---|---|
FileOutputStream(String name) | 使用指定的文件名創建一個 FileOutputStream 對象。如果文件不存在,會創建一個新文件。 |
FileOutputStream(String name, boolean append) | 使用指定的文件名和 append 標志創建 FileOutputStream 對象。如果 append 為 true ,字節將被寫入文件末尾。 |
FileOutputStream(File file) | 使用指定的 File 對象創建 FileOutputStream 對象。如果文件不存在,會創建一個新文件。 |
FileOutputStream(File file, boolean append) | 使用指定的 File 對象和 append 標志創建 FileOutputStream 對象。如果 append 為 true ,字節將被寫入文件末尾。 |
FileOutputStream(FileDescriptor fdObj) | 創建一個文件輸出流以寫入指定的文件描述符。 |
二、書寫步驟
- 創建字節輸出流對象
- 寫數據
- 釋放資源
細節:
- 創建字節輸出流對象
細節1:參數是字符串表示的路徑或者是File對象都是可以的
細節2:如果文件不存在會創建一個新的文件,但是要保證父級路徑是存在的。
細節3:如果文件已經存在,則會清空文件 - 寫數據
細節:write方法的參數是整數,但是實際上寫到本地文件中的是整數在ASCII上對應的字符 - 釋放資源
細節:每次使用完流之后都要釋放資源
import java.io.FileOutputStream;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt");fos.write(97);fos.close();}
}
三、write用法
方法名稱 | 說明 |
---|---|
void write(int b) | 一次寫一個字節數據 |
void write(byte[] b) | 一次寫一個字節數組數據 |
void write(byte[] b, int off, int len) | 一次寫一個字節數組的部分數據 |
public class Test {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt");String str = "abcd";byte[] bytes = str.getBytes();fos.write(bytes);fos.close();}
}
void write(byte[] b, int off, int len)
:
off
:起始索引:字節數組b
中的起始偏移量。表示從數組的哪個索引位置開始寫入數據。(off
必須是非負整數,且不能超過數組b
的長度。)
len
:寫入字節數:這是要寫入的字節數。從off
位置開始,連續寫入len
個字節。
四、換行與續寫
1.換行
寫出一個換行符即可
windows:\r\n
Linux:\n
Mac:\r
在windows操作系統當中,java對回車換行進行了優化。
雖然完整的是\r\n,但是我們寫其中一個\r或者\n,
java也可以實現換行,因為java在底層會補全。
2.續寫
FileOutputStream(String name, boolean append)
FileOutputStream(File file, boolean append)
如果 append
為 true
,字節將被寫入文件末尾。
FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt",true);
FileInputStream
操作本地文件的字節輸入流,可以把本地文件中的數據讀取到程序中來。
一、構造方法
構造方法 | 參數描述 |
---|---|
FileInputStream(File file) | 要讀取的文件對象。 |
FileInputStream(String name) | 要讀取的文件的路徑名。 |
FileInputStream(FileDescriptor fd) | 文件描述符對象,表示已打開的文件。 |
二、書寫步驟
- 創建字節輸入流對象
- 讀數據
- 釋放資源
細節:
-
- 如果文件不存在,就直接報錯。
-
- 一次讀一個字節,讀出來的是數據在ASCII上對應的數字
- 讀到文件末尾了,read方法返回-1。
- 每次使用完流必須要釋放資源。
三、循環讀取
import java.io.FileInputStream;
import java.io.IOException;public class Demo {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("..\\5.20\\a.txt");int b;while ((b = fis.read()) != -1) {System.out.print((char) b);}fis.close();}
}
四、read
方法名稱 | 說明 |
---|---|
public int read() | 一次讀一個字節數據 |
public int read(byte[] buffer) | 一次讀一個字節數組數據 |
字符集
ASCII
存儲英文,一個字節就足以
計算機的存儲規則
- GB2312字符集:1980年發布,1981年5月1日實施的簡體中文漢字編碼國家標準。
收錄7445個圖形字符,其中包括6763個簡體漢字 - BIG5字符集:臺灣地區繁體中文標準字符集,共收錄13053個中文字,1984年實施。
- GBK字符集:2000年3月17日發布,收錄21003個漢字
包含國家標準GB13000-1中的全部中日韓漢字,和BIG5編碼中的所有漢字。 - Unicode字符集:
國際標準字符集,它將世界各種語言的每個字符定義一個唯一的編碼,以滿足跨語言、跨平臺的文本信息轉換。
系統顯示:ANSI
windows系統默認使用的就是GBK。
為什么會有亂碼
- 讀取數據時未讀完整個漢字
- 編碼和解碼時的方式不統一
編碼和解碼
Java中編碼的方法
String類中的方法 | 說明 |
---|---|
public byte[] getBytes() | 使用默認方式進行編碼 |
public byte[] getBytes(String charsetName) | 使用指定方式進行編碼 |
Java中解碼的方法
String類中的方法 | 說明 |
---|---|
String(byte[] bytes) | 使用默認方式進行解碼 |
String(byte[] bytes, String charsetName) | 使用指定方式進行解碼 |
UTF
UTF-8、UTF-16 和 UTF-32 是三種不同的字符編碼方案,它們在存儲字符時使用不同的字節長度:
- UTF-8: UTF-8 是一種變長編碼方案,字符的存儲長度可以是 1 到 4 個字節。在 UTF-8 中,常用的 ASCII 字符(0 到 127)使用單個字節存儲,而其他字符則使用多個字節。通常情況下,UTF-8 編碼的字節數如下:
- 1 字節:ASCII 字符
- 2 字節:大多數歐洲語言的常用字符
- 3 字節:較少使用的非常見字符
- 4 字節:較少見的字符和符號
- UTF-16: UTF-16 使用固定長度的 2 個字節來存儲大多數常見字符,但一些輔助字符需要使用額外的 2 個字節(總共 4 個字節)進行編碼。這意味著大多數字符都占用 2 個字節,但一些罕見字符占用 4 個字節。
- UTF-32: UTF-32 使用固定長度的 4 個字節來表示每個字符,無論字符的編碼大小。
字符流
字符流的底層其實就是字節流
字符流
= 字節流
+ 字符集
特點:
- 輸入流:一次讀一個字節,遇到中文時,一次讀多個字節
- 輸出流:底層會把數據按照指定的編碼方式進行編碼,變成字節再寫到文件中
FileReader
-
創建字符輸入流對象
構造方法 說明 public FileReader(File file)
創建字符輸入流關聯本地文件 public FileReader(String pathname)
創建字符輸入流關聯本地文件 細節1:如果文件不存在,就直接報錯
-
讀取數據
成員方法 說明 public int read()
讀取數據,讀到末尾返回-1 public int read(char[] buffer)
讀取多個數據,讀到末尾返回-1 細節1:按字節進行讀取,遇到中文,一次讀多個字節,讀取后解碼,返回一個整數
細節2:讀到文件末尾了,read方法返回-1 -
釋放資源
成員方法 說明 public int close()
釋放資源/關閉流
構造方法 | 說明 |
---|---|
public FileWriter(File file) | 創建字符輸出流關聯本地文件 |
public FileWriter(String pathname) | 創建字符輸出流關聯本地文件 |
public FileWriter(File file, boolean append) | 創建字符輸出流關聯本地文件,續寫 |
public FileWriter(String pathname, boolean append) | 創建字符輸出流關聯本地文件,續寫 |
成員方法
成員方法 | 說明 |
---|---|
void write(int c) | 寫出一個字符 |
void write(String str) | 寫出一個字符串 |
void write(String str, int off, int len) | 寫出一個字符串的一部分 |
void write(char[] cbuf) | 寫出一個字符數組 |
void write(char[] cbuf, int off, int len) | 寫出字符數組的一部分 |
- 創建字符輸出流對象
細節1:參數是字符串表示的路徑或者File對象都是可以的
細節2:如果文件不存在會創建一個新的文件,但是要保證父級路徑是存在的
細節3:如果文件已經存在,則會清空文件,如果不想清空可以打開續寫開關 - 寫數據
細節:如果write方法的參數是整數,但是實際上寫到本地文件中的是整數在字符集上對應的字符 - 釋放資源
細節:每次使用完流之后都要釋放資源
字符流原理解析
- 創建字符輸入流對象
底層::聯文件,并創建緩沖區(長度為8192的字節數) - 讀取數據
底層:
- 判斷緩沖區中是否有數據可以讀取
- 緩沖區沒有數據:就從文件中獲取數據,裝到緩沖區中,每次盡可能裝滿緩沖區
如果文件中也沒有數據了,返回-1 - 緩沖區有數據:就從緩沖區中讀取
空參的read方法:一次讀取一個字節,遇到中文一次讀多個字節,把字節解碼并轉成十進制返回
有參的read方法:把讀取字節,解碼,強轉三步合并了,強轉之后的字符放到數組中
已經到底啦!!