目錄
1. File 概述
1.1 File的屬性
1.2 File的構(gòu)造方法
1.3 File的方法
2.讀文件
2.1 InputStream 概述
2.2 FileInputStream 概述
2.3 正確打開和關(guān)閉文件的方式
2.4 不同方式讀取文件代碼示例
2.4 另一種方法:利用?Scanner 進(jìn)行字符讀取
3.寫文件
3.1 OutputStream 概述
3.2?利用 OutputStreamWriter 進(jìn)行字符寫入
4. 讀文件和寫文件的其他方式: Reader 和 Writer?
4.1 Reader 讀取文件
4.2 Writer 寫文件
1. File 概述
Java 中通過 java.io.File 類來對?個文件(包括目錄)進(jìn)行抽象的描述。注意,有 File 對象, 并不代表真實存在該文件。
我們先來看看 File 類中的常見屬性、構(gòu)造方法和方法:
1.1 File的屬性
修飾符及類型 | 屬性 | 說明 |
static String | pathSeparator | 依賴于系統(tǒng)的路徑分隔符,String 類型的表示 |
static char | pathSeparator | 依賴于系統(tǒng)的路徑分隔符,char 類 型的表示 |
1.2 File的構(gòu)造方法
簽名 | 說明 |
File(File parent, String child) | 根據(jù)父目錄 + 孩子文件路徑,創(chuàng)建?個新的 File 實例 |
File(String pathname) | 根據(jù)文件路徑創(chuàng)建?個新的 File 實例,路徑可以是絕對路徑或者相對路徑 |
File(String parent, String child) | 根據(jù)父目錄 + 孩子文件路徑,創(chuàng)建?個新的 File 實 例,父目錄用路徑表示 |
其中 File(String pathname) 使用的最多,下面是使用實例:
File f1 = new File("C:/Users/1/test.txt");
File f2 = new File("./test.txt");
1.3 File的方法
修飾符及返回值類型 | 方法簽名 | 說明 |
String | getParent() | 返回 File 對象的父目錄文件路徑 |
String | getName() | 返回 FIle 對象的純文件名稱 |
String | getPath() | 返回 File 對象的文件路徑 |
String | getAbsolutePath() | 返回 File 對象的絕對路徑 |
String | getCanonicalPath() | 返回 File 對象的修飾過的絕對路徑 |
boolean | exists() | 判斷 File 對象描述的文件是否真實存在 |
boolean | isDirectory() | 判斷 File 對象代表的文件是否是?個目錄 |
boolean | isFile() | 判斷 File 對象代表的文件是否是?個普通文件 |
boolean | createNewFile() | 根據(jù) File 對象,?動創(chuàng)建?個空文 件。成功創(chuàng)建后返回 true |
boolean | delete() | 根據(jù) File 對象,刪除該文件。成功 刪除后返回 true |
void | deleteOnExit() | 根據(jù) File 對象,標(biāo)注文件將被刪 除,刪除動作會到 JVM 運(yùn)行結(jié)束時 才會進(jìn)行 |
String[] | list() | 返回 File 對象代表的目錄下的所有文件名 |
File[] | listFiles() | 返回 File 對象代表的目錄下的所有文件,以 File 對象表示 |
boolean | mkdir() | 創(chuàng)建 File 對象代表的目錄 |
boolean | mkdirs() | 創(chuàng)建 File 對象代表的目錄,如果必 要,會創(chuàng)建中間目錄 |
boolean | renameTo(File dest) | 進(jìn)行文件改名,也可以視為我們平時的剪切、粘貼操作 |
boolean | canRead() | 判斷用戶是否對文件有可讀權(quán)限 |
boolean | canWrite() | 判斷用戶是否對文件有可寫權(quán)限 |
使用示例
getParent(),getName(),getPath(),getAbsolutePath(),getCanonicalPath()
public static void main(String[] args) throws IOException {
File f = new File("C:/Users/1/test.txt");
//File f = new File("./test.txt");
System.out.println(f.getParent());
System.out.println(f.getName());
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
}
exists(),isDirectory(),isFile(),createNewFile()
createNewFile():?根據(jù) File 對象,自動創(chuàng)建?個空文件。成功創(chuàng)建后返回 true
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
boolean ret = file.createNewFile();
System.out.println("ret = " + ret);
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
}
?
delete(),deleteOnExit()
delete():根據(jù) File 對象,刪除該文件。成功刪除后返回 true
public static void main(String[] args) throws InterruptedException {
File file = new File("./test.txt");
boolean ret = file.delete();
System.out.println("ret = " + ret);
}
deleteOnExit():根據(jù) File 對象,標(biāo)注文件將被刪除,刪除動作會到 JVM 運(yùn)?結(jié)束時才會進(jìn)行
public static void main(String[] args) throws InterruptedException {
File file = new File("./test.txt");
//等程序結(jié)束后再刪除文件
file.deleteOnExit();
Thread.sleep(3000);
}
list(),listFiles()
list():返回 File 對象代表的目錄下的所有文件名
public static void main(String[] args) {
File file = new File(".");
String[] files = file.list();
System.out.println(Arrays.toString(files));
}
listFiles():返回 File 對象代表的目錄下的所有?件,以 File 對象表?
public static void main(String[] args) {
File file = new File(".");
File[] files = file.listFiles();
System.out.println(Arrays.toString(files));
}
mkdir():創(chuàng)建 File 對象代表的目錄
public static void main(String[] args) {
File f = new File("./aaa");
//需要在構(gòu)造方法中把路徑創(chuàng)建好,再通過mkdir來創(chuàng)建
boolean ret = f.mkdir();
//boolean ret = f.mkdirs(); //創(chuàng)建多級目錄
System.out.println(ret);
}
mkdirs():創(chuàng)建 File 對象代表的目錄,如果必要,會創(chuàng)建中間目錄
public static void main(String[] args) {
File f = new File("./aaa/bbb/ccc");
//需要在構(gòu)造方法中把路徑創(chuàng)建好,再通過mkdir來創(chuàng)建
boolean ret = f.mkdirs(); //創(chuàng)建多級目錄
System.out.println(ret);
}
renameTo(File dest):進(jìn)行文件改名,也可以視為我們平時的剪切、粘貼操作
修改文件名:
public static void main(String[] args) {
File src = new File("./test.txt");
File dest = new File("./test2.txt");
boolean ret = src.renameTo(dest);//重命名和移動目錄
System.out.println(ret);
}
修改路徑:
public static void main(String[] args) {
File src = new File("./test2.txt");
File dest = new File("./aaa/test2.txt");
boolean ret = src.renameTo(dest);//重命名和移動目錄
System.out.println(ret);
}
2.讀文件
2.1 InputStream 概述
方法
修飾符及返回值類型 | 方法簽名 | 說明 |
int | read() | 讀取?個字節(jié)的數(shù)據(jù),返回 -1 代表已經(jīng)完全讀完了 |
int | read(byte[] b) | 最多讀取 b.length 字節(jié)的數(shù)據(jù)到 b 中,返回實際讀到的數(shù)量;-1 代表已經(jīng)讀完了 |
int | read(byte[] b, int off, int len) | 最多讀取 len - off 字節(jié)的數(shù)據(jù)到 b 中,從 off 開始,返回實際讀到的數(shù)量;-1 代表已經(jīng)讀完了 |
void | close() | 關(guān)閉字節(jié)流 |
byte[] b 是一個輸出型參數(shù), 會將文件的內(nèi)容讀取到b數(shù)組中,單位是字節(jié).?
說明
InputStream 只是?個抽象類,要使?還需要具體的實現(xiàn)類。關(guān)于 InputStream 的實現(xiàn)類有很多,基本可以認(rèn)為不同的輸入設(shè)備都可以對應(yīng)?個 InputStream 類,我們現(xiàn)在只關(guān)心從文件中讀取,所以使用?FileInputStream
2.2 FileInputStream 概述
構(gòu)造方法
簽名 | 說明 |
FileInputStream(File file) | 利? File 構(gòu)造文件輸?流 |
FileInputStream(String name) | 利?文件路徑構(gòu)造文件輸?流 |
2.3 正確打開和關(guān)閉文件的方式
不建議使用下面這種方式來關(guān)閉文件:
因為在文件操作的執(zhí)行過程中, 程序可能會在中途退出, 如遇到 return, 或者拋出異常未正確處理等, 會導(dǎo)致文件無法正常關(guān)閉, 造成文件資源泄露.
文件資源泄露:在java PCB中有文件描述符表, 記錄了當(dāng)前進(jìn)程都打開了哪些文件, 每次打開一個文件, 都是需要在文件描述符表中占據(jù)一個位置, 如果不關(guān)閉還一直打開其他文件, 就會導(dǎo)致文件描述符表被耗盡(文件描述符表長度有上限). 當(dāng)文件描述符表被耗盡后, 后續(xù)再打開文件就會打開失敗, 就會一起后續(xù)一系列的邏輯出現(xiàn)問題.
下面是建議使用的文件關(guān)閉方法:
1.使用finally
在javaSE中提到過finally的一個知識點(diǎn):
try {
// 可能會發(fā)生異常的代碼
} catch (Exception e) {
// 異常處理
} finally {
// 無論是否發(fā)生異常,都會執(zhí)行的代碼
}
2. 使用java中提供的"try-with-resources"語句
Java中提供了"try-with-resources"語句,用于自動關(guān)閉實現(xiàn)了"AutoCloseable"接口的資源,無需顯式調(diào)用close()方法來關(guān)閉資源。這個語句可以在代碼塊結(jié)束后自動關(guān)閉資源,無論代碼塊是正常執(zhí)行完畢還是發(fā)生了異常。
?
2.4 不同方式讀取文件代碼示例
1.每次讀取一個字節(jié), 以16進(jìn)制輸出:
public static void main(String[] args) throws IOException{
try(InputStream inputStream = new FileInputStream("./test.txt")) {
//進(jìn)行文件操作
while(true) {
int n = inputStream.read();
if(n == -1) {
//文件讀取完畢
break;
}
//打印這個字節(jié)的數(shù)據(jù)
System.out.printf("%x ",n);
}
}
}
?
2.一次讀取若干個字節(jié),以String字符串的形式輸出:
public static void main(String[] args) throws IOException{
try(InputStream inputStream = new FileInputStream("./test.txt")) {
//進(jìn)行文件操作
while(true) {
byte[] buffer = new byte[1024];
int n = inputStream.read(buffer);
if(n == -1) {
//文件讀取完畢
break;
}
//打印這個字節(jié)的數(shù)據(jù)
String s = new String(buffer,0,n);
System.out.print(s);
}
}
}
2.4 另一種方法:利用?Scanner 進(jìn)行字符讀取
上述例子中,我們看到了對字符類型直接使用?InputStream 進(jìn)行讀取是非常麻煩且困難的,所以,我們使用一種我們之前比較熟悉的類來完成該工作,就是 Scanner 類。
public static void main(String[] args) {
try(InputStream inputStream = new FileInputStream(",/test.txt")) {
Scanner scanner = new Scanner(inputStream);
while(scanner.hasNext()) {
String s = scanner.next();
System.out.println(s);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
3.寫文件
3.1 OutputStream 概述
方法
返回值類型 |
?法簽名 | 說明 |
void | write(int b) | 寫入一個字節(jié)的數(shù)據(jù) |
void | write(byte[] b) | 將 b 這個字符數(shù)組中的數(shù)據(jù)全部寫入 os 中 |
int | write(byte[] b, int off, int len) | 將 b 這個字符數(shù)組中從 off 開始的數(shù)據(jù)寫入 os 中,?共寫 len 個 |
void | close() | 關(guān)閉字節(jié)流 |
void | flush() | 見下面 |
flush()重要:我們知道 I/O 的速度是很慢的,所以,大多的 OutputStream 為了減少設(shè)備操作的次數(shù),在寫數(shù)據(jù)的時候都會將數(shù)據(jù)先暫時寫入內(nèi)存的?個指定區(qū)域里,直到該區(qū)域滿了或者其他指定條件時才真正將數(shù)據(jù)寫入設(shè)備中,這個區(qū)域?般稱為緩沖區(qū)。但造成?個結(jié)果,就是我們寫的數(shù)據(jù),很可能會遺留?部分在緩沖區(qū)中。需要在最后或者合適的位置,調(diào)用?flush(刷新)操作,將數(shù)據(jù)刷到設(shè)備中.
說明
OutputStream 同樣只是?個抽象類,要使?還需要具體的實現(xiàn)類。我們現(xiàn)在還是只關(guān)心寫入文件 中,所以使? FileOutputStream
3.2?利用 OutputStreamWriter 進(jìn)行字符寫入
public static void main(String[] args) {
//使用OutPutStream來寫文件
try(OutputStream outputStream = new FileOutputStream("./test.txt")) {
byte[] buffer = new byte[]{97,98,99,100,101,102};
outputStream.write(buffer);
// 不要忘記 flush
outputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
} ;
}
?文件中得到的結(jié)果:
注意:?
如果要以追加的形式寫文件,需要在FileOutputStream的構(gòu)造方法中加true參數(shù):
寫入英文字符串
public static void main(String[] args) {
//使用OutPutStream來寫文件
try(OutputStream outputStream = new FileOutputStream("./test.txt")) {
String s = "Nothing";
byte[] buffer = s.getBytes();
outputStream.write(buffer);
// 不要忘記 flush
outputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
寫入中文字符串
public static void main(String[] args) {
//使用OutPutStream來寫文件
try(OutputStream outputStream = new FileOutputStream("./test.txt")) {
String s = "你好中國";
byte[] buffer = s.getBytes("utf-8");
outputStream.write(buffer);
// 不要忘記 flush
outputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
4. 讀文件和寫文件的其他方式: Reader 和 Writer?
Reader 和 Writer 的使用方式和 InputStream,OutputStream 類似, 具體使用方式可以參考這兩個
4.1 Reader 讀取文件
方法
使用示例:??
public static void main(String[] args) {
//使用字符流讀取文件內(nèi)容
try(Reader reader = new FileReader("./test.txt")) {
while(true) {
char[] buffer = new char[1024];
int n = reader.read(buffer);
if(n == -1) {
break;
}
String s = new String(buffer,0,n);
System.out.println(s);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
4.2 Writer 寫文件
方法?
使用示例:?
public static void main(String[] args) {
try(Writer writer = new FileWriter("./test.txt")) {
String s = "你好";
writer.write(s);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
?如果要以追加的形式寫文件, 只需要在在構(gòu)造方法中加一個true即可:文章來源:http://www.zghlxwxcb.cn/news/detail-803426.html
Writer writer = new FileWriter("./test.txt",true)
文章來源地址http://www.zghlxwxcb.cn/news/detail-803426.html
到了這里,關(guān)于【JavaEE】文件操作: File 類的用法和 InputStream, OutputStream 的用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!