-4

入力ストリームを取得するために ResorceLoder クラスを使用しましたが、outputStream を取得するにはどうすればよいですか。そのパッケージにあるデータを変更することは可能ですか?同じjarファイル)

4

3 に答える 3

3

実行時にjarファイルのリソースを直接変更することはできません。ClassLoader (これらの InputStreams を提供するものは、jar ファイル内のファイルを書き換えるための OutputStream を提供しません)。

実行時に画像やリソースをそのように操作したい場合は、それらを jar ファイルに入れずに、ファイル システムから取得してください。

于 2013-09-10T05:51:47.507 に答える
2

クラスパスリソースの変更は、クラスローダーとクラスパスに応じて、困難または不可能です。

  • クラスパス リソースがファイル システム ディレクトリにある場合は、それを置き換えることができるはずです。ただし、ファイルがロックされている可能性があり、JVM を再起動するまで更新されたリソースが表示される保証はありません。

  • クラスパス リソースがローカル ファイルシステムの JAR または ZIP にある場合、さらにいくつかの問題があります。

    1. JAR または ZIP ファイルのインプレース更新は実行できません。新しい ZIP / JAR を作成し、既存のコンテンツをそれにコピーする必要があります。

    2. クラスパス上の ZIP または JAR ファイルはロックされます。

  • クラスパス リソースがダウンロードされた ZIP または JAR にある場合、(一般に) ソースでファイルを更新することはできません...そのため、変更が「定着」しない可能性があります。

  • カスタムクラスローダーを使用している場合、すべての賭けはオフです...

要するに、これを行う別の方法を見つける方が良いです。たとえば、リソースをファイルシステムの書き込み可能なディレクトリにコピー/インストールし、そこからアクセスします。

于 2013-09-10T06:07:41.173 に答える
0

わかりました..あなたの質問を正しく理解できれば、同じ場所にあるプログラムファイルを介してクラスパスのリソースを変更したいと考えています。以下の制限を理解していれば、問題にはならないと思います。

  1. Classloader は、(jar 内にある) リソースのハンドルを、ディレクトリ パスとすべてを含むファイルとして提供することはありません。これは、通常、Jar が分解されないためです。リソースをファイルとして取得するには、jar を展開形式にする必要があります。

  2. プログラムを実行しているとき、現在の作業ディレクトリがクラスパス内のリソース/jar の場所ではない場合があります。

  3. リソースのディレクトリを把握する必要があります。そうすれば、簡単に変更したり、必要なことを実行したりできます。

  4. これを行う 1 つの方法は、構成可能なファイルのどこかにリソース パスを宣言することです。これは非常に単純なアプローチです。

  5. もう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.
     }
    
于 2013-09-10T06:09:15.723 に答える