Java 文件

2018-02-05 16:14 更新

Java IO教程 - Java文件


java.nio.file.Files 包含所有允許我們對Path對象執(zhí)行大多數(shù)文件操作的靜態(tài)方法。

創(chuàng)建新文件

文件可以創(chuàng)建常規(guī)文件,目錄,符號鏈接和臨時文件/目錄。

大多數(shù)方法接受FileAttribute類型的varargs參數(shù),這允許我們指定文件屬性。

createFile()方法創(chuàng)建一個新的常規(guī)文件。創(chuàng)建的新文件為空。

如果文件已存在,或父目錄不存在,文件創(chuàng)建將失敗。

以下代碼顯示如何創(chuàng)建新文件。

import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) {
    Path p1 = Paths.get("test.txt");
    try {
      Files.createFile(p1);
      System.out.format("File created:  %s%n", p1.toRealPath());
    } catch (FileAlreadyExistsException e) {
      System.out.format("File %s  already exists.%n", p1.normalize());
    } catch (NoSuchFileException e) {
      System.out.format("Directory %s  does  not  exists.%n", p1.normalize()
          .getParent());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

上面的代碼生成以下結(jié)果。


創(chuàng)建目錄

createDirectory()和createDirectories()方法創(chuàng)建一個新目錄。

如果父目錄不存在,createDirectory()方法將失敗。

createDirectories()方法創(chuàng)建不存在的父目錄。

createTempDirectory()和createTempFile()方法分別創(chuàng)建一個臨時目錄和一個臨時文件。

以下代碼顯示了如何創(chuàng)建臨時文件和目錄。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
      String dirPrefix = "KDir";
      Path tDir = Files.createTempDirectory(dirPrefix);
      System.out.println("Temp directory: " + tDir);
      String fPrefix = "Header_";
      String fSuffix = ".txt";
      Path tFile1 = Files.createTempFile(fPrefix, fSuffix);
      System.out.println("Temp file1: " + tFile1);

      Path p1 = Paths.get("C:\\temp");
      Path tFile2 = Files.createTempFile(p1, fPrefix, fSuffix);
      System.out.println("Temp file2: " + tFile2);
  }
}

不會自動刪除臨時文件/目錄。我們可能希望使用java.io.File類的deleteOnExit()方法在JVM退出時刪除該文件。

Path  tempFile = Files.createTempFile("myTempFile", ".txt");
tempFile.toFile().deleteOnExit();

上面的代碼生成以下結(jié)果。


刪除文件

從文件中刪除(Path p)和deleteIfExists(Path p)以刪除文件,目錄和符號鏈接。

如果刪除失敗,delete()方法將拋出異常。

如果要刪除的文件不存在,deleteIfExists()方法不會拋出NoSuchFileException異常。

如果它刪除文件,則返回true。否則,它返回false。

以下代碼顯示如何刪除文件和處理異常:

import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
    Path p = Paths.get("C:\\Java_Dev\\test1.txt");

    try {
      Files.delete(p);
      System.out.println(p + "  deleted successfully.");
    } catch (NoSuchFileException e) {
      System.out.println(p + "  does  not  exist.");
    } catch (DirectoryNotEmptyException e) {
      System.out.println("Directory " + p + "  is not  empty.");
    } catch (IOException e) {
      e.printStackTrace();
    }

  }
}

上面的代碼生成以下結(jié)果。

存在文件

文件類有兩個方法,分別是exists(Path p,LinkOption ... options)和notExists(Path p,LinkOption ... options)來檢查文件的存在和不存在。

復(fù)制文件

文件類復(fù)制(Path source,Path target,CopyOption ... options)方法可以將指定的源路徑復(fù)制到指定的目標(biāo)路徑。

如果指定的源文件是符號鏈接,則將復(fù)制符號鏈接的目標(biāo),而不是符號鏈接。

如果指定的源文件是目錄,則創(chuàng)建目標(biāo)位置處的空目錄,而不復(fù)制目錄的內(nèi)容。

我們可以使用copy()方法指定一個或多個以下復(fù)制選項:

  • StandardCopyOption.REPLACE_EXISTING
  • StandardCopyOption.COPY_ATTRIBUTES
  • LinkOption.NOFOLLOW_LINKS

我們可以指定REPLACE_EXISTING選項來替換現(xiàn)有的目標(biāo)文件。

如果目標(biāo)文件是符號鏈接,并且如果存在,則通過指定REPLACE_EXISTING選項而不是符號鏈接的目標(biāo)來替換符號鏈接。

COPY_ATTRIBUTES選項將源文件的屬性復(fù)制到目標(biāo)文件。

如果使用NOFOLLOW_LINKS選項,則copy()方法復(fù)制符號鏈接,而不是符號鏈接的目標(biāo)。

以下代碼顯示了使用copy()方法復(fù)制文件。如果復(fù)制操作失敗,它會處理可能的異常。

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.DirectoryNotEmptyException;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;

public class Main {
  public static void main(String[] args) {
    Path source = Paths.get("C:\\Java_Dev\\test1.txt");
    Path target = Paths.get("C:\\Java_Dev\\test1_backup.txt");

    try {
      Path p = Files.copy(source, target, REPLACE_EXISTING, COPY_ATTRIBUTES);
      System.out.println(source + "  has  been  copied to " + p);
    } catch (FileAlreadyExistsException e) {
      System.out.println(target + "  already exists.");
    } catch (DirectoryNotEmptyException e) {
      System.out.println(target + "  is not  empty.");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

移動文件

Files類的move(Path source,Path target,CopyOption ... options)方法移動或重命名文件。

如果指定的目標(biāo)文件已存在,則移動操作將失敗。

我們可以指定REPLACE_EXISTING選項來替換現(xiàn)有的目標(biāo)文件。

如果要移動的文件是符號鏈接,它將移動符號鏈接,而不是符號鏈接的目標(biāo)。

move()方法只能用于移動一個空目錄。

除了REPLACE_EXISTING復(fù)制選項,我們可以使用ATOMIC_MOVE作為另一個CopyOption。

如果使用ATOMIC_MOVE選項,如果無法以原子方式移動文件,則會拋出AtomicMoveNotSupportedException。

如果指定ATOMIC_MOVE選項,則忽略所有其他選項。

以下代碼顯示了如何通過處理可能的異常來移動文件:

import static java.nio.file.StandardCopyOption.ATOMIC_MOVE;

import java.io.IOException;
import java.nio.file.AtomicMoveNotSupportedException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
    Path source = Paths.get("C:\\Java_Dev\\test1.txt");
    Path target = Paths.get("C:\\Java_Dev\\dir2\\test1.txt");

    try {
      Path p = Files.move(source, target, ATOMIC_MOVE);
      System.out.println(source + "  has  been  moved to " + p);
    }catch (NoSuchFileException e) {
      System.out.println("Source/target does  not  exist.");
    } catch (FileAlreadyExistsException e) {
      System.out.println(target + "  already exists.  Move failed.");
    } catch (DirectoryNotEmptyException e) {
      System.out.println(target + "  is not  empty.  Move failed.");
    } catch (AtomicMoveNotSupportedException e) {
      System.out.println("Atomic move is not  supported. MOve  failed.");
    } catch (IOException e) {
      e.printStackTrace();
    }

  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號