Java文件管理操作的知識(shí)點(diǎn)整理
一.基本文件操作
獲取及判斷文件屬性
代碼示例如下:
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());
//創(chuàng)建文件前
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println("---------------");
//創(chuàng)建文件后
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():獲取上級(jí)目錄,若無指定則返回null
getName():獲取當(dāng)前文件名
getPath():獲取以工作目錄為基準(zhǔn)的相對(duì)路徑
getAbsolutePath():獲取以盤頭為起始點(diǎn)的絕對(duì)路徑
getCanonicalPath():同上,但是會(huì)進(jìn)行一些精簡(jiǎn)
exists():判斷文件是否存在
isDirectory():判斷文件是否是目錄
isFile():判斷文件是否是文件
delete():刪除文件
上述代碼的運(yùn)行結(jié)果如下:

創(chuàng)建及修改文件
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();
//退出時(shí)刪除
file.deleteOnExit();
System.out.println(file.exists());
}
}
deleteOnExit():退出時(shí)刪除
createNewFile():創(chuàng)建對(duì)應(yīng)文件
public class test {
public static void main(String[] args) throws IOException {
File file = new File("./test");
//創(chuàng)建單級(jí)目錄
file.mkdir();
//創(chuàng)建多級(jí)目錄
File file1 = new File("test1/a/11");
file1.mkdirs();
}
}
上述代碼運(yùn)行結(jié)果如下:

mkdir():根據(jù)路徑創(chuàng)建單級(jí)目錄
mkdirs():根據(jù)路徑創(chuàng)建多級(jí)目錄
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():將一個(gè)文件的名字賦值給另一個(gè)文件
二.文件讀寫
讀文件
字節(jié)流
我們事先準(zhǔn)備一個(gè)test.txt文件,里面包含內(nèi)容"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);
}
//關(guān)閉文件
inputStream.close();
}
}實(shí)際上,read()有很多個(gè)版本,具體如下:

上述代碼中使用的是第一個(gè)版本,一次讀取一個(gè)字節(jié),并將這個(gè)字節(jié)的內(nèi)容作為返回值返回,如果讀取到文件結(jié)束符(EOF),則返回-1.
第二個(gè)版本要求一個(gè)"輸出型參數(shù)"---一個(gè)字節(jié)數(shù)組.read()會(huì)從文件里把內(nèi)容全部讀入該字節(jié)數(shù)組中,若溢出則截?cái)?
第三個(gè)版本與第二個(gè)版本相似,只不過允許通過參數(shù)控制數(shù)據(jù)的傳入起點(diǎn)和終點(diǎn)(也即允許傳入的數(shù)據(jù)長(zhǎng)度).
上述代碼的運(yùn)行結(jié)果如下:

可見讀取的是"Hello"每個(gè)字符對(duì)應(yīng)的ASCII碼值.
這樣可讀性無疑是很低的,我們可以將其轉(zhuǎn)為字符串的形式輸出,代碼示例如下:
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);
//關(guān)閉文件
inputStream.close();
}
}我們可以通過讀出來的字節(jié)數(shù)組,反向構(gòu)造出其原本的字符串,這樣就能得到"Hello"了,但這樣無疑很麻煩.因此,對(duì)于這種非二進(jìn)制的數(shù)組,我們可以使用字符流.
字符流
字符流對(duì)應(yīng)著Reader和FileReader兩個(gè)關(guān)鍵字.
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碼值.
其他要點(diǎn)
1.InputStream和Reader兩個(gè)都是抽象類,沒辦法直接實(shí)例化.因此我們需要借助他們的子類FileInputStream和FileReader來實(shí)例化.
2.我們創(chuàng)建的文件都在硬盤上,直接操作的話比較困難.因此我們嘗試在內(nèi)存上創(chuàng)建一個(gè)媒介,間接的操作硬盤上的文件.我們將InputStream和Reader這種媒介成為句柄(Handler).
3.上述代碼的寫法實(shí)際上是不嚴(yán)謹(jǐn)?shù)?因?yàn)橐坏┏绦蛟谶\(yùn)行途中拋出了異常,代碼末尾的close()就無法執(zhí)行.因此我們應(yīng)該把close()放在finally下.保證在文件描述符表上的資源得以釋放.
4.關(guān)于文件描述符表:文件描述符表可以簡(jiǎn)單理解成PCB中的一個(gè)數(shù)組/順序表.數(shù)組中的每個(gè)元素都對(duì)應(yīng)著當(dāng)前進(jìn)程打開的文件.這個(gè)數(shù)組的下標(biāo),就稱為"文件描述符".每當(dāng)我們打開一個(gè)文件時(shí),就會(huì)在文件描述符表中占據(jù)一個(gè)位置;每次關(guān)閉文件,都會(huì)釋放一個(gè)位置.然而文件描述表的長(zhǎng)度是存在上限的,如果在進(jìn)程中一直打開文件而不釋放,這就會(huì)導(dǎo)致進(jìn)程在后續(xù)打開文件的時(shí)候拋出異常.
5.實(shí)際上,我們有一套更實(shí)用的方法從文件中讀取內(nèi)容,代碼示例如下:
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構(gòu)造函數(shù)的參數(shù),這樣我們就可以使用Scanner靈活讀取文件內(nèi)部的內(nèi)容.
寫文件
字節(jié)流
對(duì)于字節(jié)流的輸入方式,我們有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();
}
}
}字符流
對(duì)于字符流的輸入方式,我們有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();
}
}
}
字節(jié)流封裝
與讀取文件內(nèi)容部分一樣,我們可以將字節(jié)流封裝,其可以靈活的向文件內(nèi)寫內(nèi)容.
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();
}
}
}
此處封裝過后,就可以如常規(guī)輸出一樣,向文件里輸入內(nèi)容.代碼中flush()的作用在于清空輸入緩沖區(qū)的內(nèi)容,使println()輸出的內(nèi)容能成功到文件中.
其他要點(diǎn)
上述代碼中我們把OutputStream等輸入輸出流放在try()中,其目的是在代碼結(jié)束后可以自動(dòng)調(diào)用close()方法釋放文件描述符表,防止忘記.這要求這個(gè)類要實(shí)現(xiàn)Closeable接口.
到此這篇關(guān)于Java文件管理操作的知識(shí)點(diǎn)整理的文章就介紹到這了,更多相關(guān)Java文件管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring2.5.6開發(fā)環(huán)境搭建圖文教程
這篇文章主要為大家詳細(xì)介紹了Spring2.5.6開發(fā)環(huán)境搭建圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
基于Java語(yǔ)言實(shí)現(xiàn)Socket通信的實(shí)例
今天小編就為大家分享一篇關(guān)于基于Java語(yǔ)言實(shí)現(xiàn)Socket通信的實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01
Java設(shè)計(jì)模式之Builder建造者模式
這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之Builder建造者模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
手寫mybatis完整sql插件問題及實(shí)現(xiàn)思路
大家在使用mybatis的過程中,mysql日志功能一般不會(huì)直接放到數(shù)據(jù)庫(kù)中執(zhí)行的,今天小編重點(diǎn)給大家分享手寫mybatis完整sql插件問題及實(shí)現(xiàn)思路,對(duì)mybatis完整sql插件相關(guān)知識(shí)感興趣的朋友一起看看吧2021-05-05
java線程安全鎖ReentrantReadWriteLock原理分析readLock
這篇文章主要為大家介紹了java線程安全鎖ReentrantReadWriteLock原理分析readLock,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10

