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

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

ただいまの
回答率

90.46%

  • Java

    14164questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,895

chintao1224

score 78

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mit0223

    2017/01/09 08:36

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

    キャンセル

  • chintao1224

    2017/01/09 09:19

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/01/09 09:50

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

    キャンセル

  • chintao1224

    2017/01/09 10:12

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

    キャンセル

回答 5

+4

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

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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

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 11:11

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

    キャンセル

  • 2017/01/09 11:21

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

    キャンセル

checkベストアンサー

+2

質問の"情報の追加・修正の依頼をする"欄の内容から見て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/12 07:42

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

    キャンセル

0

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

¥t
水平タブ

¥n
改行

¥r
復帰

¥f

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

class DLO{

public static void main(String[] args){

String h="c:\test.csv";

h=h.replace("\t","\\\\"+"t");

h=h.replace("\r","\\\\"+"r");

h=h.replace("\n","\\\\"+"n");

h=h.replace("\b","\\\\"+"b");

h=h.replace("\f","\\\\"+"f");

h=h.replace("\\+","\\\\");
System.out.println(h);
}

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-5

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/09 20:48

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

    キャンセル

  • 2017/01/10 15:32 編集

    i. 質問の趣旨に合っていない
    ii. 仮にi.を無視して質問にあった回答であったとしても、内容が不十分で、初心者には理解しづらい

    追記
    ↑評価を下げる理由をコメントしてくださいと出たのでなんとなく書いたらしっかり投稿されてしまいましたが、意図的に書いたものではありません。コメントしなくても評価を下げる事はできるようですね。

    キャンセル

  • 2017/01/10 21:53

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14164questions

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