fc2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Applet
カテゴリー「Applet」の記事一覧

【Applet】【Java】jar 内リソースからテキストファイルを読み込む  


これも簡単。これまでの以下のコードを組み合わせるだけでできる。コピペで構わない。

getJarFileURL() - クラスから自身の jar の URL を取得する
toJarURL() - jar 内のリソースを取得する
loadText() - ストリームからテキストファイルを読み込む

実行は前回同様 Applet で Web ページから、.jar で起動してることを想定している。読み込むファイルが、Web サーバ上から、 jar 内リソースに変わっただけだ。

//設定値
private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード

//jar ファイル内から、テキストファイルを読み込む
public static final String loadTextJar(String fileName, Object context) throws IOException, FileNotFoundException {
final String jarUrl = toJarURL(fileName, context);
if (jarUrl == null) { //見つからないとき
throw new FileNotFoundException();
}
final URL url = new URL(jarUrl);
InputStream is = url.openStream();
return loadText(is, DEFAULT_ENCORDING);
}

//メインでは... (※例外処理は省略)
String fileName = "res/data/sample.txt"; //jar 内相対パス
String text = loadTextJar(fileName, this); //this は起動した Applet オブジェクトが良い

//System.out.println(text);
//↑では確認しずらいので、↓のメソッドなどで確認
public void paint(Graphics g) {
g.drawString(text, 5, 25);
}

内容的には前回の「URL経由でWebサーバ上のテキストファイルを読み込む」とほとんど変わらない。toJarURL() から null が返って来た時、わかりやすいように FileNotFoundException() を throw しているが、特に何でも構わない。

これで jar ファイル内に小さな設定ファイルなどを置いて、読み込んで行く事もできる。
ストリームを開いて、loadText() に投げるという基本は変わらない。

次回からは同じ要領で Android でのテキストファイルの読み込みを考えてみよう。





(関連記事)
【Applet/汎用】URL経由でWebサーバ上のテキストファイルを読み込む
【Android】res/raw リソースフォルダからテキストファイルを読み込む
【Android】assets フォルダからテキストファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードからテキストファイルを読み込む
【Android】SDカードにテキストファイルを保存する
【汎用】ストリームからテキストファイルを読み込む(ストリームから読み込み、テキストエンコードして返す)
【汎用】ローカルシステム(Windows 等)から、テキストファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ
【Android】Preference 機能を使ってデータを読み込み・保存する



スポンサーサイト



category: Applet

thread: プログラミング

janre: コンピュータ

tag: テキストファイル読み込み 
tb: 0   cm: --

【Applet】【Java】URL経由でWebサーバ上のテキストファイルを読み込む  


Android でも使えるhttpダウンロード方式は→こちら

前回の続き。というか使い回しもテーマの内なので、2つの関数

readStream() - ストリームから読み込み、バイト配列で返す
loadText() - ストリームから読み込み、テキストエンコードして返す


は、そのまま使う。

今回は URL 経由で同 Web サーバ上のテキストファイルを読み込む方法。もちろんブラウザのアクセスと同じ仕様になるわけで、ファイルの読み取りパーミッションやディレクトリの閲覧権限なども関係するが、とりあえずそれらはOKの状態を前提としてコードを書いてみる。ストリームから読み込むルーチンは前回完成してるので、それを使えばもの凄く簡単だ。実行は Applet で Web ページから 、.class や .jar から起動してることを想定している。

//設定値
private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード

//URL経由でWebサーバ上のテキストファイルを読み込む
public static final String loadTextURL(URL url) throws IOException {
InputStream is = url.openStream(); //url.openConnection().getInputStream() と同じ
return loadText(is, DEFAULT_ENCORDING);
}

//メインでは... (※例外処理は省略)
String fileName = "res/data/sample.txt"; //html からの相対パス
String text = loadTextURL(new URL(getCodeBase(), fileName)); //同サーバ上の場合

//System.out.println(text);
//↑では確認しずらいので、↓のメソッドなどで確認
public void paint(Graphics g) {
g.drawString(text, 5, 25);
}

同 Web サーバ上の自アプリ用のテキストファイルを読み込んでることを想定しているので、getCodeBase() を使っているが、別サーバで "http://~" の指定でも構わない。ただしその場合は、アクセス権限や、サーバによってはクロスドメインの設定など必要になるかもしれない。

