java IO(一):File類

1.File類簡介

File類位于java.io包中。它面向文件層次級別操作、查看文件,而字節流、字符流操作數據時顯然比之更底層。

學習File類包括以下幾個重點:文件路徑、文件分隔符、創建文件(目錄)、刪除文件(目錄)、查看文件內容(輸出目錄內文件)、判斷文件(是文件/目錄?存在否?可讀寫執行?)、獲取文件信息(文件名、路徑名、大小等),最后還有如何篩選所需文件

2.創建、刪除文件/目錄

File類有四個構造方法:File(String pathname)、File(String parent,String child)、File(File parent,String child)、File(URI uri),暫不考慮最后一個。

File file1 = new File("D:\\myjava\\a.txt");      //File(String pathname)
File file2 = new File("D:\\myjava","a\\b.txt");  //File(String parent,String child)
File file3 = new File(file2,"abc");            //File(File parent,String child)

new一個File對象后,表示創建了一個File實例,不代表在文件系統中創建了實際的文件。要創建實際的文件、目錄,應該使用File類中提供的方法:

  • boolean createNewFile() throws IOException:創建一個新的空文件,僅當文件不存在時才創建并返回true。
  • static createTempFile():創建臨時文件。
  • boolean mkdir():創建空目錄,僅當父路徑存在且待創建目錄不存在時才創建并返回true。注:不會遞歸創建父目錄。
  • boolean mkdirs():和mkdir()不同的是,mkdirs()會遞歸創建所有所需要的父路徑。

例如,在d:\myjava(已存在)中創建d:\myjava\a.txt,d:\myjava\a\abc\c.txt,以下提供了一種方法。

File file0 = new File("xyz.txt");   //相對路徑,相對于system屬性中的user.dir路徑
File file1 = new File("D:\\myjava\\a.txt");
File file2 = new File("D:\\myjava","a\\abc");
File file3 = new File(file2,"c.txt");try {System.out.println(file1.createNewFile());   //try ... catch createNewFile()System.out.println(file2.mkdirs());System.out.println(file3.createNewFile());
} catch (IOException e) {e.printStackTrace();}

注意上面的雙反斜線\\,因為Windows系統的文件分隔符為\,而這是轉義符號,因此需要對\自身進行轉義。Unix操作系統中的文件分隔符號為/,但Windows也同樣能夠正確使用/作為分隔符。

執行代碼,由于第一次創建文件,所以都返回true,但第二次執行都將返回false,因為待創建文件都已存在。如下:

λ java TestCreate
true
true
trueλ java TestCreate
false
false
false

File類只提供了一個delete()方法用來刪除文件和目錄,且刪除目錄時只能刪除空目錄。注:此為永久刪除,不進入回收站。

System.out.println(file1.delete()); //true
System.out.println(file2.delete()); //false
File file4 = new File("d:/myjava/a/abc/c.txt");
System.out.println(file4.delete()); //true

文件名和路徑相關問題

每一個File對象都有父路徑、文件名,兩者結合就是文件的絕對路徑。此外,路徑還分為相對路徑(抽象路徑)、絕對路徑。

以unix的路徑命名方式為例,絕對路徑/etc/ssh/ssh_config中/etc/ssh為dirname,即父路徑,ssh_config為basename。Windows中也差不多,如絕對路徑c:\windows\system32\drivers\etc\hosts中的dirname為c:\windows\system32\drivers\etc,basename部分為hosts。

以下是File類提供的與文件名、父路徑、路徑相關的方法。

  • getName():獲取文件名。獲取的內容是file對象中給定的抽象路徑名,即路徑的basename部分。
  • getAbsoultePath():獲取絕對路徑名,即dirname/basename。
  • getParent():獲取父路徑,即dirname。
  • getPath():獲取文件路徑的字符串,其實調用的是toString()。可能返回相對路徑、也可能絕對路徑。見下文解釋。
  • File getAbsoulteFile():獲取絕對路徑的文件對象,注意返回File。
  • File getParentFile():獲取父路徑的文件對象,注意返回File。

在new File時,可以給定相對路徑(相對于user.dir),也可以給定絕對路徑。例如,下面4個new File中,除了第一個是相對路徑,其余三個都是絕對路徑。

File file0 = new File("xyz.txt");     //相對路徑,相對于system屬性中的user.dir路徑
File file1 = new File("D:\\myjava\\a.txt");
File file2 = new File("D:\\myjava","a\\abc");
File file3 = new File(file2,"c.txt");

當給定是相對路徑時,則getParent()和getParentFile()無法正確獲取到父路徑,返回NULL,且getPath()返回的將是相對路徑的文件名,即new File(PATH)給定什么PATH,就返回什么PATH。但無論如何,getAbsoultePath()總是能獲取到絕對路徑。

