- - PR -
VMに共有領域がありますか?
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-06-16 11:46
いつもお世話になっております
質問です。 1.JAVAのVMのメモリ領域に複数のJAVAアプレットから参照される領域を作れるか知りたいです。 - @JAVAアプレットAがmemPolicyという変数に値を格納します。 AJAVAアプレットAを閉じます。 BJAVAアプレットBを起動します。 CJAVAアプレットBがmemPolicyを参照します。 @〜Cのような処理が可能か調査しています。 ご存知のかたがいらっしゃいましたら、ご教示お願いします。 | ||||||||
|
投稿日時: 2004-06-16 14:59
Applet のメソッドにあるgetAppletContextで同じフレーム内にある
異なるアプレットのインスタンスを取得することは可能ですが、 ただ、@〜Cのようなことは無理だと思います。 回避方法として別途アプレットCにmemPolicyという変数を持たせて フレーム内に常駐させれば似たようなことは可能だと思います。 その他の方法としてはファイルマッピングオブジェクトを使う (ファイルアクセス制限、j2SDK1.4以降など条件つきますが) という方法でしょうか。 | ||||||||
|
投稿日時: 2004-06-16 16:02
さっそくの回答ありがとうございます。
ここでいうファイルマッピングオブジェクトというのはFileChannelClassと関係あるものですか?実際にどのようにして変数を共有するのかご存知でしたらお教え願います。 | ||||||||
|
投稿日時: 2004-06-16 17:35
通常、このような操作は不可能です。 代替案は、 1.クライアントのJVMのセキュリティ・ポリシーを下げて、ファイルに保存する。 2.アプレットダウンロード元のサーバーに通信して、サーバーに保存する。 3.AppletとJavaScriptを連携させて、JavaScriptからcookieに保存する。 どれもあまり現実的ではなさそうですが、参考までに。 # というか、Appletから直でcookieを操作できるようにしてくれ > Sun | ||||||||
|
投稿日時: 2004-06-16 17:43
Preferences APIはどうでしょうか?
http://www-6.ibm.com/jp/developerworks/java/040319/j_j-prefapi.html | ||||||||
|
投稿日時: 2004-06-16 18:45
早い回答ありがとうございます
この2の案は思いつきませんでした。 この案なら実現可能だと思いますので実現方法などを調査してみます。 本当にありがとうございました。
この記事も読んでみたのですが、知識がないのでどのようなことができるかわかりません。 Preferences APIを使うとデータ共有などが可能になるのでしょうか? よろしかったらお教え願います。 | ||||||||
|
投稿日時: 2004-06-16 19:16
FileChannelでファイルマップの使い方に興味もったので
サンプルを作って見ました。 Read,Writeはintしか用意していませんが参考程度には十分だと 思います。 ここで値を取り出す時の注意はファイルのアドレスを指定して取り出すので 型ごとのサイズに気を配る必要がありました。 (intならサイズ4) Cだとファイルマップでプロセス間の通信をした覚えがありますが Javaでこれが有効でしょうか? ちょっとご意見聞きたいと思います。 以下、ソース長くなりますが、、 -- FileMapTest .java ----------------------------------------------- import java.io.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; import java.text.*; public class FileMapTest { public static void main(String args[]) throws Exception { MapFile map = new MapFile(); map.intWrite(Integer.MIN_VALUE,0); System.out.println("map=" + map.intRead(0)); map.intWrite(100,4); System.out.println("map=" + map.intRead(4)); map.intWrite(1000,8); System.out.println("map=" + map.intRead(8)); map.intWrite(Integer.MAX_VALUE,12); System.out.println("map=" + map.intRead(12)); map.release(); } } class MapFile { // マップファイルのパス final static String mappath = System.getProperty("user.home") + File.separator + "UserApp.Map"; // マップファイルのサイズ final static long mapsize = 4096; private FileChannel channel = null; private MappedByteBuffer buffer = null; private FileLock fc = null; /** * コンストラクタ */ public MapFile() { try { init(); RandomAccessFile fa = new RandomAccessFile(mappath, "rw"); channel = fa.getChannel(); fc = channel.lock(); buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, channel.size()); } catch (Exception e) { e.printStackTrace(); } } /** * 明示的な開放 */ public void release() { try { fc.release(); channel.close(); } catch (Exception e) { e.printStackTrace(); } } /** * マップファイルの初期化 * (無い場合とサイズが異なる場合に限る) * @throws Exception */ public void init() throws Exception { File f = new File(mappath); if (!f.exists() || f.length() != mapsize) { FileOutputStream fo = new FileOutputStream(f); fo.write(new byte[ (int) mapsize]); fo.close(); } } /** * 指定したpostionからintデータを読み込む * @param postion long * @throws IOException * @return int */ public int intRead(int postion) throws IOException{ return buffer.getInt(postion); } /** * 指定したpostionにdataを書き込む * @param data int * @param postion long * @throws IOException */ public void intWrite(int data,int postion) throws IOException{ buffer.putInt(postion,data); } } [ メッセージ編集済み 編集者: いっきゅう 編集日時 2004-06-17 11:21 ] | ||||||||
|
投稿日時: 2004-06-17 13:28
サンプルまでのせていただき本当にありがとうございます。 このサンプルを使って二つのアプリを作り、下の@〜Cの操作を行った所、うまく行きました。 @JAVAアプリAが変数に値を格納します。 AJAVAアプリAを閉じます。 BJAVAアプリBを起動します。 CJAVAアプリBが変数の値を参照します。 とても参考になりました。 ありがとうございます。 | ||||||||
1
