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

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

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

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

Q&A

解決済

5回答

9563閲覧

javaで理解できるファイルパス

chintao1224

総合スコア155

Java

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

0グッド

0クリップ

投稿2017/01/08 23:07

編集2017/01/08 23:18

jspとサーブレットでeclipseを使っています。

インポート画面を作っているんですが、画面から入力されたパスをjavaが理解するパスに変更するにはどうすれば良いでしょうか。

パス: c:\test.csv
javaが理解するパス: c:\test.csv

簡単に変換できることはできるのでしょうか。

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

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

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

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

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

mit0223

2017/01/08 23:36

「javaが理解するパス」の意味が理解できません。どのようなものであれば java が理解できるのでしょうか?
chintao1224

2017/01/09 00:19

画面から入力すればc:\test.csvのようになりますが、javaが理解するパスはc:\\test.csvと\が2つ並ぶと思っています。replace(\\,\\\)としてもreplaceAll("\","\\")としてもエラーになってうまくいきません。
退会済みユーザー

退会済みユーザー

2017/01/09 00:50

C:\\dirname は コンパイラが理解するpathである。ランタイムが理解するpathは C:\dirname である
chintao1224

2017/01/09 01:12

C:\dirnameをC:\\dirnameに変換する方法はないのでしょうか?
guest

回答5

0

それはJavaのコードにおけるエスケープシーケンスというものに関わります。
Javaのコードでは、\(バックスラッシュ)は特殊な意味を持ち、そのあとに続く文字で通常では入力できない文字として扱います。\nで改行、\tでタブ文字などです。このような文字入力のことをエスケープシーケンスと呼びます。
そのため、コード上で「バックスラッシュそのもの」を入れたいときには\では特殊な意味に解釈され、意図通りに呼んでくれないのです。そのため、「バックスラッシュそのもの」を入れる際は、先の「通常では入力できない文字」として、\\として決められています。

つまり、Javaがパスをc:\test.csvと理解しているのではなく、ソースコード上で"c:\test.csv"を表現する方法がc:\\test.csvであるというだけの話です。Javaは間違いなくパスを"c:\test.csv"と認識しています。

長くなりましたが、早い話、変換する必要皆無です
試しに

java

1System.out.println("c:\\test.csv");

を実行してみてください。

投稿2017/01/09 00:46

編集2017/01/09 17:13
swordone

総合スコア20649

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

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

0

Javaにおける文字列リテラルと文字列(String)そのものに対して、誤解されているように思われます。

Javaで文字列はStringクラスのインスタンスです。実際はcharの配列として、UTF-16形式で管理されています。例えば、"abc"という文字列は{'a', 'b', 'c'}というような形で管理されていると言うことです。

さて、「c:\test.csv」という表現の場合はどうなるかというと、配列であれば、{'c', ':', '\\', 't', 'e', 's', 't', '.', 'c', 's', 'v'}となります。'\\'は二文字あるようにみえますが、charの文字リテラルとして「\」はエスケープ記号に使われるため、「\」自身を表す場合は二つ重ねる必要があります。

では、Stringの文字列リテラルとして表現した場合はどうなるのかというと"c:\\test.csv"です。でも、これは先ほどの配列の表現と同じです。どうしてこうなったのでしょうか?

それは、さきほど'\\'の所で説明したのと同じです。リテラル表現では「\」はエスケープ記号として、特別な意味を持つため、「\」自身を表す場合は二つ重ねる必要があります。

注意して欲しいのは、文字列リテラルを解釈したあとは、このエスケープ記号が分解されていると言うことです。"\\"{'\\', '\\'}と「\」が二つあるとされるのではなく、{'\\'}の一つだけです。この解釈はコンパイル時であってバイトコードになった時点でエスケープの記号は無くなります。エスケープ記号はASCIIの印字可能文字では通常表現できないような文字(ヌル文字や改行など)や、リテラルの囲みの区切りに使う「"」が囲みの区切りだと判断されないようにするため、ソースコード上の表現としてだけ存在します。コンパイルされてバイトコードになった後、つまり、JavaVMで実行されるときは、この「\」は無くなっており、エスケープ記号の動作として解釈されたものに置き換わっています。\\であれば「\」一つになっていると言うことです。

と言うことでわかりましたでしょうか?Javaはあくまで「c:\test.csv」としか解釈しません。"c:\\test.csv"ソースコード上でのみの表現であって、コンパイル後は「c:\test.csv」となり、Javaもそのようにしか解釈しないと言うことです。

投稿2017/01/09 01:09

raccy

総合スコア21733

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

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

chintao1224

2017/01/09 02:11

csvを読み込むサンプルhttp://java-reference.sakuraweb.com/java_file_csv_read.htmlに書いてある"c:\\test.csv"のように指定したいです。htmlのtype="file"で指定されたパスは"c:\test.csv"のようになるので変換をしたいと思っています。
raccy

2017/01/09 02:21

Javaのソースコード上の`"c:\\test.csv"`は「c:\\test.csv」ではなく「c:\test.csv」として解釈されます。ソースコード上の表現にすぎないということをご理解ください。
guest

0

ベストアンサー

質問の"情報の追加・修正の依頼をする"欄の内容から見てJavaをはじめられて間もないのかなと推察しました。

これまで識者の方々が回答された内容は正しいものです。
基礎的かつ良く使うことになるので、この機会に知りましょう。
別のアプローチで回答してみたいと思います。

jspとサーブレットでインポート画面を作っている
画面から入力されたパスをjavaが理解するパスに変更するにはどうすれば

とありますが、
jsp(画面)で入力されたパス(c:\test.csv)をサーブレット(java) が理解する
には、
パスを変更する必要はありません。

サーブレットが配置されているのがEclipseを使っているPCと同じであれば、
サーブレットが受け取ったパスを使ってファイルの存在がするか確認してみてください。
ファイルが存在すると正しく認識されます。
下記にサンプルを記します。コンソールに"c:\test.txt"と"exist"が表示されます。
※パラメータ名等はご自身の作成されているものに合わせて読み替えてくださいね。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = request.getParameter("path"); System.out.println(path); File file = new File(path); if ( file.exists() ) { System.out.println("exist."); } else { System.out.println("not exist."); } }