File file0 = new File("1.txt");
File file1 = new File("D:/myjava/a.txt");
File file2 = new File("D:/myjava","a/abc");
File file3 = new File(file2,"c.txt");
System.out.println("----------file0-----------------");
System.out.println(file0.getAbsoluteFile());   //D:\myjava\io\1.txt
System.out.println(file0.getAbsolutePath());   //D:\myjava\io\1.txt
System.out.println(file0.getName());           //1.txt
System.out.println(file0.getParent());         //null
System.out.println(file0.getParentFile());     //null
System.out.println(file0.getPath());           //1.txt
System.out.println("----------file1-----------------");
System.out.println(file1.getAbsoluteFile());   //D:\myjava\a.txt
System.out.println(file1.getAbsolutePath());   //D:\myjava\a.txt
System.out.println(file1.getName());           //a.txt
System.out.println(file1.getParent());         //D:\myjava
System.out.println(file1.getParentFile());     //D:\myjava
System.out.println(file1.getPath());           //D:\myjava\a.txt
System.out.println("----------file2-----------------");
System.out.println(file2.getAbsoluteFile());   //D:\myjava\a\abc
System.out.println(file2.getAbsolutePath());   //D:\myjava\a\abc
System.out.println(file2.getName());           //abc
System.out.println(file2.getParent());         //D:\myjava\a
System.out.println(file2.getParentFile());     //D:\myjava\a
System.out.println(file2.getPath());           //D:\myjava\a\abc
System.out.println("----------file3-----------------");
System.out.println(file3.getAbsoluteFile());   //D:\myjava\a\abc\c.txt
System.out.println(file3.getAbsolutePath());   //D:\myjava\a\abc\c.txt
System.out.println(file3.getName());           //c.txt
System.out.println(file3.getParent());         //D:\myjava\a\abc
System.out.println(file3.getParentFile());     //D:\myjava\a\abc
System.out.println(file3.getPath());           //D:\myjava\a\abc\c.txt

3. 文件判斷和文件屬性相關

new File對象時,無論這個對象是文件還是目錄,new的方式是一樣的,也就是說,從new File無法識別出這個對象是文件還是目錄,也無法確認這個對象對應的文件是否存在。此外,這個文件是否可讀、可寫、可執行等也都可以進行判斷。其實這些都算是文件的屬性信息,除了這些信息外,文件名、文件大小、最近一次修改時間等也都是文件屬性。

  • exists():File對象在文件系統中是否存在。
  • isFile():File對象在文件系統中是否存在且是否為普通文件。
  • isDirectory():File對象在文件系統中是否存在且是否為目錄。
  • canRead():File對象是否可讀。
  • canWrite():File對象是否可寫。
  • canExecute():File對象是否可執行。

還有兩個獲取常見屬性的方法:

  • length():文件大小,單位字節。可用來判斷是否為空文件、空目錄。
  • lastModified():最近一次修改時間,即mtime。

還可以設置讀、寫、執行、最近修改時間等屬性。

  • setLastModified(long time):time用從1970-01-01開始的毫秒數表示。
  • setExecutable(true/false):對所有用戶是否可執行,參數為true或false
  • setExecutable(true/false,true/false):第二個參數表示owneronly,為true時表示只有所有者可執行,否則表示所有用戶可執行。
  • setWritable(true/false):和setExecute()一樣,也支持owneronly參數。
  • setReadable(true/false):和setExecute()一樣,也支持owneronly參數。
  • setReadOnly():設置只讀,設置成功返回true。

4. 列出目錄內文件

File類中沒有提供查看文件內容的方法,僅只提供了查看目錄內容的方法,也就是列出目錄內的文件列表。這些方法都只能列出當前目錄內容,不會遞歸到子目錄中去遍歷。

  • String[] list():返回一個字符串數組,元素為此目錄中文件的basename。
  • String[] list(FilenameFilter filter):返回一個字符串數組,元素為滿足過濾條件的basename。
  • File[] listFiles():返回一個抽象路徑名數組,元素為此目錄中文件的basename。
  • File[] listFiles(FileFilter filter):返回抽象路徑名數組,元素為滿足過濾條件的basename。
  • File[] listFiles(FilenameFilter filter):返回抽象路徑名數組,元素為滿足過濾條件的baesname。

因為文件列表返回的是多個值,甚至是多個File對象,因此這些方法返回值都是數組形式。之所以是數組而不是集合,是因為數組中的元素數量是不可更改的,而列出目錄中文件列表本就是列出當前時刻目錄內文件的動作,如果有增、刪元素的操作,豈非列出前是一個列表,實際列出的又是另一個列表?