(参考) クロスドメインのセキュリティ・モデル
(参考) クロスドメインポリシーファイル
(参考) カスタムポリシーファイル

また同サーバ上でないなら、本来はこの readStream() のように一気に読み込み、全ての文字エンコーディングしていくタイプより、通信しながら随時文字エンコーディングしていくコードの方が良いだろう。その場合は InputStreamReaderBufferedReader を使った方が良い。~Reader クラスというのは言わば、通常の ~Stream 関連クラスに順次文字エンコーディングしていく機能を付け加えたものと考えれば簡単だ。また別サーバとの通信は、片方のサーバダウンやアクセス障害なども考慮に入れて、通常は別スレッドにして、メインでは進捗を表示する事が多いね。そうでないと、いつの間にかどちらかのサーバがダウンなどして、いつまでも待ち状態になり兼ねない。タイムアウト機能も必要だろう。小さなファイルならそれほど問題もないが、大きなファイルには向かない。同サーバ上なら、起動ファイルも一緒に落ちるので、見た目でわかりやすい分、そこまで神経質になる必要もないが(笑)。

これでサーバ上に小さな設定ファイルなどを置いて、読み込んで行く事もできる。

次回は jar 内のリソースからテキストファイルを読み込んでみよう





(関連記事)
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Applet】jar 内リソースからテキストファイルを読み込む
【Android】res/raw リソースフォルダからテキストファイルを読み込む
【Android】assets フォルダからテキストファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードからテキストファイルを読み込む
【Android】SDカードにテキストファイルを保存する
【汎用】ストリームからテキストファイルを読み込む(ストリームから読み込み、テキストエンコードして返す)
【汎用】ローカルシステム(Windows 等)から、テキストファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ
【Android】Preference 機能を使ってデータを読み込み・保存する


category: Applet

thread: プログラミング

janre: コンピュータ

tag: テキストファイル読み込み 
tb: 0   cm: --

【Applet】【Java】jar 内のリソースを取得する  


前回の続き
関数内で使っている getJarFileURL() は前回の関数をそのまま使う。

//ファイルパスから jar 内のリソース URL を作成する
public static final String toJarURL(String fileName, Object context) {
final URL url = getJarFileURL(context); //jar の url を取得
if (url == null) {
return null; //失敗
}
return "jar:" + url.toString() + "!/" + fileName; //JAR URL 構文にするだけ
}

//メインでは
String resFilePath = "res/data/sample.txt";
String jarUrl = toJarURL(resFilePath , this);
System.out.println("jarUrl = " + jarUrl);
//入力ストリームを開く
URL url = new URL(jarUrl);
InputStream is = url.openConnection().getInputStream();
・・・(以下略=リソースごとの読み込み処理)・・・

引数 context は jar 内の .class なら何でも良いが、起動した Applet が分かり易い。Android ではリソース読み込みに Context を引数によく使うので、名前を合わせただけ。

また、jar 内のファイル構成によっては、この関数を使う必要はない。例えば起動クラスがルートにある場合は、ClassLoader の getResource() を使えばリソースを読み込める。しかしどうやら getResource() は起動クラスから、同・下位階層しか上手く取得できないらしい。Android のようにパッケージ名などで、深い階層に起動クラスがあるときには、この getJarFileURL(), toJarURL() を利用した方が良いだろう。このJAR URL は絶対パスみたいなものなので、リソースがどこにあっても読み込めるという利点がある。

(参考) JAR URL 構文

■Android の起動クラスとリソース配置関係
com/example/text/MainActivity.class  ←起動クラス
res/drawable-XXX/~ ←リソース(Context.getResources() で読める)
assets/~ ←リソース(AssetManager で読める)

■Applet の起動クラスとリソース配置関係(起動クラスがルート)
MainApplet.class  ←起動クラス(ここなら ClassLoader.getResource() で読める)
res/~ ←リソース(ルートでも良い)

■Applet の起動クラスとリソース配置関係(起動クラスが深い階層)
com/example/text/MainApplet.class  ←起動クラス(ここだと res が上位階層になり、上手く読めない)
res/~ ←リソース(ルートでも良い)

