jspとサーブレットでeclipseを使っています。
インポート画面を作っているんですが、画面から入力されたパスをjavaが理解するパスに変更するにはどうすれば良いでしょうか。
パス: c:\test.csv
javaが理解するパス: c:\test.csv
簡単に変換できることはできるのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/09 00:19
退会済みユーザー
2017/01/09 00:50
2017/01/09 01:12
回答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総合スコア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
総合スコア21733
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/09 02:11
2017/01/09 02:21
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してみてください。
投稿2017/01/09 02:34
総合スコア804
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
2017/01/10 06:34 編集
退会済みユーザー
2017/01/10 12:53
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。