プロが教える店舗&オフィスのセキュリティ対策術

こんにちわ。よろしくお願いします。
現在、JavaAppletを勉強中なのですが、
同じサーバ内にあるテキストファイルをAppletで表示して
手動、もしくは他プログラムからそのテキストファイルが書き換えられても
その書き換えられた後のテキストをAppletで表示する、といった事は可能でしょうか?
Appletはブラウザで開いたまま、としてです。

runメソッドの中にBufferedReaderを置き、
文字列を読み込んだ際に、その前に読み込んだ文字列と比較して、違えばrepaintとしてみたのですが、
Appletを表示したままテキストファイルを書き換えても、以前の文字列のままでした。

キャッシュやセキュリティの問題で、プログラムではどうしようもないものなのでしょうか。
当方、Javaはまだ勉強始めなので、もし解決法が分かる方いましたら、ご教授お願い致します。

A 回答 (3件)

なるほど


ローカルファイルを読んでいるのね。
確かにポリシーもしくは署名の設定が必要だわ。

「Applet」「ローカルファイル」「署名」「ポリシー」
こういった単語で検索すればOKよ。


ちなみにブラウザから利用するなら
Cookieなんて手もあるけどね。
    • good
    • 0
この回答へのお礼

お礼遅くなってしまい申し訳ありません。

やはりそうでしたか。
検索単語までご提示して頂きありがとうございます。

出来るだけユーザー側にセキュリティ関係の解除はさせたくないので
署名は触れない様にしました。
Cookieも試みましたが、最近Cookieをブロックしている方が多いので上記の理由でそちらも見送りました。

出来るだけAppletのみで動作させたかったのですが、サーバーサイドプログラムを併用する方法を取る事にします。
これからご教授頂いたタイムスタンプを取得する方法で作成を試みようと思っています。
ありがとうございました。

お礼日時:2010/01/20 16:38

通信ゲームが作れるくらいなので、試したことはないですが、理論上は可能です。

この回答への補足

こちらの補足に失礼します。
下に記載したソースはいろいろ試行していた段階のもので、正しくありませんでした。
こちらが作成したプログラムです。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.URL;

public class AppletTest2 extends Applet implements ActionListener{
Button bt;
String play1,play2=null;
public void init(){
bt = new Button("test.txtの読み込み");
add(bt);
bt.addActionListener(this);
}

public void paint(Graphics g){
String str=play2+"";
g.drawString(str,10,10);
}

@Override
public void actionPerformed(ActionEvent ae) {
InputStream is=null;
try{
is = new URL(getDocumentBase(),"test.txt").openStream();
Reader r = new BufferedReader(new InputStreamReader(is));

StringBuffer stringbuffer = new StringBuffer();

int intchar;
while((intchar=r.read()) != -1 ) {
stringbuffer.append((char)intchar);
}
play1 = stringbuffer.toString();
r.close();
if(!play1.equals(play2)){

play2=play1;
repaint();
}

} catch(IOException e){}
}
}

補足日時:2010/01/13 21:14
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

Appletは何かと制限が多いので、仕様上の可不可は心配していました。
Appletの通信ゲームあるんですね。見た事なかったです。

頑張ってみます。

お礼日時:2010/01/13 20:29

原因とは関係ないけど


ファイルが変わった
はファイルのタイムスタンプを見たほうがいいんじゃない?
毎回ストリームを開くのは処理が重過ぎるわ。

さて原因だけど
うまくいかないのはセキュリティとかじゃなくて
単に実装が間違っているためだと思うわよ。

まずは、
画面からのイベントをトリガーにファイルを読み込みなおす
というのを成功させることが大事ね。

それができればリペイントも成功するわ。

この回答への補足

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.URL;

public class AppletTest2 extends Applet implements ActionListener{
Button bt;
String play1,play2=null;
public void init(){
bt = new Button("test.txtの読み込み");
add(bt);
bt.addActionListener(this);
}

public void paint(Graphics g){
String str=getDocumentBase()+"";
g.drawString(str,10,10);
}

@Override
public void actionPerformed(ActionEvent ae) {
InputStream is=null;
try{
System.out.println(getDocumentBase());
is = new URL(getDocumentBase(),"test.txt").openStream();
Reader r = new BufferedReader(new InputStreamReader(is));

StringBuffer stringbuffer = new StringBuffer();

int intchar;
while((intchar=r.read()) != -1 ) {
stringbuffer.append((char)intchar);
}
play1 = stringbuffer.toString();
r.close();
if(!play1.equals(play2)){

play2=play1;
repaint();
}
} catch(IOException e){}
}
}

補足日時:2010/01/13 20:25
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

タイムスタンプというのは初めて知りました。
無駄に処理を重くしてると分かりつつも、これしか方法思いつかなくて・・・
この問題乗り越えたらタイムスタンプ使ってみようと思います。

とりあえず、スレッド処理をやめて、ActionListenerで再読み込み出来ないかテストプログラムを組んでみましたが、
やっぱり最初だけ読み込んで、テキストファイル更新後は反映されませんでした。
AppletViewerでは正常に動作しましたが、ブラウザで表示するとダメの様です。

補足に試しで作ったテストプログラムを記載しておきますので、お手数おかけしますが、ご指摘頂ければ幸いです。

お礼日時:2010/01/13 20:24

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