首先看不帶過濾器的list()和listFiles(),關于文件篩選的方法見后文。假設D:\a目錄內的結構如下:

d:\a
|--a.sql
|--back.log
|--b
|  |--e
|  |  |--1.txt
|  |  |--2.txt
|  |  `--3.txt
|  `--f
|     |--4.txt
|     |--5.txt
|     `--6.txt
|--c
|  |--e
|  |  |--ace1.txt
|  |  |--ace2.txt
|  |  `--ace3.txt
|  `--f
|     |--4.txt
|     |--5.txt
|     `--6.txt
`--d|--a.java|--abc (1).txt|--abc (2).txt|--abc (3).txt|--b.java`--c.java

列出D:\a內的文件列表。

File file1 = new File("d:/a");
String[] list = file1.list();
for (String f : list) {System.out.println(f);
}

得到的結果為

a.sql
b
back.log
c
d

實際的過程是將目錄內的文件名存放到了字符串數組中,再遍歷數組。而且,得到的結果僅僅只是basename部分的文件名,不是絕對路徑。實際上,因為存儲在String[]中,完全沒辦法得到其絕對路徑。因此,更好的方式是使用listFiles()方法,因為它返回的是File數組,其內每一個元素都是File對象,可以使用getAbsolutePath()來獲取各元素的絕對路徑。

File file1 = new File("d:/a");
File[] filelist = file1.listFiles();
for (File file : filelist) {System.out.println(file.getAbsolutePath());
}

得到的結果為:

d:\a\a.sql
d:\a\b
d:\a\back.log
d:\a\c
d:\a\d

關于列出目錄,有如下幾個示例,見:java顯示目錄文件列表和刪除目錄
示例1:列出整個目錄中的文件(遞歸)
示例2:列出整個目錄中的文件(隊列)
示例3:樹形結構顯示整個目錄中的文件(遞歸)
示例4:刪除整個目錄

5.篩選文件

File類的listFiles()支持文件篩選功能。例如File[] listFiles(FileFilter filter),其中FileFilter為過濾器接口,需要實現該接口來篩選文件。

常用的篩選方法是根據文件名,其實也支持其他篩選條件,如是否可讀、大小是否大于5M等。

