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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

2回答

1370閲覧

Windows10上、Javaで"test.txt"という名称のファイルを"C:test.txt"と指定してもエラーにならず認識されるのはなぜ?

longcat

総合スコア11

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2021/03/05 16:22

疑問点

"test.txt"という名称のファイルをJavaプログラム上から"C:test.txt"と指定してもエラーにならず
"test.txt"と指定したのと同じように認識される場合がありました。OSはWindows10です。
自分では、エラーになると思っていたのですが…。これはなぜなのでしょうか?
test.txtはCドライブ直下に配置されているわけではありません。
Javaの仕様によるものなのか、OSの仕様によるものかもいまいちよくわかりません。

事象の再現方法

Java

1public class Test { 2 public static void main(String[] args) { 3 4 Path path = Paths.get("C:test.txt"); 5 6 System.out.println(path.toFile().exists()); 7 8 } 9}

のようなコードを書き、ビルドして実行可能jar(例:Test.jar)を作成する。

C:\tmpフォルダを作成し、その中に、
Test.jar
test.txt
を配置する。
(フォルダ名、ファイル名は何でもよいと思われるが、例としてこのような名前にしています。)

コマンドラインで
C:\tmp>java -jar Test.jar
を実行すると、

true

と表示される。

「C:」の部分はjarファイルを配置し、実行するドライブの
ドライブ文字と一致する必要があるように見えた。
(一致していない場合、例えばD:\tmpフォルダで上記のプログラムを実行すると「false」と表示された。)

上記のプログラムではexists()で存在を確認しているだけだが、
実際にファイルの読み込みなどもできた。

実行環境

JDK8(Oracle)
Windows10

調べたこと

Paths.getメソッドについて、APIのドキュメントを参照した…が疑問点は解消できなかった。
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Paths.html

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

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

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

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

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

guest

回答2

0

ベストアンサー

これはJavaというよりWindows側の仕様で、C:test.txtはCドライブの現在のディレクトリのtext.txtというファイルを相対パスで指定していることになります。

以下はC#のドキュメントですが、今回の問題に関するパスの仕様についてわかりやすくまとめられているので、詳細はこちらを参照されるとよいかと思います。

Windows システムのファイル パス形式

投稿2021/03/05 17:07

neko_the_shadow

総合スコア2259

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

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

longcat

2021/03/06 03:41

ありがとうございます。 この書き方で相対パスになることは知りませんでした。 ということで疑問点は解決したのですが、 まだ少しわからないのは、 なぜこのドライブを指定する書き方が用意されているか? どんな時が使いどころになるのか、ということです。 D:dir\test2.txt の代わりに、 dir\test2.txt や .\dir\test2.txt で済んでしまい、使う機会は少なくとも私はこれまでに ありませんでした。 絶対パス、相対パスの解説をしているようなサイトでも この使用方法は今まで見たことがありません。 もしかしたら、特に意味は無いけど文法としては用意されている、 ということなのかもしれませんが…、 もし、この書き方でないとできない状況や、 使うべき状況というのがお分かりになるようでしたら、 教えていただけないでしょうか。 自分の想像できる範囲では、 ドライブを明示することにより、間違いを防止することだろうか? くらいしか今のところ思い浮かばないです。
longcat

2021/03/06 05:12 編集

上記疑問点はy_waiwaiさんからの回答の方で解消できました。
neko_the_shadow

2021/03/06 05:18

自分も詳しいことは知らないので、話半分に聞いてもらえると助かるのですが、かつてのMS-DOSにはドライブごとにカレントディレクトリを持つという仕様がありました (過去の技術的制約からそうなっていたらしい)。この仕様は今でも一部残っていて、たとえばCドライブとDドライブがある環境で、CMDを起動し、以下のコマンドを順番に実行します。 D: cd D:\PQR\STU C: dir D:XYZ 要はDドライブに移動、カレントディレクトリを設定して、Cドライブに戻っているわけです。最後のdir D:XYZを実行すると、dir D:\PQR\STU\XYZと同じ結果が返ってきます (もっともこれはドライブごとにカレントディレクトリが設定されているわけではなく、環境変数などを使って、疑似的に実現しているだけのようです) ドライブ指定の相対パスというのはこのあたりの名残であるようです。詳細については、以下のブログ記事に詳しいので、こちらを参照いただけるとよいかと思います。 https://devblogs.microsoft.com/oldnewthing/20101011-00/?p=12563
longcat

2021/03/06 18:10 編集

追加のありがとうございます。 上記の記事見ました。 昔は出力先等の操作対象ディレクトリを指定するために カレントディレクトリが使われていたのですね。 あまり意識していませんでしたが、 「d:」 のように入力するのも、 単にドライブの切り替えではなく、 「dドライブのカレントに移動」 という意味だったんですね。 そう考えると、各ドライブにカレントがあるという昔の名残も、 「d:」と入力したときに、もしカレントが無かったら、 移動する先がわからず常にルートに移動してしまう とかになるかも知れないので、 今でも一定の意味のあることかもしれませんね。 (私は普段DOSコマンド自体そこまで使用しないし そこまで恩恵を受けてるとの実感はありませんが。)
guest

0

どちらも同じものを指してるから。ですな。
Cドライブ直下のものをさすのは、
C:\test.txt
と記述します
C:test.txt
では、Cドライブの現在のディレクトリのtest.txtってことですな


イメージ説明

CドライブとDドライブのカレントディレクトリ

投稿2021/03/05 22:46

編集2021/03/06 04:47
y_waiwai

総合スコア87784

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

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

longcat

2021/03/06 03:48

ありがとうございます。 この書き方で相対パスになることは知りませんでした。 ということで疑問点は解決したのですが、 まだ少しわからないのは、 なぜこのドライブを指定する書き方が用意されているか? どんな時が使いどころになるのか、ということです。 D:dir\test2.txt の代わりに、 dir\test2.txt や .\dir\test2.txt で済んでしまい、使う機会は少なくとも私はこれまでに ありませんでした。 絶対パス、相対パスの解説をしているようなサイトでも この使用方法は今まで見たことがありません。 もしかしたら、特に意味は無いけど文法としては用意されている、 ということなのかもしれませんが…、 もし、この書き方でないとできない状況や、 使うべき状況というのがお分かりになるようでしたら、 教えていただけないでしょうか。 自分の想像できる範囲では、 ドライブを明示することにより、間違いを防止することだろうか? くらいしか今のところ思い浮かばないです。 (別の回答に対するコメントのコピペをこちらにも記入させていだきます。)
y_waiwai

2021/03/06 03:52

そういう事もできるってだけの話しですよ。 それを使わなくてはいけないってこともないです
longcat

2021/03/06 04:27

ありがとうございます。 もしかしたら、この書き方が有効な場面というのが、 私が知らない、想像できないだけで何かあるのかも、 と思いましたが、そういうことなのですね。
y_waiwai

2021/03/06 04:32

自分のいるドライブとは別のドライブのカレントディレクトリにアクセスする場合には有効な方法となります。
longcat

2021/03/06 04:44 編集

ありがとうございます。 私は、 「カレントディレクトリ=自分のいるドライブにあるディレクトリ」 に常になると理解していたため、 「自分のいるドライブとは別のドライブがカレントディレクトリになる」 という状況が理解できていないのだと思います。 どのような時にそのような状況になるのか、 よろしければ教えていただけないでしょうか?
y_waiwai

2021/03/06 04:48

回答に追記しました
longcat

2021/03/06 05:08

ありがとうございます。 理解できました。 カレントディレクトリはドライブを切り替えても 各ドライブごとに保持されているのですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問