• ベストアンサー

Appletからテキストファイルを常に同期

こんにちわ。よろしくお願いします。 現在、JavaAppletを勉強中なのですが、 同じサーバ内にあるテキストファイルをAppletで表示して 手動、もしくは他プログラムからそのテキストファイルが書き換えられても その書き換えられた後のテキストをAppletで表示する、といった事は可能でしょうか? Appletはブラウザで開いたまま、としてです。 runメソッドの中にBufferedReaderを置き、 文字列を読み込んだ際に、その前に読み込んだ文字列と比較して、違えばrepaintとしてみたのですが、 Appletを表示したままテキストファイルを書き換えても、以前の文字列のままでした。 キャッシュやセキュリティの問題で、プログラムではどうしようもないものなのでしょうか。 当方、Javaはまだ勉強始めなので、もし解決法が分かる方いましたら、ご教授お願い致します。

  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

なるほど ローカルファイルを読んでいるのね。 確かにポリシーもしくは署名の設定が必要だわ。 「Applet」「ローカルファイル」「署名」「ポリシー」 こういった単語で検索すればOKよ。 ちなみにブラウザから利用するなら Cookieなんて手もあるけどね。

near_mirai
質問者

お礼

お礼遅くなってしまい申し訳ありません。 やはりそうでしたか。 検索単語までご提示して頂きありがとうございます。 出来るだけユーザー側にセキュリティ関係の解除はさせたくないので 署名は触れない様にしました。 Cookieも試みましたが、最近Cookieをブロックしている方が多いので上記の理由でそちらも見送りました。 出来るだけAppletのみで動作させたかったのですが、サーバーサイドプログラムを併用する方法を取る事にします。 これからご教授頂いたタイムスタンプを取得する方法で作成を試みようと思っています。 ありがとうございました。

その他の回答 (2)

  • e00083
  • ベストアンサー率31% (25/80)
回答No.2

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

near_mirai
質問者

お礼

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

near_mirai
質問者

補足

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

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

原因とは関係ないけど ファイルが変わった はファイルのタイムスタンプを見たほうがいいんじゃない? 毎回ストリームを開くのは処理が重過ぎるわ。 さて原因だけど うまくいかないのはセキュリティとかじゃなくて 単に実装が間違っているためだと思うわよ。 まずは、 画面からのイベントをトリガーにファイルを読み込みなおす というのを成功させることが大事ね。 それができればリペイントも成功するわ。

near_mirai
質問者

お礼

ご返答ありがとうございます。 タイムスタンプというのは初めて知りました。 無駄に処理を重くしてると分かりつつも、これしか方法思いつかなくて・・・ この問題乗り越えたらタイムスタンプ使ってみようと思います。 とりあえず、スレッド処理をやめて、ActionListenerで再読み込み出来ないかテストプログラムを組んでみましたが、 やっぱり最初だけ読み込んで、テキストファイル更新後は反映されませんでした。 AppletViewerでは正常に動作しましたが、ブラウザで表示するとダメの様です。 補足に試しで作ったテストプログラムを記載しておきますので、お手数おかけしますが、ご指摘頂ければ幸いです。

near_mirai
質問者

補足

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){} } }

