Java 7 NIO Files,Path操作ファイル


Java 1.0から1.3まで、I/Oサポートが必要なアプリケーションを開発する際に、以下の問題に直面します.
  • はデータバッファまたはチャネルの概念がなく、開発者は多くの下位詳細
  • をプログラミングして処理しなければならない.
  • I/O操作がブロックされ、拡張能力が限られている
  • でサポートされる文字セットの符号化は限られており、特定のタイプのハードウェアをサポートするために多くの手動符号化作業が必要である.
  • は正規表現をサポートせず、データ処理が困難である.

  • これらの問題を解決するためにJava 1.4にNIOを導入した.主な改善点は2つあります.
  • Java 1.4に非ブロックI/O
  • を導入する.
  • Java 7で非ブロックI/Oを変更する
  • このJavaはI/O操作のためにバッファとチャネル領域を抽象化した.文字セットの符号化と復号化能力;ファイルをメモリデータにマッピングできるインタフェースを提供します.非ブロックI/Oを実現する能力;ポピュラーなPerlに基づいて実装された正規表現クラスライブラリ.
    NIOはJavaを一歩前進させたが、I/Oプログラミングは開発者にとって依然として挑戦であり、特にファイルやディレクトリにとってサポート力が足りない.これらの限界を突破するために、Java 7ではNIO.2 APIが提供されている.3つの目標があります.
  • ファイル属性を一括取得できるファイルシステムインタフェースである、標準ファイルシステムによって実現されるサービスプロバイダインタフェース
  • を導入する.
  • は、非同期
  • を実行できるソケットおよびファイルを提供する.
  • JSR-51で定義されたソケット-チャネル機能を完了し、バインド、オプション構成、マルチキャストデータ・レポートの追加サポートを含む.

  • Path:通常、ファイルシステムの場所を表します.
  • Path
    Path path1 = Paths.get("D:\\test\\test1"); //    Path path1 = FileSystems.getDefault().getPath("D:\\test");
  • を作成
  • Pathから情報を取得親ディレクトリ、ファイル名などのPathから情報を取得できます.
    System.out.println("fileName : " + path1.getFileName()); //       System.out.println("number of name elements : " + path1.getNameCount()); //          System.out.println("parent path : " + path1.getParent());System.out.println("root of path : " + path1.getRoot());System.out.println("subpath from root, 2 elements deep : " + path1.subpath(0, 2)); //    0-2         
  • NIO.2 PathとJavaの既存のFIleクラスの新しいAPIのクラスは、java.io.Fileベースの過去のAPIに完全に代わることができる.しかし、残されたI/Oコードとのインタラクションは避けられません.Java 7は2つの新しい方法を提供しています:
    File file = new File("D:\\test");
    Path path3 = file.toPath(); // file to path
    path3.toAbsolutePath();file = path3.toFile(); // path to file
  • java.io.FileクラスにtoPath()メソッドが追加され、既存のFileを新しいPath
  • に変換できます.
  • Pathクラスには、既存のPathをFile
  • に変換できるtoFile()メソッドがあります.
    ディレクトリ内のファイルを検索するには、まず簡単な例を示し、現在のディレクトリの下のすべての.txtおよび.jpgファイルをマッチングモードでフィルタします.これは、単一のディレクトリを処理する能力です.Path path4 = Paths.get("D:\\test");DirectoryStream stream = Files.newDirectoryStream(path4, "*.{txt,jpg}"); // フィルタフローを宣言し、マッチングモードはglobモードマッチングfor (Path entry : stream) {    System.out.println(entry.getFileName();}遍歴ディレクトリツリーJava 7は、ディレクトリツリー全体の遍歴をサポートします.つまり、ディレクトリツリー内のファイルを簡単に検索し、サブディレクトリで検索し、操作を実行できます.Path path5 = Paths.get("F:\\test\\demo"); // ホームディレクトリFiles.walkFileTree(path 5, new FindJavaVisitor()); // クリティカルメソッドprivate static class FindJavaVisitor extends SimpleFileVisitor {    // SimpleFileVisitorは、ディレクトリを巡るなど、ほとんどの作業を完了できます.visitFile()を書き換える唯一の方法です.    @Override     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {        if (file.toString().endsWith(".java")) {            System.out.println(file.getFileName());         }        return FileVisitResult.CONTINUE;     } }Files:ファイルを簡単にコピー、移動、削除、または処理するツールクラスには、必要なすべての方法があります.ファイルPathの作成と削除 path6 = Paths.get("D:\\backup\\test.txt"); Files.createFile(path6); // D:\backupが存在することを保証するファイルを作成します.Files.delete(path 6);ファイルのコピーと移動Path sourcePath7 = Paths.get("D:\\test\\test.txt");Path targetPath7 = Paths.get("D:\\backup\\test.txt");Files.copy(sourcePath7, targetPath7, StandardCopyOption.REPLACE_EXISTING); // REPLACE_EXISTING 上書きすると既存のファイルFiles.move(sourcePath 7、 targetPath7, StandardCopyOption.REPLACE_EXISTING);ファイルのプロパティPath path8 = Paths.get("D:\\test");System.out.println(Files.getLastModifiedTime(path8));System.out.println(Files.size(path8));System.out.println(Files.isSymbolicLink(path8));System.out.println(Files.isDirectory(path8));System.out.println(Files.readAttributes(path8, "*")); // ファイルのすべての属性を取得する高速読み書きデータJava 7は、ファイルの内容を読み取る補助方法をできるだけ多く提供します.もちろん、これらの新しい方法はPathを使用しますが、java.ioパッケージ内のストリームベースクラスと相互に操作することもできます.そのため、ファイル内のすべての行またはすべてのバイトを1つの方法で読み取ることができます.// Java 7は、バッファのリーダやライタ、または入出力ストリーム(以前のJavaと I/Oコード互換)ファイルを開きます.BufferedWriter writer = Files.newBufferedWriter(path9, StandardCharsets.UTF_8, StandardOpenOption.APPEND); writer.write("Hello world..."); writer.flush(); writer.close(); BufferedReader reader = Files.newBufferedReader(path9, StandardCharsets.UTF_8);String line;while ((line = reader.readLine()) != null) {     System.out.println(line); }// リストの読み取りと書き込みを簡略化 lines = Files.readAllLines(path9, StandardCharsets.UTF_8);for (String line1 : lines) {     System.out.println(line1); } byte[] bytes = Files.readAllBytes(path9); // ファイルバイトストリームの読み込みSystem.out.println(new) String(bytes, StandardCharsets.UTF_8)); Files.write(path9, bytes); // ファイルバイトストリームを書き込むのは以前はファイルを読み書きするのが面倒でしたが、Java 7のNIOを使ってからはとても便利ではないでしょうか.