プロが教えるわが家の防犯対策術!

いつも参考にさせて頂いています。
掲示板をファイル操作にて作成しようと思っています。
初歩的な質問かもしれませんが宜しくお願いします。

フォルダ構成が下記の場合、「confフォルダのtest.txt」を読み込む際のパスはどのように取得もしくは指定すれば良いでしょうか?

プロジェクトフォルダ
 |
 |----JavaSource ←.javaファイルを格納
 |----WebContent
     |----css
     |----js
     |----WEB-INF
         |----conf ←このフォルダ内のtest.txt
         |----jsp
         |----lib

ファイルの読み込みはBufferedReaderクラスを使うと効率よく読み込めるとネットで記述があったのでそれを使おうと思ってます。

BufferedReader br = new BuffferedReader(new FileReader("test.txt") );

みたいな感じで読み取れると思ってますが合ってますでしょうか?
("test.txt"の箇所に取得した(絶対又は相対)パスが入ると思ってます。)
以上宜しくお願いします。

A 回答 (2件)

ファイルのパスの取得方法がわからない、ということでしょうか?



String path = application.getRealPath("WEB-INF/conf/test.txt");

JSPなら、こんな感じで、test.txtの絶対パスが取得できます。後は、それを元にストリームを作成すればよいかと。サーブレットなら、ServletContext application = this.getServletContext();などで取得して同様に行えばいいでしょう。
    • good
    • 0
この回答へのお礼

早速のお返事ありがとうございます。
読み込みができました!ありがとうございます。
ですが書込みができません。

// 以下読み込み
ServletContext application = this.getServlet().getServletContext();

String path = application.getRealPath("/WEB-INF/conf/test.txt");

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));

int i = bis.available();
byte[] buf = new byte[i];
bis.read(buf);
bis.close();

// 以下書込み
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(path)));

pw.println("テスト");

pw.close();

System.out.println("取得した文字列は" + new String(buf));


取得した文字列はテスト

とちゃんと表示されるのですが、test.txtの中身を見てみると「テスト」とは書込みがされていません。
どこか間違っているのでしょうか?

お礼日時:2007/05/09 22:05

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(path)));


pw.println("テスト");
pw.close();

この3行は怪しげでしたが、試してみたらファイルへの
書き出しはできましたので、
path が思っているファイルを指していないのでは?
path の内容を出力して、
プロジェクトフォルダ/WebContent/WEB-INF/conf/text.txt
となっているか確認してみてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

 ファイルからテキストファイルを読み込んで、フォームから入力されたデータと照合し、ファイルにあればログインするというような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();
}
}

 ファイルからテキストファイルを読み込んで、フォームから入力されたデータと照合し、ファイルにあればログインするというようなwebアプリを作ろうとしています。

しかし、テキストファイルが読み込まれてないようで、正しいパスワードを入力してもログインできません。読み込むファイルへのパス指定は絶対パスなのでしょうか、呼び出し元からの相対パスを指定するのでしょうか?

また、テキストファイルを置くディレクトリは決まっているのでしょうか?(「WEB-INFより上の階層に置く」など)

ちなみ...続きを読む

Aベストアンサー

ファイルのパス名を絶対パスで指定するか、相対パスで指定するかというのはどちらでも問題なく出来るはずです。

絶対パスであれば、ファイルが存在する場合には問題なくアクセスできるはずですが、相対パスで指定する場合には環境に応じてファイルをどこに置くかが変わってきます。

サーバの環境が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の記述を修正するだけで動作するので。。。

どうでしょうか?

ファイルのパス名を絶対パスで指定するか、相対パスで指定するかというのはどちらでも問題なく出来るはずです。

絶対パスであれば、ファイルが存在する場合には問題なくアクセスできるはずですが、相対パスで指定する場合には環境に応じてファイルをどこに置くかが変わってきます。

サーバの環境がtomcat+apacheということで、tomcatが単独ではなくapcheにアドオンで動いているようなので、この場合相対パスのルート位置は、apache.confで指定したサーブレットのルート位置になっていませんか?

---- apa...続きを読む

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。

QJSPの処理の途中で、JavaScriptの処理をしたい

プログラムをJSPで記述している(<% %>タグ)のですが、
JavaScriptのalertやconfirmなどのポップアップするダイアログを
表示したいのです。それは可能なのでしょうか?

Aベストアンサー

No.2の回答に対する回答(変な日本語ですが)です。