関連するQ&A

  • テキストファイルの中身をAppletに常に表示

    お世話になります。 先日、Appletでの外部ファイルを常に同期させる方法をお尋ねしたものです。 それにより、Servletを併用し試行錯誤していたのですが、どうしても行き詰まり再度質問させて頂きました。 Applet内にあるスレッドから常にServletを呼び出し、 Servlet側では呼び出される度にサーバ上にある外部ファイルを読み込み、 その内容をAppletへ送信してAppletではその受け取ったデータを表示する というプログラムを組んでみたのですが、 外部ファイルの中身は表示はされず、コンソールにはIllegalStateExceptionが表示されます。 エラー内容を検索したりもしてみたんですが、うまく理解出来ませんでした。 以下にソースを載せておきますので、もしよろしければご教授お願いします。 ※Servlet側 package com.test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { static final long serialVersionUID = 1L; DataOutputStream dos; String test=null; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String checkFile="test.log"; String fn=getServletContext().getRealPath(checkFile); response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out=response.getWriter(); out.println("<html><head></head><body>"); out.println("<applet codebase=\"http://localhost:8080/Test\" code=\"TestApplet.class\" height=\"600\" width=\"800\">"); out.println("</applet>"); out.println("</body></html>"); out.close(); BufferedReader inn = new BufferedReader(new FileReader(fn)); //アプレットへの送信 response.setContentType("application/octet-stream"); dos=new DataOutputStream(response.getOutputStream()); String outPut=inn.readLine(); dos.writeUTF(outPut); dos.flush(); dos.close(); } } ※Applet側 import java.applet.Applet; import java.awt.*; import java.io.*; import java.net.URL; import java.net.URLConnection; public class TestApplet extends Applet implements Runnable{ String inPut; Label l1; public void init() { setSize(200, 100); setLayout(new FlowLayout()); l1 = new Label("Wait"); add(l1); Thread wait; wait = new Thread(this); wait.start(); } @Override public void run() { // TODO Auto-generated method stub try { while(true){ try { //サーブレットへの通信 URL url=new URL(getDocumentBase(),"./Test"); URLConnection conn = url.openConnection(); //play.logの状態取得 DataInputStream in = new DataInputStream(conn.getInputStream()); l1.setText(in.readUTF()); } catch(Exception e) { } Thread.sleep(1000); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

  • Java applet

    Java appletを使用する課題なのですが、 途中まで書いて、それから止まってしまっています。 アドバイスなど頂ければ嬉しいです。 課題は、 (1)右から左へ動く文字列左から右へ動く文字列とを表示 (2)文字列が消えたらまた出てくるようにする (3)マウスのクリックボタンを押すと止まり、離すと動きだすようにする (2)まで考えたプログラム(コンパイル、実行済)を以下に載せます。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class SasakiYui extends Applet implements Runnable{ Thread th = null; Graphics g; int x; public void init(){ setBackground(Color.white); } public void start(){ if(th == null){ th = new Thread(this); th.start(); } } public void run(){ while(!Thread.interrupted()){ for(x=600;x>-300;x=x-5){ repaint(); try{ Thread.sleep(50); } catch(InterruptedException e){} } } } public void paint(Graphics g){ g.drawString("Happy Brithday!",x,10); g.drawString("Happy Birthday!",600-x,40); } } (3)ができるようにするには、 addMouseListener(new Mouseadapter(){ public void mousePressed(MouseEvent e){……} を使用するのだろうとは思うのですが、 ・これを組み込むのはpublic void init(){の後で良いか ・……の部分に何を書けばいいのか の2点がわかりません; よろしければ、アドバイスお願い致します!

    • ベストアンサー
    • Java
  • アプレットとテキストファイル

    Java初心者です. appletでゲームのようなものを作ろうと思い, テキストファイル(*.txt)から文章を読み込んで 表示するようなプログラムを書きました. eclipseのアプレットビューアではちゃんと表示されるのですが, 自分でhtmlを書いてブラウザで表示させようとすると, このテキストファイルが読み込まれないのか,以下のようなエラーが ブラウザの下に出ました. java.security.AccessControlException: access denied(java.io.FilePermission ./res/aaa.txt read). これはどういうことなんでしょうか. eclipseのアプレットビューアを使ったら, プロジェクトフォルダに"java.policy.applet"というものができていたので, これをうまく使えたらいいのかとも思うんですが, どうもよくわかりません. ご回答お待ちしています. ちなみにOSはmac OSXで, フォルダの構成は, プロジェクトフォルダ  ー/src/*.java,*.class  ー/res/aaa.txt です.

  • テキストファイルから空白行をよむ

    空白行を含んだテキストファイルをよみこんで、それをそのまま表示するプログラムをつくりたいのですが、BufferedReaderのreadLineを使うとnullが返ってきてしまいます。どうすれば空白行ということがわかるのですか。

  • unicodeファイルの読み込み

    javaアプレット上で BufferedReader file = new BufferedReader(new FileReader("C:/test/list.txt")); で外部テキストファイルを読み込んでいるのですが、この外部テキストファイルの文字コードをANSIからUnicodeに変えるとプログラムが動かなくなります。日本語やアルファベットではない文字の保存のためにテキストをUnicodeにて保存しなければならないのですが、どうすればUnicodeのテキストファイルを読み込むことができますか。

    • ベストアンサー
    • Java
  • Eclipseを用いたJARファイル作成について

    Eclipseを用いてjavaのプログラムをしているのですが アプレットのプログラム"のみ"がJARファイルにエクスポートできずに困っております。 [プロジェクト]を右クリック→[エクスポート]→[JARファイル]に設定するところまでは良いのですが 「JARマニフェスト仕様」というページの、「アプリケーションのエントリー・ポイントのクラスを指定」という項目で、メインクラスを参照しても アプレットのプログラムのクラス"のみ"が表示されていないのでエクスポートできません。コンソールのプログラムのクラスは表示されているので おそらく、アプレットにはmainメソッドを用いていないので表示されないのだと思うのですが・・・。 mainメソッドがないプログラムの場合はどうすれば良いのでしょうか・・・? 自分なりに、↓など調べてみたのですがどこがいけないのかわかりません。 http://mailsrv.nara-edu.ac.jp/~asait/java/applet/applet.htm http://sunjava.seesaa.net/article/57546363.html どこをどうすればこの場合、EclipseでJARファイルが作成できるのか、詳しく教えていただければ助かります。 一応、アプレットは↓の簡単なプログラムを試してみました。実行は出来ます。 import java.applet.Applet; import java.awt.Graphics; public class Sample extends Applet { public void paint(Graphics g) { g.drawString("こんにちは",10,10); } }

  • AppletからMySQLへの接続について

    始めまして私は今、JavaAppletからMySQLへ接続し、データを呼び出してAppletの画面に表示するプログラムを作成しましたが、どうしてもMySQLに接続することが出来ません。ためしに、JavaからMySQLへ接続するプログラムを作成し動かしたところ問題はなかったので、JavaAppletの場合にはMySQLに接続するのにJavaと違ってなにか特別な設定やプログラムの記述が必要なのでしょうか?どなたか知っている方がおられましたら、ご教授お願いいたします。 また、今まで試したのは、自分のPCにもMySQLをインストールし接続したところ接続することができたので、以下のような状況になります。 JavaApplet(自分のPC) + MySQL(自分のPC) = 接続成功 JavaApplet(自分のPC) + MySQL(他のPC) = 接続不可 環境は、Webサーバ:Apache2.0.54、Java : j2sdk1.4.2_09、MySQL : MySQL 4.0.16、JDBC : mysql-connector-java-3.1.11-bin.jar です。 また、接続できなかった時にでたエラーは以下のとおりです。 ------------------------------------------------- ** BEGIN NESTED EXCEPTION ** java.net.SocketException MESSAGE: java.security.AccessControlException: access denied (java.net.SocketPermission 150.xxx.xxx.xxx:3306 connect,resolve) STACKTRACE: java.net.SocketException: java.security.AccessControlException: access denied (java.net.SocketPermission 150.xxx.xxx.xxx:3306 connect,resolve) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156) (以下省略) ------------------------------------------------- 上記の情報だけでは、わかりにくいかもしれませんが、 どうかよろしくお願いいたします。 以上

    • ベストアンサー
    • Java
  • Appletの使用に関して

    javaでゲームを作っていて、サーバーとクライアントプログラムがあるのですが、ブラウザで表示したいと思い、クライアントプログラムをApplet化しました。デバッグをしたところ、appletviewer ファイル名.htm で実行すると動作するのですが、HTMLファイルをダブルクリックしても表示されません。また、アップロードして、ブラウザで実行しようとしてもうまくいきません。 とりあえず、なぜappletviewerで出来るファイルをダブルクリックでやると出来ないのかがわからないので2つの実行の仕方の違いを教えて下さい。 また、ブラウザで出来ない理由としてどのようなことが考えられるのでしょうか?

    • ベストアンサー
    • Java
  • Java appletプログラムで困ってます。

    市販の本に掲載せれているEclipse下記プログラムを丸写しで打込みコンパイルしました。 それでWEB上で確認した所、オブジェクト動作上(.pngの表示・非表示)では動作している様に思います。 しかし、どうもLANネットワーク(最終的にはRS232C)動作反応がありません プログラムに問題があるのでしょうか? ネットワーク・セキュリティー・ファイヤウォール等に問題があるのでしょうか? まったく見当がつきません。Java言語は初心者です。 ご教授宜しくお願い致します。 import java.applet.Applet; import java.awt.Button; import java.awt.Event; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class xport002 extends Applet implements Runnable{ boolean sw1,sw2,run; Image img1,img2,img3; String buff; char com; Thread th=null; int port=10001; InetAddress xport_ip=null; Socket xport_socket; DataInputStream socketin; DataOutputStream socketout; public void init(){ try{ xport_ip=InetAddress.getByName(getCodeBase().getHost()); } catch(UnknownHostException e){} try{ xport_socket=new Socket(xport_ip,port); //socketin=new DataInputStream(xport_socket.getInputStream()); socketout=new DataOutputStream(xport_socket.getOutputStream()); } catch(Exception e){} img1=getImage(getDocumentBase(),"base2.png"); img2=getImage(getDocumentBase(),"Red3.png"); img3=getImage(getDocumentBase(),"Red4.png"); add(new Button("LED-R1")); add(new Button("LED-R2")); repaint(); } public boolean action (Event e,Object obj){ if(obj.equals("LED-R1")){ sw1=!sw1; com='1'; repaint(); run=true; } else if(obj.equals("LED-R2")){ sw2=!sw2; com='2'; repaint(); run=true; } return true; } public void start(){ if(th==null){ th=new Thread(this); th.start(); } } public void run(){ Thread me=Thread.currentThread(); while(th==me){ if(run){ try{ socketout.writeByte(com); socketout.flush(); repaint(); th.sleep(1000); } catch(Exception e){} run=false; sw1=false; sw2=false; repaint(); } try{ buff=socketin.readLine(); repaint(); } catch(IOException e){} } } public void stop(){ if(th!=null){ try{ socketin.close(); socketout.close(); xport_socket.close(); } catch(Exception e){} th.stop(); th=null; } } public void paint(Graphics g){ g.drawImage(img1,100,50,this); if (sw1)g.drawImage(img2,100,50,this); if (sw2)g.drawImage(img3,150,50,this); String t1=buff+"℃"; g.setFont(new Font("MS明朝",Font.BOLD,36)); g.drawString(t1, 100, 200); } }

  • JAVA テキストの取り出し方について

    ■JAVAのテキストの取り出し方について質問がございます。 ■テキストから一番最初の文字列を取り出したいのですが、どのような 方法があるか教えていただきたく参りました。 ■テキストの名前は shokijii.texで 状態は  問題,回答番号,解説,0,文,1,文,2,文,3,文  問題,回答番号,解説,0,文,1,文,2,文,3,文  問題,回答番号,解説,0,文,1,文,2,文,3,文  となっております。 ■今のところプログラムの記述は BufferedReader br =null; br =new BufferedReader(new FileReader(shokuji.txt)); ■と定義していますが、テキストの最初の文字列を取り出すには    br =new BufferedReader(new FileReader(shokuji.txt));                         ↓                      ■ここの()内ので                      どのように記述したら                      よいでしょうか? ■また()内での定義にかからわらず、  ・できそうな方法 テキストは調整可能ですので、  ・テキストに付け加えこのように定義したら取り出せるよ といった提案、意見などもございましたら、どうかお教えください。 お願い申し上げます。  

専門家に質問してみよう