1. File
java.io.File類(lèi)是文件和目錄路徑名的抽象表示形式,主要用于文件和目錄的創(chuàng)建、查找和刪除等操作。
1.1 File類(lèi)概述和構(gòu)造方法
File:它是文件和目錄路徑名的抽象表示
- 文件和目錄可以通過(guò)File封裝成對(duì)象
- File封裝的對(duì)象僅僅是一個(gè)路徑名。它可以是存在的,也可以是不存在的。
| 方法名 | 說(shuō)明 |
| — | — |
| File(String pathname) | 通過(guò)將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來(lái)創(chuàng)建新的 File實(shí)例 |
| File(String parent, String child) | 從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例 |
| File(File parent, String child) | 從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例 |
注意:父路徑必須是一個(gè)目錄路徑
1.2 絕對(duì)路徑和相對(duì)路徑
- 絕對(duì)路徑:從盤(pán)符開(kāi)始
File file1 = new File(“D:\\snow\\a.txt”);
- 相對(duì)路徑:相對(duì)當(dāng)前項(xiàng)目下的路徑
File file2 = new File(“a.txt”);
File file3 = new File(“模塊名\\a.txt”);
1.3 File 類(lèi)的常用方法
創(chuàng)建和刪除
方法名 | 說(shuō)明 |
---|---|
public boolean createNewFile() | 創(chuàng)建一個(gè)新的空的文件 |
public boolean mkdir() | 創(chuàng)建一個(gè)單級(jí)文件夾 |
public boolean mkdirs() | 創(chuàng)建一個(gè)多級(jí)文件夾 |
public boolean delete() | 刪除由此抽象路徑名表示的文件或目錄 |
刪除目錄時(shí)的注意事項(xiàng):
- delete方法直接刪除不走回收站。
- 如果刪除的是一個(gè)文件,直接刪除。
- 如果刪除的是一個(gè)文件夾,需要先刪除文件夾中的內(nèi)容,最后才能刪除文件夾。
File類(lèi)判斷和獲取功能
方法名 | 說(shuō)明 |
---|---|
public boolean isDirectory() | 測(cè)試此抽象路徑名表示的File是否為目錄 |
public boolean isFile() | 測(cè)試此抽象路徑名表示的File是否為文件 |
public boolean exists() | 測(cè)試此抽象路徑名表示的File是否存在 |
public String getAbsolutePath() | 返回此抽象路徑名的絕對(duì)路徑名字符串 |
public String getPath() | 將此抽象路徑名轉(zhuǎn)換為路徑名字符串(File對(duì)象給定的路徑) |
public String getName() | 返回由此抽象路徑名表示的文件或目錄的名稱(chēng) |
File類(lèi)高級(jí)獲取功能
// 返回此抽象路徑名表示的目錄中的文件和目錄的File對(duì)象數(shù)組
public File[] listFiles();
listFiles方法注意事項(xiàng):
- 當(dāng)調(diào)用者不存在時(shí),返回null
- 當(dāng)調(diào)用者是一個(gè)文件時(shí),返回null
- 當(dāng)調(diào)用者是一個(gè)空文件夾時(shí),返回一個(gè)長(zhǎng)度為0的數(shù)組
- 當(dāng)調(diào)用者是一個(gè)有內(nèi)容的文件夾時(shí),將里面所有文件和文件夾的路徑放在File數(shù)組中返回
- 當(dāng)調(diào)用者是一個(gè)有隱藏文件的文件夾時(shí),將里面所有文件和文件夾的路徑放在File數(shù)組中返回,包含隱藏內(nèi)容
1.4 遞歸刪除文件夾及其下面的文件
public static void main(String[] args) {
File f = new File("D:\\aaa");
deleteFiles(f);
}
private static void deleteFiles(File f) {
File[] files = f.listFiles();
for (File file : files) {
if (file.isDirectory()) {
// 遞歸
deleteFiles(file);
} else {
// 刪除文件
file.delete();
}
}
// 刪除當(dāng)前文件夾
f.delete();
}
2. IO
I 表示intput ,是數(shù)據(jù)從硬盤(pán)進(jìn)內(nèi)存的過(guò)程,稱(chēng)之為讀數(shù)據(jù)。
O 表示output ,是數(shù)據(jù)從內(nèi)存到硬盤(pán)的過(guò)程。稱(chēng)之為寫(xiě)數(shù)據(jù)。
在數(shù)據(jù)傳輸?shù)倪^(guò)程中,是誰(shuí)在讀?是誰(shuí)在寫(xiě)?這個(gè)參照物是誰(shuí)?
IO的數(shù)據(jù)傳輸,可以看做是一種數(shù)據(jù)的流動(dòng),按照流動(dòng)的方向,以?xún)?nèi)存為參照物,進(jìn)行讀寫(xiě)操作。
簡(jiǎn)單來(lái)說(shuō):內(nèi)存在讀,內(nèi)存在寫(xiě)。
2.1 分類(lèi)
2.2 字節(jié)輸出流
OutputStream有很多子類(lèi),我們從最簡(jiǎn)單的一個(gè)子類(lèi)開(kāi)始。
java.io.FileOutputStream類(lèi)是文件輸出流,用于將數(shù)據(jù)寫(xiě)出到文件:
構(gòu)造方法:
-
public FileOutputStream(File file)
:創(chuàng)建文件輸出流以寫(xiě)入由指定的 File對(duì)象表示的文件。 -
public FileOutputStream(String name)
: 創(chuàng)建文件輸出流以指定的名稱(chēng)寫(xiě)入文件。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
字節(jié)輸出流寫(xiě)數(shù)據(jù)快速入門(mén) :
1 創(chuàng)建字節(jié)輸出流對(duì)象。
2 寫(xiě)數(shù)據(jù)
3 釋放資源
*/
public class OutputStreamDemo1 {
public static void main(String[] args) throws IOException {
// 創(chuàng)建字節(jié)輸出流對(duì)象
// 如果指定的文件不存在 , 會(huì)自動(dòng)創(chuàng)建文件
// 如果文件存在 , 會(huì)把文件中的內(nèi)容清空
FileOutputStream fos = new FileOutputStream("test\\a.txt");
// 寫(xiě)數(shù)據(jù)
// 寫(xiě)到文件中就是以字節(jié)形式存在的
// 只是文件幫我們把字節(jié)翻譯成了對(duì)應(yīng)的字符 , 方便查看
fos.write(97);
fos.write(98);
fos.write(99);
// 釋放資源
// while(true){}
// 斷開(kāi)流與文件中間的關(guān)系
fos.close();
}
}
字節(jié)流寫(xiě)數(shù)據(jù)的3種方式
方法名 | 說(shuō)明 |
---|---|
void write(int b) | 一次寫(xiě)一個(gè)字節(jié)數(shù)據(jù) |
void write(byte[] b) | 一次寫(xiě)一個(gè)字節(jié)數(shù)組數(shù)據(jù) |
void write(byte[] b, int off, int len) | 一次寫(xiě)一個(gè)字節(jié)數(shù)組的部分?jǐn)?shù)據(jù) |
public class OutputStreamDemo2 {
public static void main(String[] args) throws IOException {
// 創(chuàng)建字節(jié)輸出流對(duì)象
FileOutputStream fos = new FileOutputStream("test\\a.txt");
// 寫(xiě)數(shù)據(jù)
// 1 void write(int b) 一次寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
fos.write(97);
fos.write(98);
fos.write(99);
// 2 void write(byte[] b) 一次寫(xiě)一個(gè)字節(jié)數(shù)組數(shù)據(jù)
byte[] bys = {65, 66, 67, 68, 69};
fos.write(bys);
// 3 void write(byte[] b, int off, int len) 一次寫(xiě)一個(gè)字節(jié)數(shù)組的部分?jǐn)?shù)據(jù)
fos.write(bys, 0, 3);
// 釋放資源
fos.close();
}
}
字節(jié)流寫(xiě)數(shù)據(jù)的換行和追加寫(xiě)入
字節(jié)流寫(xiě)數(shù)據(jù)如何實(shí)現(xiàn)換行呢?
寫(xiě)完數(shù)據(jù)后,加換行符
windows : \r\n
linux : \n
mac : \r
字節(jié)流寫(xiě)數(shù)據(jù)如何實(shí)現(xiàn)追加寫(xiě)入呢?
public FileOutputStream(String name,boolean append)
創(chuàng)建文件輸出流以指定的名稱(chēng)寫(xiě)入文件。如果第二個(gè)參數(shù)為true ,不會(huì)清空文件里面的內(nèi)容。
2.3 字節(jié)輸入流
InputStream
FileInputStream extends InputStream
FileInputStream 構(gòu)造方法
- public FileInputStream(File file) : 從file類(lèi)型的路徑中讀取數(shù)據(jù)
- public FileInputStream(String name) : 從字符串路徑中讀取數(shù)據(jù)
import java.io.FileInputStream;
import java.io.IOException;
/*
字節(jié)輸入流寫(xiě)數(shù)據(jù)快速入門(mén) : 一次讀一個(gè)字節(jié)
第一部分 : 字節(jié)輸入流類(lèi)
InputStream類(lèi) : 字節(jié)輸入流最頂層的類(lèi) , 抽象類(lèi)
--- FileInputStream類(lèi) : FileInputStream extends InputStream
第二部分 : 構(gòu)造方法
public FileInputStream(File file) : 從file類(lèi)型的路徑中讀取數(shù)據(jù)
public FileInputStream(String name) : 從字符串路徑中讀取數(shù)據(jù)
第三部分 : 字節(jié)輸入流步驟
1 創(chuàng)建輸入流對(duì)象
2 讀數(shù)據(jù)
3 釋放資源
*/
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
// 創(chuàng)建字節(jié)輸入流對(duì)象
// 讀取的文件必須存在 , 不存在則報(bào)錯(cuò)
FileInputStream fis = new FileInputStream("day11_demo\\a.txt");
// 讀數(shù)據(jù) , 從文件中讀到一個(gè)字節(jié)
// 返回的是一個(gè)int類(lèi)型的字節(jié)
// 如果想看字符, 需要強(qiáng)轉(zhuǎn)
int by = fis.read();
System.out.println((char) by);
// 釋放資源
fis.close();
}
}
字節(jié)輸入流 讀多個(gè)字節(jié)
import java.io.FileInputStream;
import java.io.IOException;
/*
字節(jié)輸入流寫(xiě)數(shù)據(jù)快速入門(mén) : 讀多個(gè)字節(jié)
第一部分 : 字節(jié)輸入流類(lèi)
InputStream類(lèi) : 字節(jié)輸入流最頂層的類(lèi) , 抽象類(lèi)
--- FileInputStream類(lèi) : FileInputStream extends InputStream
第二部分 : 構(gòu)造方法
public FileInputStream(File file) : 從file類(lèi)型的路徑中讀取數(shù)據(jù)
public FileInputStream(String name) : 從字符串路徑中讀取數(shù)據(jù)
第三部分 : 字節(jié)輸入流步驟
1 創(chuàng)建輸入流對(duì)象
2 讀數(shù)據(jù)
3 釋放資源
*/
public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
// 創(chuàng)建字節(jié)輸入流對(duì)象
// 讀取的文件必須存在 , 不存在則報(bào)錯(cuò)
FileInputStream fis = new FileInputStream("day11_demo\\a.txt");
// 讀數(shù)據(jù) , 從文件中讀到一個(gè)字節(jié)
// 返回的是一個(gè)int類(lèi)型的字節(jié)
// 如果想看字符, 需要強(qiáng)轉(zhuǎn)
// 循環(huán)改進(jìn)
int by;// 記錄每次讀到的字節(jié)
while ((by = fis.read()) != -1) {
System.out.print((char) by);
}
// 釋放資源
fis.close();
}
}
2.4 文件的拷貝
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
需求 : 把 "圖片路徑\xxx.jpg" 復(fù)制到當(dāng)前模塊下
分析:
復(fù)制文件,其實(shí)就把文件的內(nèi)容從一個(gè)文件中讀取出來(lái)(數(shù)據(jù)源),然后寫(xiě)入到另一個(gè)文件中(目的地)
數(shù)據(jù)源:
xxx.jpg --- 讀數(shù)據(jù) --- FileInputStream
目的地:
模塊名稱(chēng)\copy.jpg --- 寫(xiě)數(shù)據(jù) --- FileOutputStream
*/
public class CopyFile2 {
public static void main(String[] args) throws IOException {
// 創(chuàng)建字節(jié)輸入流對(duì)象
FileInputStream fis = new FileInputStream("D:\\安裝包\\好看的圖片\\liqin.jpg");
// 創(chuàng)建字節(jié)輸出流
FileOutputStream fos = new FileOutputStream("day11_demo\\copy.jpg");
// 一次讀寫(xiě)一個(gè)字節(jié)
int by;
while ((by = fis.read()) != -1) {
fos.write(by);
}
// 釋放資源
fis.close();
fos.close();
}
}
2.5 文件拷貝效率優(yōu)化
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
需求 : 對(duì)復(fù)制圖片的代碼進(jìn)行使用一次讀寫(xiě)一個(gè)字節(jié)數(shù)組的方式進(jìn)行改進(jìn)
FileInputStream類(lèi) :
public int read(byte[] b):
1 從輸入流讀取最多b.length個(gè)字節(jié)的數(shù)據(jù)
2 返回的是真實(shí)讀到的數(shù)據(jù)個(gè)數(shù)
*/
public class FileInputStreamDemo7 {
public static void main(String[] args) throws IOException {
// 創(chuàng)建字節(jié)輸入流對(duì)象
FileInputStream fis = new FileInputStream("D:\\好看的圖片\\liqin.jpg");
// 創(chuàng)建字節(jié)輸出流
FileOutputStream fos = new FileOutputStream("day11_demo\\copy.jpg");
byte[] bys = new byte[1024];
int len;// 每次真實(shí)讀到數(shù)據(jù)的個(gè)數(shù)
//int by;//好像沒(méi)用上啊
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
// 釋放資源
fis.close();
fos.close();
}
}
2.6 釋放資源
JDK7版本優(yōu)化處理方式 : 自動(dòng)釋放資源
JDK7優(yōu)化后可以使用 try-with-resource 語(yǔ)句 , 該語(yǔ)句確保了每個(gè)資源在語(yǔ)句結(jié)束時(shí)自動(dòng)關(guān)閉。簡(jiǎn)單理解 : 使用此語(yǔ)句,會(huì)自動(dòng)釋放資源 , 不需要自己在寫(xiě)finally代碼塊了
格式 :
try (創(chuàng)建流對(duì)象語(yǔ)句1 ; 創(chuàng)建流對(duì)象語(yǔ)句2 ...) {
// 讀寫(xiě)數(shù)據(jù)
} catch (IOException e) {
處理異常的代碼...
}
舉例 :
try (
FileInputStream fis1 = new FileInputStream("day11_demo\\a.txt") ;
FileInputStream fis2 = new FileInputStream("day11_demo\\b.txt") )
{
// 讀寫(xiě)數(shù)據(jù)
} catch (IOException e) {
處理異常的代碼...
}
代碼實(shí)踐
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
JDK7版本優(yōu)化處理方式
需求 : 對(duì)上一個(gè)賦值圖片的代碼進(jìn)行使用捕獲方式處理
*/
public class FileInputStreamDemo5 {
public static void main(String[] args) {
try (
// 創(chuàng)建字節(jié)輸入流對(duì)象
FileInputStream fis = new FileInputStream("D:\\圖片\\liqin.jpg");
// 創(chuàng)建字節(jié)輸出流
FileOutputStream fos = new FileOutputStream("day11_demo\\copy.jpg")
) {
// 一次讀寫(xiě)一個(gè)字節(jié)
int by;
while ((by = fis.read()) != -1) {
fos.write(by);
}
// 釋放資源 , 發(fā)現(xiàn)已經(jīng)灰色 , 提示多余的代碼
// 所以使用 try-with-resource 方式會(huì)自動(dòng)關(guān)流
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:自動(dòng)釋放的資源是實(shí)現(xiàn)了 AutoCloseable 接口的才可以。
2.7 緩沖流
字節(jié)緩沖流:
- BufferOutputStream:緩沖輸出流
- BufferedInputStream:緩沖輸入流
構(gòu)造方法:
- 字節(jié)緩沖輸出流:BufferedOutputStream(OutputStream out)
- 字節(jié)緩沖輸入流:BufferedInputStream(InputStream in)
copy 文件實(shí)操
copyFile2("D:\\work\\test\\file_io\\xian.jpg",
"D:\\work\\test\\file_io\\xian2.jpg");
static void copyFile2(String fileUrl1, String fileUrl2){
try(
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileUrl1));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileUrl2))
){
byte[] readArray = new byte[1024];
// 每次真實(shí)讀到數(shù)據(jù)的個(gè)數(shù)
int len;
while((len = bis.read(readArray)) != -1){
bos.write(readArray, 0 ,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("文件未找到!");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("異常啦!");
}
}
2.8 編碼表
- 計(jì)算機(jī)中儲(chǔ)存的信息都是用二進(jìn)制數(shù)據(jù)表示的;我們?cè)谄聊簧峡吹降挠⑽?、漢字等字符是二進(jìn)制數(shù)轉(zhuǎn)換之后的結(jié)果
- 按照編碼表規(guī)則,將字符存儲(chǔ)到計(jì)算機(jī)中,稱(chēng)為編碼。
- 按照同樣的編碼表規(guī)則,將存儲(chǔ)在計(jì)算機(jī)中的二進(jìn)制數(shù)據(jù)解析顯示出來(lái),稱(chēng)為解碼 。
- 編碼和解碼使用的碼表必須一致,否則會(huì)導(dǎo)致亂碼。
常見(jiàn)編碼表:
- ASCII碼表:ASCII(American Standard Code for Information Interchange,美國(guó)信息交換標(biāo)準(zhǔn)碼表):
包括了數(shù)字字符,英文大小寫(xiě)字符和一些常見(jiàn)的標(biāo)點(diǎn)符號(hào)字符。
注意:ASCII碼表中是沒(méi)有中文的。
- GBK:window系統(tǒng)默認(rèn)的碼表。兼容ASCII碼表,也包含了21003個(gè)漢字,并支持繁體漢字以及部分日韓文字。
注意:GBK是中國(guó)的碼表,一個(gè)中文以兩個(gè)字節(jié)的形式存儲(chǔ)。但不包含世界上所有國(guó)家的文字。
- Unicode碼表:
由國(guó)際組織ISO 制定,是統(tǒng)一的萬(wàn)國(guó)碼表,計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),容納世界上大多數(shù)國(guó)家的所有常見(jiàn)文字和符號(hào)。
但是因?yàn)楸硎镜淖址?,所以Unicode碼表中的數(shù)字不是直接以二進(jìn)制的形式存儲(chǔ)到計(jì)算機(jī)的,會(huì)先通過(guò)UTF-7,UTF-7.5,UTF-8,UTF-16,以及 UTF-32的編碼方式再存儲(chǔ)到計(jì)算機(jī),其中最為常見(jiàn)的就是UTF-8。
注意: Unicode是萬(wàn)國(guó)碼表,以UTF-8編碼后一個(gè)中文以三個(gè)字節(jié)的形式存儲(chǔ)。
3. commons-io 工具包
3.1 API
org.apache.commons.io.IOUtils類(lèi)
public static int copy(InputStream in, OutputStream out):
//把input輸入流中的內(nèi)容拷貝到output輸出流中,返回拷貝的字節(jié)個(gè)數(shù)(適合文件大小為2GB以下)
public static long copyLarge(InputStream in, OutputStream out):
//把input輸入流中的內(nèi)容拷貝到output輸出流中,返回拷貝的字節(jié)個(gè)數(shù)(適合文件大小為2GB以上)
org.apache.commons.io.FileUtils文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-448181.html
public static void copyFileToDirectory(final File srcFile, final File destFile):
復(fù)制文件到另外一個(gè)目錄下。
public static void copyDirectoryToDirectory(File src , File dest ):
復(fù)制src目錄到dest位置。
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-448181.html
到了這里,關(guān)于【Java 基礎(chǔ)】File & IO流的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!