21

私はJava 7 update 6でWindows-7を使用しており、この奇妙な(少なくとも私にとっては)動作を発見しました
.2つのファイルがE:\delete1.txtあり、E:\delete2.txt両方とも読み取り専用ファイルです.次のようにファイルを削除しようとすると、問題なく削除されます-

File file = new File("E:\\delete1.txt"); 
assertTrue(file.delete());

しかし、次のようにnio APIを使用してファイルを削除すると-

Path path = Paths.get("E:\\delete2.txt");
Files.delete(path);

投げjava.nio.file.AccessDeniedExceptionます。

古いnio APIと新しいnio APIで同じ操作をしても動作が異なるのはなぜですか?

4

2 に答える 2

22

ここで説明したように-問題はjava.io.File、特にWindowsで多くの奇妙な点があることです。この場合、ファイルを削除する前にファイル属性をリセットするため、予想どおりに失敗することはありません。それは10年以上前にさかのぼる行動であり、したがって今変更するのは危険です。これには、このような他のいくつかの奇妙な点があります。これは、新しいAPIを使用するために再実装されなかった理由の1つにすぎません。

コマンドウィンドウからファイルを削除しようとすると、windowsは同じ(アクセス拒否)エラーをスローしますが、ファイルはエクスプローラーウィンドウから削除されます。File#delete()の実装が間違っているようで、代わりにnewをFiles#delete(Path)優先する必要があります。

于 2012-09-02T07:42:12.697 に答える
2

古いnio APIと新しいnio APIで同じ操作をしても動作が異なるのはなぜですか?

同様の操作のために古い API の動作を正確にエミュレートすることは、新しい API の設計における重要な目標とは見なされていなかったようです。nio ファイルシステム API の主な目的が、まったく異なる根本的な概念と多くの新しい機能を備えた新しいAPI を提供することであったことを考えると、それは私にはごく普通のことのように思えます。

于 2012-08-27T10:33:49.697 に答える