0

[編集]クラスrenameTo()のメソッドでファイルの名前を変更できませんでした。Fileさて、検索して、同じことを説明する質問を見つけました

File.renameTo() は失敗しますか?

また、次のような Java Doc を読みましたrenameTo()

このメソッドの動作の多くの側面は、本質的にプラットフォームに依存します。名前変更操作は、あるファイルシステムから別のファイルシステムにファイルを移動できない可能性があり、アトミックではない可能性があり、宛先の抽象パス名を持つファイルの場合は成功しない可能性があります。もう存在している。名前変更操作が成功したことを確認するために、戻り値を常にチェックする必要があります。

renameTo()さて、メソッドがプラットフォームに依存 することは理解しています。

次に、オブジェクトを作成してメソッドFileOutputStreamを呼び出しました。メソッドを試してみると、ファイルの名前が変更されました。close()renameTo()

質問:

  • メソッドのオブジェクトを作成FileOutputStreamした後に機能した理由を理解できませんでしたか?renameTo()

環境: Windows XP、ユーザー: 管理者

コード:

    File f = null;
    File f1 = null;
    boolean isFileRenamed = false;

    try {
        // create new File objects
        f = new File("C:\\originalFile.txt");
        f1 = new File("C:\\renamedFile.txt");

        // I need to write following code to rename the file
        // I tried without FileOutputStram object but then renameTo() did not work
        FileOutputStream fos = new FileOutputStream(f);
        fos.close();

        isFileRenamed = f.renameTo(f1);
        System.out.print("File renamed? " + isFileRenamed);

    } catch (Exception e) {
        e.printStackTrace();
    }

のオブジェクトを作成した後に renameTo() メソッドが機能した理由の答えを探していますFileOutputStram。また、私のアプリケーションはJava1.6を使用しているため、Filesクラスのオプションは閉じられています。renameTo()メソッドのみを使用する必要があります

4

1 に答える 1

5

JDK のバグではありません。ドキュメントから:

このメソッドの動作の多くの側面は、本質的にプラットフォームに依存します。名前変更操作は、あるファイル システムから別のファイル システムにファイルを移動できない可能性があり、アトミックではない可能性があります。もう存在している。名前変更操作が成功したことを確認するために、戻り値を常にチェックする必要があります。

(私の強調)

ドライブが異なればファイルシステムも異なります。ファイル システム間でファイルを移動するには、古いファイル システムから新しいファイル システムにファイルのデータをコピーし、コピーが完了したら、元の場所にあるファイルを削除する必要がありますはその作業を引き受けません。ファイルシステム内でファイルを単純に移動renameToできる単純なケースのためです。


以下では、ファイルシステム内でも機能しないと言っています。C:Windows 7 を使用している場合、ドライブのルートにファイルを作成するには、管理者として実行する必要があることに注意してください。

これは、管理者としてコマンド プロンプトで実行すると機能します。

コード例:

import java.io.*;

public class FileMove
{
    public static final void main(String[] args) {
        File f = null;
        File f1 = null;
        boolean bool = false;

        try {
            // create new File objects
            f = new File("C:\\test.txt");
            f1 = new File("C:\\renamed.txt");

            bool = f.renameTo(f1);

            System.out.print("File renamed? " + bool);

        } catch (Exception e) {
            // if any error occurs
            e.printStackTrace();
        }
    }
}

実行例:

C:\>echo "テスト 1 2 3">test.txt
C:\>タイプ c:\test.txt
"テスト 1 2 3"
C:\>タイプ c:\renamed.txt
システムは、指定されたファイルを見つけることができません。
C:\>Java -cp . ファイル移動
ファイルの名前が変更されましたか? 真実
C:\>renamed.txt と入力
"テスト 1 2 3"
C:\>

しかし、ミリムースがコメントで指摘しているように、Files.Moveメソッドがあります。

于 2013-07-27T17:26:00.247 に答える