import java.io.*;public class Filter1 {public static void main(String[] args) {File dir = new File("d:/myjava");getJavaFiles(dir);}public static void getJavaFiles(File dir) {File[] files = dir.listFiles(new NameFilter());for (File file:files) {if(file.isDirectory()) {getJavaFiles(file);} else {System.out.println(file.getAbsolutePath());}}}
}//實現FileFilter接口
class NameFilter implements FileFilter {public boolean accept(File pathname) {if(pathname.isDirectory()) {    //為了支持遞歸篩選,判斷目錄return true;} else {String name = pathname.getName();return name.endsWith(".class")?true:false;//return pathname.canRead()?true:false;        //根據是否可讀篩選//return pathname.length()>5242880?true:false;  //根據大小篩選great than 5MB?(5*1024*1024)}}
}

注:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!

轉載于:https://www.cnblogs.com/f-ck-need-u/p/8143690.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android listview 開發,android開發之ListView實現

今天又初步學習了一下ListView控件,看看效果如下:LisViewActivity.java源碼:package com.jinhoward.UI_listview;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.os.Bundl…

input ios問題 小程序_微信小程序開發常見問題匯總

原標題:微信小程序開發常見問題匯總1、域名必須是https非https的域名不被微信小程序允許。2、input組件placeholder字體顏色卸載placeholder-class里面的color并不生效,需要寫在placeholder-style里面就可以了。3、wx.navigateTo無法跳轉到帶tabbar的頁面…

https://github.com/

https://github.com/ qq郵箱 轉載于:https://www.cnblogs.com/chang1/p/7133251.html

Less 的用法

1. node.js node.js是一個前端的框架 自帶一個包管理工具npm node.js 的安裝 官網:http://nodejs.cn/ 在命令行檢驗是否安裝成功 切換到項目目錄,初始化了一個package.json文件 安裝與卸載jQuery包(例子) 安裝 卸載 安裝淘寶…

淺談springboot整合ganymed-ssh2遠程訪問linux

環境介紹 技術棧 springbootmybatis-plusmysqlganymed-ssh2 軟件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 SSH(遠程連接工具)連接原理:ssh服務是一個守護進程(demon),系統后臺監聽客戶…

優化Neo4j Cypher查詢

上周,我花了很多時間嘗試使用實時系統中的數據來優化大約20個執行失敗的Cypher查詢(36866ms至155575ms)。 經過一番嘗試和錯誤,以及來自Michael的大量投入,我能夠大致確定對查詢進行哪些操作才能使它們性能更好-最后&a…

python 多文件知識

對于一個大型的項目,會存在很多個py文件,本文記錄與多文件有關的內容。 1. python 如何在一個.py文件中調用另一個.py文件的類 如果是在同一個 module中(也就是同一個py 文件里),直接用就可以如果在不同的module里,例如a.py里有 class A:b.py 里有 class…

android pick file,LFilePicker---文件選擇利器,各種樣式有它就夠了

LFilePicker在 Android 開發中如果需要選擇某個文件,可以直接調取系統的文件管理器進行選擇,但是無法保證各個廠商的手機界面一致,而且解析Uri 還比較繁瑣,如果還需要多選呢?需要文件類型過濾呢?老板說界面…

老筆記整理二:網頁小問題匯總

最近有一些小問題。想在這里寫出來。一是方便大家排錯,再是自己也整理一下。 1。很傻的小問題。。。參數提交方式有一個應該是form而不是from。(英語老師,我對不起你。。。) 2。用超鏈接傳參數,在?后面不能…

在JVM之下–類加載器

在許多開發人員中,類加載器是Java語言的底層,并且經常被忽略。 在ZeroTurnaround上 ,我們的開發人員必須生活,呼吸,飲食,喝酒,并且幾乎與類加載器保持親密關系,才能生產JRebel技術&a…

matplotlib繪制餅狀圖

源自http://blog.csdn.net/skyli114/article/details/77508430?ticketST-41707-PzNbUDGt6R5KYl3TkWDg-passport.csdn.net pyplot使用plt.pie()來繪制餅圖 1 import matplotlib.pyplot as plt 2 labels frogs, hogs, dogs, logs 3 sizes 15, 20, 45, 10 # [15,20,45,10…

自適應寬度元素單行文本省略用法探究

單行文本省略是現代網頁設計中非常常用的技術,幾乎每個站點都會用到。單行文本省略適用于顯示摘要信息的場景,如列表標題、文章摘要等。在響應式開發中,自適應寬度元素單行文本省略容易失效不起作用,對網頁開發這造成困擾。因此&a…

P3390 【模板】矩陣快速冪

題目背景 矩陣快速冪 題目描述 給定n*n的矩陣A,求A^k 輸入輸出格式 輸入格式: 第一行,n,k 第2至n1行,每行n個數,第i1行第j個數表示矩陣第i行第j列的元素 輸出格式: 輸出A^k 共n行,每行n個數&…

c#精彩編程200例百度云_永安市教育局被授予“人工智能編程教育試驗區”

11月28日,“第二屆人工智能與機器人教育大會青少年人工智能與編程教育主題論壇”在廈門召開。永安市教育局被中國教育發展戰略學會人工智能與機器人教育專委會授予“人工智能編程教育試驗區”牌匾,巴溪灣小學、西門小學、三中、一中附屬學校、實驗小學等…

python中+=和=+的區別

本文原創,版權屬作者個人所有,如需轉載請聯系作者本人。Q&微:155122733 -------------------------------------------------------------------------------------------------------- a1 代表在原值上更改 aa1相當于先定義一個變量&…

Spring Data JPA和分頁

讓我們從支持分頁的經典JPA方法開始。 考慮一個簡單的域類–一個具有名字,姓氏的“成員”。 為了支持在成員列表上進行分頁,JPA方法是支持一種查找器,該查找器將獲取第一個結果(firstResult)的偏移量和要檢索的結果&am…

南陽理工 題目63 小猴子下落

小猴子下落 時間限制:3000 ms | 內存限制:65535 KB 難度:3 描述 有一顆二叉樹,最大深度為D,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3,,2的D次方減1。在結點1處放一個小猴子&#…

vue 方法獲取返回值_vue.js - vuex異步提交,怎么獲取返回數據

問 題 做登錄頁面時,在vuex中的action異步提交后獲取的數據在mutations中存儲在state里面,但是總感覺不對,沒有返回數據,我前端頁面怎么獲取數據,用mapgetter獲取不到數據,是不是他不是實時更新的,而且輸出的mapgetter輸出的數據還在action的前面。下面是我前端部分代碼…

Windows環境下安裝、卸載Apache

安裝Apache 服務 打開 Apcahe的目錄 ,打開bin目錄, 如:E:\wamp\Apache24\bin ,打開目錄,Shift鍵 鼠標右鍵 , 點擊 在此處打開命令窗口或者W快捷鍵直接到此處, 也可以Window鍵r,輸入…

css清浮動

我們在平常做項目的時候,float這個css屬性經常會用到。元素浮動會讓元素脫離文檔流,從而不能撐開父級的內容。今天我將展示常見的清除浮動的方法。 什么是浮動 浮動元素脫離文檔流并且向左或者向右移動,直到浮動元素的邊緣碰到父級框或者另…