chintao1224さんの誤解のキモは

javaが理解するパス: c:\test.csv

という点です。"javaが"と言っている部分が間違いです。
正しくは「人がjavaにソースコード上でc:\test.txtを理解してもらうためにはc:\test.txtと書く必要がある」です。
この点はswordoneさんが教えてくださっていますね。
raccyさんも「ソースコード上のみの表現」と教えてくださっています。

次に、

インポート画面を作っている

とのことで、インポートさせるファイルをjsp(画面)で入力させているのではと推察します。
「インポートさせるファイル(c:\test.txt)をサーブレット側に送信したい」
ということが本当の目的であれば、今行われていることと若干違うかなとも思いますので、
下記を足掛かりにTryしてみてください。

JSP/サーブレット ファイルアップロードの実装

投稿2017/01/09 02:34

Hiroshi-Aoki

総合スコア804

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

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

chintao1224

2017/01/11 22:42

エスケープシーケンスは理解はしていたつもりだったんですが。 まだまだ浅かったんですね。 識者の皆様方ありがとうございました。
guest

0

頭文字が
¥b
バックスペース

¥t
水平タブ

¥n
改行

¥r
復帰

¥f

などの一部(b,t,n,r,f)であるフォルダ名の前に\があると一つの文字として認識されます
以下のコードで一番下の部分でhに目的の文字列が入っています
これらの(他にもありますがとりあえず今はこれだけ)要素を全て排除するには以下のようにしてやる必要があります

java

1class DLO{ 2 3public static void main(String[] args){ 4 5String h="c:\test.csv"; 6 7h=h.replace("\t","\\\\"+"t"); 8 9h=h.replace("\r","\\\\"+"r"); 10 11h=h.replace("\n","\\\\"+"n"); 12 13h=h.replace("\b","\\\\"+"b"); 14 15h=h.replace("\f","\\\\"+"f"); 16 17h=h.replace("\\+","\\\\"); 18System.out.println(h); 19} 20 21}

投稿2017/01/09 00:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

こういうことですか??
replaceAll("\","\\")

投稿2017/01/09 02:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/01/09 11:48

replaceAll("\","\\") 上記だと、一つ目の引数が不正のため、コンパイルエラーになるかと思います。 「\」はエスケープ記号(※)のため、単体では文字列と認識されません。 そのため、一つ目の引数のダブルクォーテーション(閉じ)を文字列として認識させてしまい、ダブルクォーテーションが足りない旨かなんかのエラーが出ているのだと思います。 ※エスケープ記号はプログラム言語で使われる文字で、特殊な文字を通常の文字として認識させるために使用する記号です。
GrassfieldK

2017/01/10 06:34 編集

i. 質問の趣旨に合っていない ii. 仮にi.を無視して質問にあった回答であったとしても、内容が不十分で、初心者には理解しづらい 追記 ↑評価を下げる理由をコメントしてくださいと出たのでなんとなく書いたらしっかり投稿されてしまいましたが、意図的に書いたものではありません。コメントしなくても評価を下げる事はできるようですね。
退会済みユーザー

退会済みユーザー

2017/01/10 12:53

そうですか。 お互いがんばりましょう!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問