2

私はちょっとしたプログラムに取り組んでいます。そこで、適切なタイトルや数字などを挿入できるようにするコードを作成しました。これにより、適切な場所にある 4 つの異なるファイルに入力がコピーされます。編集しやすいようにいくつかのファイル (.xml と .html) を用意しました。キーワードを使用してから、.replaceAll("", ""); を使用します。

私の計画は、準備したファイルをリソースとして保持することです。そのため、.jar をコンピューターの任意の場所にドラッグして、プログラムがリソースから新しいファイルを生成し、.jar と同じディレクトリにあるファイルを編集できるようにします。

わかりましたので、Eclipse 経由でアプリケーションを起動するときはいつでも、すべて問題ありません。プログラムは、テンプレートを使用して入力に基づいて新しいファイルを作成し、編集対象として選択した既存のファイルを編集します。しかし、すべてを .jar にエクスポートすると、プログラムはエラーやそのようなものなしで、ある時点で停止します。

jarpath = getClass().getProtectionDomain().getCodeSource()
            .getLocation().getPath().substring(1);
//substring removes a / 

jarpathparent = jarpath.replace("alpha.jar", "");
// replacing with "" to get the only the directory where the .jar is.


public void generate(String s) throws IOException {
    String path = "", content = "";
    File file = null, outputfile = null;
    switch (s) {
    case "index":
        Dialog.info("", "1");
        path = getClass().getResource("index.html").toString()
                    .replace("file:/", ""); 
        Dialog.info("", "2");
        file = new File(path);
        Dialog.info("", "3");
        outputfile = new File(jarpathparent + "/index.html");
        Dialog.info("", "4");
        content = FileUtils.readFileToString(file);
        Dialog.info("", "5");
        content = content.replaceAll("XforTitle", title);
        Dialog.info("", "6");
        FileUtils.writeStringToFile(outputfile, content);
        Dialog.info("", "7");
        break;
    case "index2":
                   .
                   .
                   .

プログラムが停止する場所を見つけるために、作成した小さなダイアログクラスを使用しました。4 番目のダイアログ ボックスは、最後に表示されるダイアログ ボックスであるため、問題は次のようになります。

 content = FileUtils.readFileToString(file);

何が悪いのか正確にはわかりませんが、apache-commons-io (FileUtils) などを使用しているためでしょうか?

そして、コード全体を含むペーストビン リンク: http://pastebin.com/Px7SygYu (イメージラベルと .wav は単なる娯楽用です。)

__ _ __ _ __ _ __編集_ _ _ __ _ _ __ _ _ _ _

これで、リソース コンテンツをロードできるようになりました

を使用して

InputStream input = getClass().getResourceAsStream("/classpath/to/my/file");

からのコードスニペット

http://www.mkyong.com/java/how-to-convert-inputstream-to-string-in-Java/

だから私は今、ファイルの内容を文字列として持っており、それを新しいファイルに書きたいと思っています(.jarを置くディレクトリ内)

InputStream input = getClass().getResourceAsStream("index.html");
        content = getStringFromInputStream(input);
        Dialog.info("", "2");
        outputfile = new File(jarpathparent + "index.html");
        Dialog.info("", "3");
        content = content.replaceAll("XforTitle", title);
        Dialog.info("", "4");
        Dialog.info("", outputfile.getPath());
        try {
            FileUtils.writeStringToFile(outputfile, content);
        } catch (Exception e) {
            Dialog.vielText("", e.toString());
        }
        Dialog.info("", "5");

そのため、FileUtils.writeStringToFile(...); でクラッシュするようになりました。しかし、try catchでキャッチする必要がある例外を除いて、ダイアログはわかりません。コードでわかるように、出力パスを確認しましたが、問題ないようです。修正方法、または文字列 (.html テンプレートを含む) を File に書き込む方法について、他のアイデアはありますか?

4

1 に答える 1

0

jar では、jarpathビアgetCodeSource()に含まれます

jar:PATH_OF_JAR!PATH_IN_JAR

ここで PATH_OF_JAR は

file:/.... .jar

Java 7 では、Zip FileSystemを使用してファイル ベースのメンテナンスを行うことができます。

一般に、実行中のコードを変更するのは悪い方法であるため、jar が生成されるビルド パイプラインの使用を再検討してください。Mavenのファンとして、生成されたリソースのこの道をたどることがよくあります。

于 2013-08-13T12:43:46.367 に答える