JSPとJavaScriptの処理の行われる順番について考えていないと
エラーになることがありますよ。
大まかな流れは、
 JSPのソースをサーバ側で解釈、実行する(HTMLのソースを吐き出す)
  ↓
 クライアントに生成したソースを送信する
  ↓
 クライアント側のブラウザがソースを解釈する
  ↓
 ソースの中のJavaScriptを、ソースの上のほうから順次実行する
  ↓
 同時に、通常の表示(HTMLの解釈)も実行される

 と、こういう流れですので、例えば、JavaScriptで値を入力し、
JSPでその値を使おうとすると、エラーとなります。

 具体的にやりたいこと(やろうとしていること)を書いていただいたほうが
適切に回答できますが、上記が今考えられるエラーの原因です。

Qwebアプリケーションでの画像ファイルの保存場所

お世話になります。

Javaと、MySQLでウェブアプリケーションを作成していまして、ユーザーがアップロードしたファイルを
どこのディレクトリに保存すればいいか悩んでいますので、教えてください。

ユーザーがログインし、自分のアイコンを設定した場合、
その画像ファイル(jpgなど)はどのフォルダに置いておけばいいのでしょうか?

例えば、imgフォルダにおいた場合、バージョンアップしたプログラムをデプロイすると、
サーバー内のimgフォルダ内のデータはなくなってしまうと思いますので、ユーザーがアップした画像などは
そこに置いてはいけないと思います(バージョン・アップ時に消えてしまいますので)。

「デプロイしても消されない場所に置けばいい」ということでしょうか?

皆さんはどうされていますでしょうか?

よろしくお願い致します。。

Aベストアンサー

こんにちは。

検索すればいろんなサンプルが出てくると思いますよ。

すごく簡単に書くとしたら

// 画像ファイルのパス
File file = new File ( "/home/・・・・" );
response.setHeader ( "Content-Type", "image/jpeg" );
response.setContentLength ( (int)file.length() );
// 出力と入力
ServletOutputStream out = response.getOutputStream();
BufferedInputStream in = new BufferedInputStream ( new FileInputStream(file) );

int data = 0;

while ( (data = in.read()) != -1 ) {
// 書き出す
out.write(data);
}
in.close();
out.close();

これをサーブレットなりで呼び出してあげれば、任意の場所の画像ファイルを出力します。
(実際の運用ではパラメータでID等を渡してDBからファイル名を取得する)

これを応用すると、必ずサーブレットなりを介さないとファイルには直接アクセスできないため、
認証をさせたり、ダウンロード数を把握したり、期限を設定したりいろいろ出来るようになります。

こんにちは。

検索すればいろんなサンプルが出てくると思いますよ。

すごく簡単に書くとしたら

// 画像ファイルのパス
File file = new File ( "/home/・・・・" );
response.setHeader ( "Content-Type", "image/jpeg" );
response.setContentLength ( (int)file.length() );
// 出力と入力
ServletOutputStream out = response.getOutputStream();
BufferedInputStream in = new BufferedInputStream ( new FileInputStream(file) );

int data = 0;

while ( (data = in.read()) != -1 ) {
// 書き出す
out....続きを読む

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

Qリクエストに応じたselectedの初期値設定方法

リクエストに応じたOPTIONをselectedの初期値にする方法を教えて下さい。

java servletからjspを表示する際に、
setAttributeした値に応じてプルダウンの初期値に設定するにはどうしたら良いですか?

以下の様にDetail.jspに移動する前に、NOをセットしています。
普通に実行したら、YESで表示されてしまいます。
jsp側で何かを追記すれば良いと思うのですが、全然わかりません。。。

例)
[[[[[ShowDetail.java]]]]]
request.setAttribute("JAPAN", "NO");
request.getRequestDispatcher("/Detail.jsp")
.forward(request, response);

[[[[Detail.jsp]]]]
<form name="Japan">
<table border="1">
<tr>
<th>Japan</th>
<td>
<select name="Japan" id="Japan" >
<option value="YES">YES</option>
<option value="NO">NO</option>
<option value="KNOW">DON'T KNOW</option>
</select>
</td>
</tr>
</table>
</form>

リクエストに応じたOPTIONをselectedの初期値にする方法を教えて下さい。

java servletからjspを表示する際に、
setAttributeした値に応じてプルダウンの初期値に設定するにはどうしたら良いですか?

以下の様にDetail.jspに移動する前に、NOをセットしています。
普通に実行したら、YESで表示されてしまいます。
jsp側で何かを追記すれば良いと思うのですが、全然わかりません。。。

