From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

jarファイル内でのリソース(テキストファイル)へのアクセス

jarファイルにテキストファイルを追加し、読み込み書き込みを行うことを目的とする。とりあえず読み込みは成功。書き込みが難しい。
調べたところ無理らしい。よって外部ファイルを用意しておく必要がある。

ソースコード
メインクラス

 


 

package program;

public class MainRun {

    public static void main(String[] args) {
       
        SFrame sf = new SFrame("SaveText");
    }
   
}


本体


package program;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLDecoder;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class SFrame extends JFrame{

    private JButton jb1, jb2;
    private JTextField jtf1, jtf2;
    private Dimension size;
    private InputStream is;
    private URL url;
    private GBLayout gbl = new GBLayout();
    SFrame(String title){
        super(title);
       
        size = new Dimension(100,30);
       
        url = this.getClass().getResource("TEXT/Setup.txt");
       
        jtf1 = new JTextField(30);
        jtf1.setPreferredSize(size);
       
        jtf2 = new JTextField(30);
        jtf2.setPreferredSize(size);
        jtf2.setForeground(Color.white);
        jtf2.setBackground(Color.black);
       
        jb1 = new JButton("save");
        jb1.setPreferredSize(size);
        jb1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                try {
                    BufferedWriter bw = new BufferedWriter(new FileWriter(URLDecoder.decode(url.getFile())));
                    bw.write(jtf1.getText());
                    jtf2.setText("ファイルをセーブしました。");
                    bw.close();
                } catch (IOException e) {
                    // TODO 自動生成された catch ブロック
                    e.printStackTrace();
                }
            }
        });
       
        jb2 = new JButton("load");
        jb2.setPreferredSize(size);
        jb2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                try {
                    is = gbl.getClass().getResourceAsStream("TEXT/Setup.txt");
                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                    //BufferedReader br = new BufferedReader(new FileReader(URLDecoder.decode(url.getFile())));
                    jtf1.setText(br.readLine());
                    jtf2.setText("ファイルをロードしました。");
                    br.close();
                } catch (IOException e) {
                    // TODO 自動生成された catch ブロック
                    e.printStackTrace();
                }
            }
        });
       
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
       
        GBLayout.addGB(jb1, getContentPane(), 0, 0, 1, 1);
        GBLayout.addGB(jb2, getContentPane(), 0, 1, 1, 1);
        GBLayout.addGB(jtf1, getContentPane(), 1, 0, 1, 1);
        GBLayout.addGB(jtf2, getContentPane(), 1, 1, 1, 1);
       
        pack();
        setLocation(300, 300);
        setVisible(true);
    }
}



解説
画像ファイルと同様にURLまたはInputStreamを受け取ります。
書き込み
使っているパソコンの問題でディレクトリにスペースがあるため、ファイルのパスをStringに落とすと文字化け(%20とか)する。そこでURLDecoder.decode(url.getFile()))を使ってごまかしてみた(推奨されてないメソッド)。この方法だとEclipse上で実行するとうまくいくのですが、jarファイルにするとファイルが見つからないと言われる(パスの表示でjarの後ろに'!'が入っていたため?)。
読み込み
読み込みの方ではInputStreamReaderを使うことで問題なく、テキストファイルのパスを渡すことができる。一度BufferedReaderをcloseするとInputStreamもcloseするため、イベント内でInputStreamを新規に呼び出すようにしている。書き込みと同じように(コメントアウトしている方法)で呼び出すとjarにしたときに同様のエラーが発生する。

Eclipseでエクスポートしてjarファイルにするときにtxtファイルがシステムに非同期であると怒られた。適当にいじったら消えた。理由は不明。注意が必要。
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/22-99e8301e
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。