質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3982閲覧

JavaのFiles.isSameFileメソッドの振る舞いに関して

tayack122

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/07/20 02:50

■ソースコード
public class TestClass {
public static void main(String[] arg) throws IOException
{
Path path = Paths.get("C:/work/a.txt");
Path path2 = Paths.get("C:/work/./a.txt");
if(Files.isSameFile(path,path2))
{
System.out.println("同じファイルです");
}
}
}
を実行した結果
■事象
if(Files.isSameFile(path,path2))のところで
Exception in thread "main" java.nio.file.NoSuchFileException:
が発生します。

■想定
isSameFileは『このメソッドはファイルが存在するかどうかを判定せずに true を返します。』というメソッドなのでNoSuchFileExceptionは発生しないように思えるのですが。。。

■想定を考えた理由
参考:http://docs.oracle.com/javase/jp/7/api/java/nio/file/Files.html#isSameFile(java.nio.file.Path, java.nio.file.Path)

■環境
JRAEはJava7で、Eclipse上で実行しております。
C:/work/a.txtは存在しません。

■質問
私の想定の認識に誤りがあるのでしょうか?(ファイルが存在するかどうかを判定せずに →NoSuchFileExceptionが発生しないわけではない?など)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ソースコードを見てみましょう。この箇所です。

sun.nio.fs.WindowsFileSystemProvider (.java) L.408 - GrepCode Class Source

L.427のh1 = file1.openForReadAttributeAccess(true);ファイルが存在しているかどうかチェックしているようですね。

文字列が(Windowsの場合は大文字小文字無視で)一致していればファイル存在チェックはされないようです。

投稿2015/07/20 03:46

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tayack122

2015/07/21 23:40

ご回答ありがとうございます。 文字列チェック⇒存在チェック⇒同じ場所を示しているかどうかのチェック という順なのでしょうかね? ソースコードまで見ていていただき、ありがとうございました。
argius

2015/07/21 23:52

これ以上深く調べてはいませんが、おおむねそんな感じかと思います。
guest

0

両方の Path オブジェクトが等しい場合、このメソッドはファイルが存在するかどうかを判定せずに true を返します。

これは、以下のことを指しているのではないかと思います。

Java

1Path path = Paths.get("C:/work/a.txt"); 2//Path path2 = Paths.get("C:/work/./a.txt"); 3if(Files.isSameFile(path,path)) 4{ 5 System.out.println("同じファイルです"); 6}

これだと、trueが戻ってきました。

投稿2015/07/20 03:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tayack122

2015/07/21 23:38

ご回答ありがとうございます。 両方の Path オブジェクトが等しい というだけだとそうなりますよね。 ただ.equalsなどと何も違わないですよね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問