22

JDK7 のこれらすべての新しいファイル I/O クラスについて、私は少し混乱しています。

たとえば、 があり、Pathそれが表すファイルの名前を変更したいとします。Path再び aが予想される場合、新しい名前を指定するにはどうすればよいですか?

Path p = /* path to /home/me/file123 */;
Path name = p.getName(); /* gives me file123 */
name.moveTo(/* what now? */); /* how to rename file123 to file456? */

注: なぜJDK7が必要なのですか? シンボリックリンクの扱い!

問題は、実行時に名前と場所がわかっているファイルを使用する必要があることです。したがって、私が必要としているのは、古い名前パスの新しい名前パスを作成するための安全な方法 (例外的な副作用なし) です。

Path newName(Path oldName, String newNameString){
    /* magic */ 
}
4

6 に答える 6

61

JDK7 では、Files.move()は、ファイルの名前を変更するための短く簡潔な構文を提供します。

Path newName(Path oldName, String newNameString) {
    return Files.move(oldName, oldName.resolveSibling(newNameString));
}

まず、Path.resolveSibling() を使用して新しいファイル名へのパスを取得し、Files.move() 使用して実際の名前変更を行います。

于 2012-11-13T15:23:12.773 に答える
9

パス文字列があり、Path インスタンスを作成する必要があります。これは getPath メソッドまたは resolve で行うことができます。1 つの方法を次に示します。

Path dir = oldFile.getParent();        
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);        
oldFile.moveTo(target); 

親がnullかどうかをチェックすることに注意してください(あなたのソリューションはそれをしないようです)。

于 2009-12-16T13:29:24.313 に答える
4

OK、すべてを試した後、正しい方法を見つけたようです:

// my helper method
Path newName(Path oldFile, String newNameString){
    // the magic is done by Path.resolve(...)
    return oldFile.getParent().resolve(newNameString);
}

// so, renaming is done by:
oldPath.moveTo(newName(oldFile, "newName"));
于 2009-12-16T13:21:04.330 に答える
1

Apache Commons IOを見ると、 FileNameUtilsというクラスがあります。これは、多くのことを行います。ファイルパス名とは、(とりわけ)パス名などを確実に分割します。それは、あなたが望むものに向かって長い道のりを歩むはずだと思います.

于 2009-12-16T13:04:55.627 に答える
0

ファイルの名前を除いて、移動先のパスが移動元のパスと同じである場合、移動ではなく名前が変更されます。

したがって、あなたの例では、moveto パスは次のようになります。

/home/me/file456
于 2009-12-16T12:51:34.577 に答える
-2

Unix で Java にやりたいことをさせることができない場合は、Python スクリプト (Java プログラムで実行) をお勧めします。Python は Unix スクリプトをサポートしていますが、それは Perl ではありません :) これはあなたには洗練されていないように聞こえるかもしれませんが、実際には大規模なプログラムでは、仕事に適したツールを使用することでメリットが得られます。

于 2011-10-10T01:26:31.380 に答える