• ベストアンサー

赤色の X イメージが表示され、アプレットが実行されない

HP上でAppletを起動させたところ、アプレットが存在するはずの位置に赤色の X イメージが表示され、アプレットが実行されません。Javaのコンソールを表示すると以下のようになります。パーミッションはすべてのユーザに読み込み許可を与えているのですが...。 予想としては、 FileReader f = new FileReader("penguin.obj"); この箇所が間違っている気がするのですが、解決方法をどなたか教えてください。 java.security.AccessControlException: access denied (java.io.FilePermission penguin.obj read) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkRead(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileReader.<init>(Unknown Source) at Drawmap.init(Drawmap.java:22) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

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

  • ベストアンサー
  • bnosuke
  • ベストアンサー率21% (4/19)
回答No.4

>すべてサーバー側にあるファイルを読もうと考えてこのようにしています。 ということであれば、 > FileReader f = new FileReader("./" + "penguin.obj"); は完全な間違いです。 これは、アプレットを実行しているクライアント側のファイルを読み込もうとしています。 gifファイルの読み込みが成功しているのは、ファイルの位置としてサーバー側の位置を指定しているからです。 試しに、GIFファイルの読み込みと同じ場所で以下のコードを実行して、コンソールに何が表示されたかを確認してください。 System.out.println(getCodeBase()); そして、objファイルの読み込みとしては FileReader f = new FileReader(new File(getCodeBase() + "penguin.obj"); のような形になると思われます。 ※"penguin.obj"は"/penguin.obj"かも知れません。

marucha
質問者

お礼

ありがとうございます。 なんとか解決の糸口が見つかりました。 FileReader f = new FileReader(new File(getCodeBase() + "penguin.obj"); ※"penguin.obj"は"/penguin.obj"かも知れません。 どちらも試しましたが、なぜか読み出せなかったため URL url = new URL(getCodeBase() + "penguin.obj"); InputStream is = url.openStream(); として読み出したところ読み出しに成功しました。

その他の回答 (3)

  • bnosuke
  • ベストアンサー率21% (4/19)
回答No.3

>".gif"画像ファイルに関しては読み込めたのですが、 これはどこに置いてあるファイルですか? 読んでいるソースファイルを書き出してみていただけませんか? アプレットができるのは、それがやってきたサーバーとの通信くらいしかできません。 ローカルのファイルを読むことは、アプレットに署名をつけ、実行マシンに対応した証明書を読み込ませる等しなければいけません。 >>FileReader f = new FileReader("penguin.obj"); このコードだと、アプレットを読み込んで実行するマシン上のファイルを読もうとしているように見えますが、これは想定した動作ですか? ひょっとしてサーバー側にあるファイルを読もうとしてこのようにされているのでしょうか。 もしそうなのであれば、ファイルの読み込みと言うより、サーバー側との通信の話になります。 サーバー側にも何らかのプログラムが必要です。(FTPなりHTTPなりの) そしてそのサーバーと対話してデータを持ってくる、と言うことになります。

marucha
質問者

補足

アドバイスありがとうございます。 以下補足させていただきます。 >これはどこに置いてあるファイルですか? -Java  |_tv.gif  |_penguin.obj  |_Drawmap.class  |_Drawmap.java  |_index.html サーバー側に上記のようにJavaディレクトリ内に各ファイルを置いています。 >読んでいるソースファイル //gifファイルの読み込み public void init() {  pic = getImage(getCodeBase() , "tv.gif"); ...... //objファイルの読み込み FileReader f = new FileReader("./" + "penguin.obj"); BufferedReader br = new BufferedReader(f); ...... アプレットに署名をつけようとしましたが、分かりやすいサイトが見つからず結局わかりませんでした。そのあたりも補足していただけるとありがたいのですが...。 >FileReader f = new FileReader("penguin.obj"); このコードだと、アプレットを読み込んで実行するマシン上のファイルを読もうとしているように見えますが、これは想定した動作ですか? ひょっとしてサーバー側にあるファイルを読もうとしてこのようにされているのでしょうか。 私の実行方法は、FTPにより各ファイルを転送したあとに,InternetExplorerにより指定URLにアクセスしてjavaプログラムの動作を確認しています。なので、すべてサーバー側にあるファイルを読もうと考えてこのようにしています。

回答No.2

Appletはローカル(Applet実行端末)のファイルを読み込むことはできません。 (ネットに繋いでアプレットを表示したら、自分のPCの中身が読み込まれるってのはありえませんよね?できたら怖いですよね?) 署名付きアプレットにすればできると思いますが、 詳しくないので、他の方の回答を… ごめんなさい。

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

これはアプレットのセキュリティが原因です。 通常ではアプレットはローカルファイルへのアクセスが出来ません(読み書き共に)。 これを回避するにはJavaのポリシーを変更するか、アプレット(というかjar)に署名することで可能です。 ついでですが、アプレットには様々な制限があるので一度調べてみると良いと思います。

marucha
質問者

補足

アドバイスありがとうございます。 javaを始めて一月ほどなので、本質が飲み込めずまだもやもやしている箇所があるので補足質問させてください。 ".gif"画像ファイルに関しては読み込めたのですが、".obj"や".txt"形式のファイルが読み込めないのはなぜですか? ".obj"形式のファイルがサーバ上にあって、サーバ側でパーミッションの設定をしても効果はないのでしょうか?

関連するQ&A