まぁ、Applet はすべてをルートに置いても問題なく動くけどね。または jar コマンドを使って、リソースを同・下位階層に置くとか。
ただ、Eclipse で開発する分には階層対応で作った方が、そのままアーカイブにできるし楽なんだよね。その辺はご自由に。


(関連記事)
【Applet】jar 内リソースからテキストファイルを読み込む
【Apple/汎用】URL経由でWebサーバ上のテキストファイルを読み込む
【汎用】ストリームからテキストファイルを読み込む(ストリームから読み込み、テキストエンコードして返す)
【汎用】ローカルシステム(Windows 等)から、テキストファイルを読み込む
【Android】res/raw リソースフォルダからテキストファイルを読み込む
【Android】assets フォルダからテキストファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードからテキストファイルを読み込む
【Android】SDカードにテキストファイルを保存する
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ
【Android】Preference 機能を使ってデータを読み込み・保存する



category: Applet

thread: プログラミング

janre: コンピュータ

tb: 0   cm: --

【Applet】【Java】クラスから自身の jar の URL を取得する  


Android と Applet 互換ライブラリを作成しているとき、各コンポーネントの仕様の違いで、いくつか必要な機能があったので、その辺を載せてみる。ググっても見つけるのが大変だったものとかね。

起動している自分の jar の URL を取得する方法は色々あったが、結構面倒臭かったので、一番簡単な関数を作ってみた。

//クラスから自身の jar の URL を取得する(jar 内の .class からのみ)
public static final URL getJarFileURL(Object object) {
try {
//ClassLoader から JAR URL の形式の文字列を作る
final ClassLoader loader = object.getClass().getClassLoader();
final String name = object.getClass().getName().replace('.', '/') + ".class";
final URL url = loader.getResource(name);
//パターンマッチングで URL 部分だけ抽出(ただし、"jar:~.jar!/" しか考慮してない)
final Pattern p = Pattern.compile("^jar\\:(.+?\\.jar)\\!\\/(.*)");
final Matcher m = p.matcher(url.toString());
if (m.matches()) {
final MatchResult res = m.toMatchResult();
return new URL(res.group(1));
}
} catch (Exception e) {
//MalformedURLException, ClassCastException, NullPointerException, ...
}
return null; //取得失敗した場合はすべて null
}

//メインでは
URL url = getJarFileURL(this);
System.out.println("url = " + url.toString());

全部一発クラスにつっこんで結果を取得してるので、例外処理は手抜きした(笑)。1つでも上手く取得できなければダメなので、すべて使い捨て final にしてるが、その辺はご自由に。jar ファイル内の .class 以外が引数(object)だと、null が返る。static final 関数で作ってあるので、汎用的に使えるだろう。URL 取得はネットから問い合わせても良いが、レスポンス待つのも面倒なので、正規表現で取得するようにした。本来なら "http://" やポート番号なんかも考慮すべきかもしれないが、JAR URL 構文の仕様を見て、とりあえず自作範囲で使う分には簡単な表現で十分だと考えた。厳正なURLが必要なら修正した方が良いだろう。ついでに、res.group(2) でエントリ部分を取り出す事もできる(ここでは使ってない)。その辺の修正もご自由に。

もちろん、URL クラスで返してるので、入力ストリームを開けば、アプリ実行中にそのまま使える。

//入力ストリームを開く
InputStream is = url.openConnection().getInputStream();

これを使えばリソースも取得できる。実はそのために作ったものだったりする。それはまた次回(笑)。


(関連記事)
【Applet】jar 内リソースからテキストファイルを読み込む
【Applet/汎用】URL経由でWebサーバ上のテキストファイルを読み込む
【汎用】ストリームからテキストファイルを読み込む(ストリームから読み込み、テキストエンコードして返す)
【汎用】ローカルシステム(Windows 等)から、テキストファイルを読み込む
【Android】res/raw リソースフォルダからテキストファイルを読み込む
【Android】assets フォルダからテキストファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードからテキストファイルを読み込む
【Android】SDカードにテキストファイルを保存する
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ
【Android】Preference 機能を使ってデータを読み込み・保存する


category: Applet

thread: プログラミング

janre: コンピュータ

tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

PR

▲ Pagetop