• ベストアンサー

読込ファイルのパスについて

 ファイルからテキストファイルを読み込んで、フォームから入力されたデータと照合し、ファイルにあればログインするというようなwebアプリを作ろうとしています。 しかし、テキストファイルが読み込まれてないようで、正しいパスワードを入力してもログインできません。読み込むファイルへのパス指定は絶対パスなのでしょうか、呼び出し元からの相対パスを指定するのでしょうか? また、テキストファイルを置くディレクトリは決まっているのでしょうか?(「WEB-INFより上の階層に置く」など) ちなみにサーバ環境はLinux+tomcat3.2.1+apache --------------------------------------------------------------- public class LoginDataBeans { ///////// UserDataクラス ///////// private class UserData{ public String user_id; public String password; } ///////// メンバ変数 ///////// ArrayList userList; private static final String logFilename = "/tomcat/logindata";←ここのパスは「絶対パス」?、それともこのファイルからの「相対パス」? ///////// コンストラクタ ///////// public LoginDataBeans(){ String item; userList = new ArrayList(); try{ BufferedReader in = new BufferedReader(new FileReader(logFilename)); while((item = (String)in.readLine()) != null){ UserData udat = new UserData(); StringTokenizer st = new StringTokenizer(item); udat.user_id = st.nextToken(); udat.password = st.nextToken(); userList.add(udat); } in.close(); } catch(IOException e){ e.printStackTrace(); } }

  • Java
  • 回答数2
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
noname#16216
noname#16216
回答No.2

ファイルのパス名を絶対パスで指定するか、相対パスで指定するかというのはどちらでも問題なく出来るはずです。 絶対パスであれば、ファイルが存在する場合には問題なくアクセスできるはずですが、相対パスで指定する場合には環境に応じてファイルをどこに置くかが変わってきます。 サーバの環境がtomcat+apacheということで、tomcatが単独ではなくapcheにアドオンで動いているようなので、この場合相対パスのルート位置は、apache.confで指定したサーブレットのルート位置になっていませんか? ---- apache.conf ---- Alias serv_dir "/xxx/yyy" ---------------------- なら、相対パスのルートは、/xxx/yyy の位置 個人的には、ファイルにアクセスするようなサーブレットを作成する場合、web.xmlファイルに<init-param>を記述して、そこに絶対パスを記述し、サーブレット側では、getInitparameter()メソッドを使ってルート位置を取得して作業するようにしています。 -- web.xml --    : <init-param> <param-name>DataDir</param-name> <param-value>/servlet/data/</param-value> </init-param>    : -------------- -- Servlet ---- public void init(ServletConfig config) {    :  String DataDir = config.getInitParameter("DataDir");  String DataFile = DataDir + "datafile";    : } --------------- こうしておけば、ディレクトリ構造が変わった場合にも、web.xmlの記述を修正するだけで動作するので。。。 どうでしょうか?

techtak
質問者

お礼

XMLから取り込めるんですね。こりゃあ便利だ! やはり修正作業などに柔軟に対応できるように設計することが 大事なのですね。 どうもありがとうございました。

その他の回答 (1)

  • kuro_73
  • ベストアンサー率28% (33/117)
回答No.1

C:\\temp\\aaa.txt というようなサーバーの中での絶対パスで開けました。 が、相対パスで開けるかどうかはよくわかりません。 相対パスだとすると、サーバーのexeファイルがある場所(アプリケーションサーバーのbinフォルダとか)からの相対パスになると思います。

techtak
質問者

お礼

絶対パスでは出来ました。 いちいち全部打ち込まなくても、ファイル名の前に”./”を 記述しても絶対パスとして扱われるようです。 回答ありがとうございます。

関連するQ&A

  • ファイルから多次元配列への読み込み

    はじめまして。 ここ最近、業務の都合でjava(正確には主にJSP)を描いています。 プログラムの作成は、シェルスクリプトを少し書く程度でまったく無いに等しい状態のなか、悪戦苦闘しております。 今回は、表題にもありますとおり、カンマ区切りファイルから多次元(2次元)配列に値を入れた意のですが、なかなか上手くいかないので、皆様のお知恵を拝借できればと思い、質問いたしまた。 私が書いたコードは、 String tmp; FileReader fr = new FileReader(application.getRealPath("./a.list")); BufferedReader br = new BufferedReader(fr); //1.リストの行数を取る ArrayList list = new ArrayList(); while (br.ready()) { tmp = br.readLine(); list.add(tmp); } int i = list.size(); //2.リストから読み込んだ値を取り合えず配列に入れてみる。 String strHex [][] = new String [i][3]; String strs2 [] = new String [i]; for ( int jj = 0; jj < i; jj++){ strs2[jj] = (String)list.get(jj); StringTokenizer st2 = new StringTokenizer(strs2[jj],","); int xyz = 0; while (st2.hasMoreTokens()) { strHex [jj][xyz] = (String)st2.nextToken(); xyz++; } } とやってみたのですが、xyzが配列の範囲を超えてアクセスしているという配列使用時はお決まりといわれるエラーが出てしまいます。 xyzは0で初期化した上で、トークンの数だけしか処理を行わないはずなので、わけがわからず途方にくれています。 なお、リストファイルの形式は、4列で行数は不定です。 例) 1,2,3b,4c 5,6,7d,8d 11,12,13,14 ・ ・ 見ないな感じです。 以上、お分かりになる方がいらっしゃいましたら、ヒントだけでもよろしくお願いいたします。

  • StringTokenizerについて

    JAVAの勉強をしているのですが、StringTokenizerの役割がよく分かりません。検索サイトを使って色々調べてみたのですが、「トークンを区切る」だとかよく分からない言葉が出てきて全く理解できません。以下はあるデータから項目を抽出するプログラムらしいのですが、参考としてこの例でStringTokenizerがどのような役割を果たしているのか教えて下さい。複雑で説明しにくければStringTokenizerそのものの説明でも十分です。よろしくお願いします。 BufferedReader reader=new BufferedReader(new InputStreamReader(System.in)); String line=""; try { int i=0; while ((line = reader.readLine()) != null) { int fcount=1; StringTokenizer st = new StringTokenizer(line); while (st.hasMoreTokens()) { switch (fcount) { case 2: //項目2:被説明変数Y data[i][0]=Integer.parseInt(st.nextToken()); break; case 4: //項目4:説明変数X data[i][1]=Integer.parseInt(st.nextToken()); break; default: // その他の項目 String dummy=st.nextToken(); break; } fcount++; } i++; } NofData=i;

    • ベストアンサー
    • Java
  • streamで送信されたArrayListを変換したい

    以前ネットワークプログラミングについて質問したものです。 現在もjavaでソケットを使ったネットワークプログラミングを行っています。 現在、クライアントからサーバーに数値を送ってサーバーのArrayListのPOINTに格納しています。 そして、そのPOINTをstreamをつかってクライアントに送ってそのリストをクライアント側のArrayListに格納し、数字を出力しようと思っています。 しかし受け取ったPOINTをクライアント側のArrayListに格納しようとしても型が違う(stringだから)ので、うまく変換したいのですがうまくいきません。 送られてきたものをうまく型変換しクライアントのArrayListに格納する、また送信時にうまくArrayListを送信しクライアントで受信する方法はないでしょうか? サーバー PrintWriter out = new PrintWriter(((Socket) e.nextElement()).getOutputStream()); out.println(POINT); クライアント BufferedReader in; buff = in.readLine(); StringTokenizer st = new StringTokenizer(line); String cmd = st.nextToken(); CLPOINT = cmd; このような形で送信しています。 よい方法があればよろしくお願いします。

    • ベストアンサー
    • Java
  • CSV読み込み 文字化け

    失礼いたします。 以前のログを見てエンコードを設定してみたのですが、出力が文字化けします。ローカルファイルを読み込んでコンソール出力しているだけなのですが・・・。 分かる方、よろしくお願いします。 -------------------ソースはここから import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; // import java.io.FileReader; FileReaderからInputStreamReaderに変更済み import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class ReadCSV { public static void main(String[] args) { try { File csv = new File("C:\\AP.csv"); // BufferedReader br = new BufferedReader(new FileReader(csv)); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"EUC_JP")); // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"MS932")); while (br.ready()) { String line = br.readLine(); StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { System.out.print(st.nextToken() + "\t"); } System.out.println(); } br.close(); } catch (FileNotFoundException e) { キャッチ処理 }

    • ベストアンサー
    • Java
  • CSVファイルの、列だけ取得したい

    FileReader filereader = new FileReader(FileName); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 0; while((line = bufferedreader.readLine()) != null) { int j = 0; StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { item[j][i]=stringTokenizerTest.nextToken().toString(); j++; } i++; } filereader.close(); このような記述で、CSVの中身を全て取得することは出来るのですが、 ある一列だけ取得する方法がわかりません。 具体的には、コンボボックスにCSVのある一列だけ表示させたいです。 (その後、重複なしの値のみにフィルタリングしたい) 現在は苦し紛れに、 combo1.setModel(new DefaultComboBoxModel(new String[] { item[1][3], item[1][4], item[1][5], item[1][6], item[1][7], item[1][8], item[1][9], })); などと、配列を使ってピンポイントで値を取得していますが これでは使えないので・・ アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • サーバー上(外部)のテキストの読み込み

    以下のようなtest.txtから二次元配列を読み込むプログラムを 今度はクライアントがapplet上からサーバーのappletプログラムがあるフォルダにあるtest.txtからデータを読み込むようにしたいのですが どうしてもセキュリティ上のエラーが出てしまいます。 画像などはgetImageでうまくいくのですが・・・ BufferedReader reader = null; String strArray[][] = new String[5][2]; String fileName = "test.txt"; int i = 0; int j = 0; try { reader = new BufferedReader ( new FileReader(fileName) ); String line; while ( (line = reader.readLine() ) != null ) { StringTokenizer st = new StringTokenizer (line ); while ( st.hasMoreTokens() ) { strArray[i][j] = st.nextToken(); j++; } j = 0;// 横のindexをリセット i++;// 縦のindexを次に } } catch ( Exception e ) { System.out.println ( e.toString() ); } ---------test.txt(例) 200 200 30 60 301 33 11 66 100 390 自分でも調べていくつもりですが期限があるためもしご存知の方がいましたら是非ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ファイルから複数行のトークンを文字列検索。

    input.txt から "," で区切られた文字列をトークンで分け、 左がパターン、右が検索する文字列になります。 一行の場合は while((line = brInput.readLine())!= null ) { StringTokenizer st = new StringTokenizer(line, ","); if(st.hasMoreTokens()){ pattern = st.nextToken(); text = st.nextToken(); } これでマッチするだけなのですが、複数行の場合はどうでしょうか?

    • ベストアンサー
    • Java
  • private変数を設定(Java)

    いろいろ試したのですが、よく分からないので質問します。 クラスaで private String sName; という属性と、 public void setsName(String sPassedName) { sName = sPassedName; } というメソッドがあり、 別のクラスで、 StringTokenizer st = new StringTokenizer("Test 123"); というのがあった時に、この「Test」をsNameに代入しようとしているのですが、 まず、 a aObject = new a(); と新しいaオブジェクトを作り aObject.setsName(st.nextToken()); とやったのですが、cannot resolve symbolの表示が出ています。 st.nextToken())ってStringだからキャストとかしなくていいと思ったのですが、何がまずいのでしょうか?

    • ベストアンサー
    • Java
  • javaプログラミングの質問です。

    http://questionbox.jp.msn.com/qa1030602.html?StatusCheck=ON に載っている、プログラムを以下のようにQuestionというクラスで実行してみたところ、 import java.io.*; class Question{ public static void main(String Args[]){ BufferedReader reader = null; String strArray[][] = new String[4][4]; String fileName = "foo.txt"; int i = 0; int j = 0; try{ reader = new BufferedReader ( new FileReader(fileName) ); String line; while ( (line = reader.readLine() ) != null ){ StringTokenizer st = new StringTokenizer ( line ); while ( st.hasMoreTokens() ){ strArray[i][j] = st.nextToken(); System.out.print ( strArray[i][j] + " " ); j ++; } j = 0; i ++; System.out.println (""); } } catch ( Exception e ){ System.out.println ( e.toString() ); } } } Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。 StringTokenizer を型に解決できません。 StringTokenizer を型に解決できません。 というエラーが出ます。 このサイトの質問者はうまくいっているようなのですが、私のコンパイラがうまく動いていないのでしょうか? java version "1.6.0_07" を使っていて、Eclipseを用いてコンパイルをしたりしています。 どなたかご指摘をどうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 読み込んだ行からランダムに選ぶ

    外部テキストからBufferedReaderで読み込んだ行をStringTokenizerで * の前と後ろに分けて、 nichi ="" + st.nextToken(); ei ="" + st.nextToken(); というように取得しています。 これをsetTextメソッドで文字列として表示しているのですが、順に読み込んだ中からランダムに選ぶ場合はどうすれば良いでしょうか import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; public class examination extends Applet implements ActionListener{ Button Check, Next; TextField jap, eng, seigo; String wrs; String nichi, ei; public void init(){ setBackground(new Color(200, 200, 200)); add(new Label("[ japanese ]")); jap = new TextField("", 30); add(jap); add(new Label("[ english ]")); eng = new TextField("", 30); add(eng); Check = new Button("正誤判定"); Check.addActionListener(this); add(Check); seigo = new TextField("", 3); add(seigo); Next = new Button("次の問題へ進む"); Next.addActionListener(this); add(Next); } public void actionPerformed(ActionEvent e){ try{ if(e.getSource() == Next){ BufferedReader wordsfile = new BufferedReader(new FileReader("D:/list.txt")); while ((wrs=wordsfile.readLine())!= null){ StringTokenizer st = new StringTokenizer(wrs," * "); nichi ="" + st.nextToken(); ei ="" + st.nextToken(); jap.setText(nichi); ← } wordsfile.close(); }(以下省略) ←の部分ですが、このままだと最後に読み込んだ行のnichiが表示されますよね? これを読み込んだ中からランダムに一行選んで表示するにはどうすれば良いでしょうか。

    • ベストアンサー
    • Java

専門家に質問してみよう