Java中對於文件的操作主要用File類,它既能操作文件,又能操作目錄,功能類似於.NET中Directory和File的集合,在java7之後,java.nio.file中提供了更爲強大的Files來操作文件。
讀操作
- exists:判斷文件或者文件夾是否存在
- isDir:判斷是否是文件夾,所以判斷文件夾是否存在時,不單單要判斷exists,還要判斷isDir
- isFile:顧名思義,判斷是不是文件
- list:遍歷文件夾,返回值是文件路徑,不管是文件夾還是文件,一視同仁返回,需要自己篩選,如果沒有子級,返回null
- listFile:也是遍歷文件夾,不過返回值是File對象,值得一提的是,不管是list還是listFile都不會遍歷子文件夾,需要自己寫遞歸函數,可以考慮使用Files中的walk和walkFileTree來遍歷,如:
Path fp=Paths.get(path);
Stream<Path> sfp=Files.walk(fp);
//filter是一個篩選器,比如isRegularFile篩選文件、isDirectory篩選文件夾
//你也可以這樣寫:filter(f -> f.endsWith(".txt"))來篩選txt文件
sfp.filter(Files::isRegularFile).map(x->x.toString()).collect(Collectors.toList());
- getParent:獲取父級文件名稱,如果沒有父級就返回null
- getParentFile:同getParent,返回值不同
- getName:返回當前文件或文件夾的名稱
- getAbsolutePath:返回絕對地址
- getFreeSpace:獲取目錄所在磁盤的剩餘空間,以字節爲單位
- getTotalSpace:獲取目錄所在磁盤的總空間,以字節位單位
- isAbsolute:判斷文件路徑是否爲絕對路徑
- isHidden:判斷指定的文件是是隱藏文件
- length:如果是文件,那就是文件大小;如果是文件夾,那這個就是目錄元數據的大小,文件夾的大小請自行遍歷累加
- canExecute:能否被執行
- canRead:能否讀取
- canWrite:能否修改
- lastModified:獲取文件的最後一次被修改時間,注意和.NET不同的是,這是一個UTC時間
寫操作
- mkdir:創建文件夾
- mkdirs:創建文件夾,與mkdir不同的是,mkdir只會創建最後一級文件夾,若父級文件夾不存在則創建失敗,而mkdirs則會創建路徑上所有不存在的文件夾
- renameTo:變更文件名稱
- setExecutable:設置可執行權限
- setReadable:設置讀取權限
- setWritable:設置寫權限
- setLastModified:設置最後一次修改時間
- delete:刪除文件
- deleteOnExit:非常有意思的操作,在程序結束時再刪除
- createNewFile:創建文件
File當中並沒有拷貝操作,需要拷貝的話,需要自己讀取並寫入:
File f1=new File("D:\\1.txt");
File f2=new File("D:\\2.txt");
try{
FileInputStream fis=new FileInputStream(f1);
FileOutputStream fos=new FileOutputStream(f2);
byte[]buffer=new byte[1024];
int length=fis.read(buffer);
do{
fos.write(buffer,0,length);
length=fis.read(buffer);
}while(length>0);
}catch(Exception e){
e.printStackTrace();
}
或者使用Files.copy來操作
Path p1= Paths.get("D:\\1.txt");
Path p2= Paths.get("D:\\2.txt");
try {
Files.copy(p1,p2, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
e.printStackTrace();
}
文件IO算是java中最常見的操作之一了,很遺憾File中並沒有readAllLines和writeAllLines方法,比較常見的是用FileReader:
File fl = new File("D:\\屏蔽詞.txt");
try {
FileReader fileReader = new FileReader(fl.toString());
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
bufferedReader.close();
fileReader.close();
} catch (Exception e) {
e.printStackTrace();
}
當然Files直接封裝了方法:
Path path = Paths.get("D:\\屏蔽詞.txt");
try {
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
for (String line : lines) {
System.out.println(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
不過由於readAllLines會將文件一次性加載到內存中,所以Files中又提供了lines方法來逐行加載,避免大文件操作時的內存損耗,如:
try {
Path path = Paths.get("D:\\屏蔽詞.txt");
Stream<String> lines = Files.lines(path);
lines.forEach(line -> {
System.out.println(line);
});
} catch (Exception ex) {
ex.printStackTrace();
}
此外Scanner中也提供了不少和文件相關的操作:
File fl = new File("D:\\屏蔽詞.txt");
try {
Scanner scanner = new Scanner(fl);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
寫文件一般用FileWriter和BufferedWriter:
try {
FileWriter fileWriter = new FileWriter("D:\\新屏蔽詞.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
for (int i = 0; i < 100; i++) {
bufferedWriter.write(i + ":測試");
bufferedWriter.newLine(); //換新行
}
bufferedWriter.flush();
bufferedWriter.close();
fileWriter.close();
} catch (Exception ex) {
ex.printStackTrace();
}
Files中也提供了文件相關的操作:
try {
Path path = Paths.get("D:\\屏蔽詞.txt");
Files.write(path,"別說話".getBytes());
} catch (Exception ex) {
ex.printStackTrace();
}
寫入多行:
List<String> lines = new ArrayList<>();
lines.add("第一行");
lines.add("第二行");
lines.add("第三行");
lines.add("第四行");
lines.add("第五行");
try {
Path path = Paths.get("D:\\屏蔽詞.txt");
Files.write(path, lines, StandardCharsets.UTF_8);
} catch (Exception ex) {
ex.printStackTrace();
}