入力ストリームを取得するために ResorceLoder クラスを使用しましたが、outputStream を取得するにはどうすればよいですか。そのパッケージにあるデータを変更することは可能ですか?同じjarファイル)
3 に答える
実行時にjarファイルのリソースを直接変更することはできません。ClassLoader (これらの InputStreams を提供するものは、jar ファイル内のファイルを書き換えるための OutputStream を提供しません)。
実行時に画像やリソースをそのように操作したい場合は、それらを jar ファイルに入れずに、ファイル システムから取得してください。
クラスパスリソースの変更は、クラスローダーとクラスパスに応じて、困難または不可能です。
クラスパス リソースがファイル システム ディレクトリにある場合は、それを置き換えることができるはずです。ただし、ファイルがロックされている可能性があり、JVM を再起動するまで更新されたリソースが表示される保証はありません。
クラスパス リソースがローカル ファイルシステムの JAR または ZIP にある場合、さらにいくつかの問題があります。
JAR または ZIP ファイルのインプレース更新は実行できません。新しい ZIP / JAR を作成し、既存のコンテンツをそれにコピーする必要があります。
クラスパス上の ZIP または JAR ファイルはロックされます。
クラスパス リソースがダウンロードされた ZIP または JAR にある場合、(一般に) ソースでファイルを更新することはできません...そのため、変更が「定着」しない可能性があります。
カスタムクラスローダーを使用している場合、すべての賭けはオフです...
要するに、これを行う別の方法を見つける方が良いです。たとえば、リソースをファイルシステムの書き込み可能なディレクトリにコピー/インストールし、そこからアクセスします。
わかりました..あなたの質問を正しく理解できれば、同じ場所にあるプログラムファイルを介してクラスパスのリソースを変更したいと考えています。以下の制限を理解していれば、問題にはならないと思います。
Classloader は、(jar 内にある) リソースのハンドルを、ディレクトリ パスとすべてを含むファイルとして提供することはありません。これは、通常、Jar が分解されないためです。リソースをファイルとして取得するには、jar を展開形式にする必要があります。
プログラムを実行しているとき、現在の作業ディレクトリがクラスパス内のリソース/jar の場所ではない場合があります。
リソースのディレクトリを把握する必要があります。そうすれば、簡単に変更したり、必要なことを実行したりできます。
これを行う 1 つの方法は、構成可能なファイルのどこかにリソース パスを宣言することです。これは非常に単純なアプローチです。
もう1つの方法は、ロジックを使用してパスを把握することです。そのような例の1つは、このリンクから取られています
try { //Attempt to get the path of the actual JAR file, because the working directory is frequently not where the file is. //Example: file:/D:/all/Java/TitanWaterworks/TitanWaterworks-en.jar!/TitanWaterworks.class //Another example: /D:/all/Java/TitanWaterworks/TitanWaterworks.class PROGRAM_DIRECTORY = getClass().getClassLoader().getResource("TitanWaterworks.class").getPath(); // Gets the path of the class or jar. //Find the last ! and cut it off at that location. If this isn't being run from a jar, there is no !, so it'll cause an exception, which is fine. try { PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf('!')); } catch (Exception e) { } //Find the last / and cut it off at that location. PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf('/') + 1); //If it starts with /, cut it off. if (PROGRAM_DIRECTORY.startsWith("/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(1, PROGRAM_DIRECTORY.length()); //If it starts with file:/, cut that off, too. if (PROGRAM_DIRECTORY.startsWith("file:/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(6, PROGRAM_DIRECTORY.length()); } catch (Exception e) { PROGRAM_DIRECTORY = ""; //Current working directory instead. }