例)
[[[[[ShowDetail.java]]]]]
request.setAttribute("JAPAN", "NO");
request.getRequestDispatcher("/Detail.jsp")
.f...続きを読む

Aベストアンサー

こんにちは。

>普通に実行したら、YESで表示されてしまいます。
>jsp側で何かを追記すれば良いと思うのですが、全然わかりません。。。

あと、カテゴリがJavaScriptではなくJavaですね。

順に考えてみませんか。初期値を設定するには何が必要でしょうか。
今は何もしていないから一番上のYESが表示されています。
<option value="NO" selected="selected">とする必要がありますよね。
そうしたらそれを出力するようにJSPを記述すればいいわけです。

フレームワークを何も利用していなければ以下のようになると思います。

<%
// 例だとjapanにNOが入っている
String japan = (String)request.getAttribute ( "JAPAN" );
%>

<select>
<option value="YES"<%= "YES".equals(japan) ? " selected=\"selected\"" : ""; %>>YES</option>
<option value="NO"<%= "NO".equals(japan) ? " selected=\"selected\"" : ""; %>>NO</option>
<option value="KNOW"<%= "KNOW".equals(japan) ? " selected=\"selected\"" : ""; %>>KNOW</option>
</select>

各optionでどの文字列が入っているかによってselected="selected"を出力すれば良いです。

<%= "YES".equals(japan) ? " selected=\"selected\"" : ""; %>

上の記述は

if ( "YES".equals(japan) ) {
out.write ( " selected=\"selected\"");
} else {
out.write ( "" );
}
と同義です。
ようするにjapanにYESが入ってきたらselected="selected"を出力することにより初期選択項目とする。
NOが入ってくれば"YES".equals(japan)には該当しないので無出力、次の"NO".equals(japan)で該当するのでNOの<option>が初期値となります。

こんにちは。

>普通に実行したら、YESで表示されてしまいます。
>jsp側で何かを追記すれば良いと思うのですが、全然わかりません。。。

あと、カテゴリがJavaScriptではなくJavaですね。

順に考えてみませんか。初期値を設定するには何が必要でしょうか。
今は何もしていないから一番上のYESが表示されています。
<option value="NO" selected="selected">とする必要がありますよね。
そうしたらそれを出力するようにJSPを記述すればいいわけです。

フレームワークを何も利用していなければ以下のようになると...続きを読む

QJSPでの画像ファイル表示

<img src="~.gif">とすれば、決められた画像は表示できるのですが、"~.gif"の部分に変数を使用して、場合に応じて、ファイル名(数字)が違う画像ファイルを読み込ませたいのです。
その場合当然なのですが、<img src="~" + <% 変数 %> + ".gif">としても、できないんですよね。

何か方法をご存知の方教えてください。よろしくお願いします。

Aベストアンサー

<img src="~ <%= 変数 %>.gif">
じゃないですか?

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Qjspでファイルの読み込み

jspでwebサーバーにある“1.txt”ファイルを読み込んでそれを表示するプログラムを作成したのですが、エラーが出てしまいます。サーバーの環境(jsp実行環境等)は問題ありません。以下のコードで何かおかしなところがありましたら教えてください。


<%@ page contentType="text/html"
import="java.util.*,java.io.*"
%>
<%
String result = "";
String h_s = "";
FileReader h_fr = new FileReader("1.txt");
BufferedReader h_br = new BufferedReader(h_fr);
while(true){
h_s = h_br.readLine();
if (h_s == null){
break;
}
result = result + h_s;
}
%>

<%= result %>

jspでwebサーバーにある“1.txt”ファイルを読み込んでそれを表示するプログラムを作成したのですが、エラーが出てしまいます。サーバーの環境(jsp実行環境等)は問題ありません。以下のコードで何かおかしなところがありましたら教えてください。


<%@ page contentType="text/html"
import="java.util.*,java.io.*"
%>
<%
String result = "";
String h_s = "";
FileReader h_fr = new FileReader("1.txt");
BufferedReader h_br = new BufferedReader(h_fr);
while(true){
h_...続きを読む

Aベストアンサー

> FileReader h_fr = new FileReader("1.txt");
ここのところですが、JSPのスクリプトレット内からの
相対パスは、*.jspファイルからのパスではなく、
JSPがServletに変換されてclassファイルとして
classesディレクトリなどに配備された位置からの
パスになるはずです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング