ホームページ  >  に質問  >  本文

java - maven打包导致二进制文件大小被改变

使用class.getClassLoader().getResourceAsStream()这种方法获取classpath下的文件流,读取出来的文件比写main方法读出来的文件大小更大。

问题已经解决。

本地main方法测试

使用tomcat做为容器运行同样代码时

相关代码:

 synchronized (PhoneNumberGeo.class) {
        if (dataByteArray == null) {
          ByteArrayOutputStream byteData = new ByteArrayOutputStream();
          byte[] buffer = new byte[1024];

          int readBytesLength;
          try {
            InputStream inputStream = PhoneNumberGeo.class.getClassLoader()
                    .getResourceAsStream("phone.dat");
              while ((readBytesLength = inputStream.read(buffer)) != -1) {
              byteData.write(buffer, 0, readBytesLength);
            }
            inputStream.close();
          } catch (Exception e) {
            System.err.println("Can't find phone.dat in classpath phone.dat");
            e.printStackTrace();
            throw new RuntimeException(e);
          }

          dataByteArray = byteData.toByteArray();
        }
      }
    }

    byteBuffer = ByteBuffer.wrap(dataByteArray);
    byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
    int dataVersion = byteBuffer.getInt();
    indexAreaOffset = byteBuffer.getInt();

完整代码:
开源代码github

伊谢尔伦伊谢尔伦2744日前940

全員に返信(1)返信します

  • 黄舟

    黄舟2017-04-18 10:49:12

    問題は解決しました〜!
    概要: この問題は、バイナリ ファイルをクラスパスに配置し、maven-resources-plugin プラグインを使用してリソース ファイルをコピーすることが原因で発生します。

    詳細には、maven-resources-plugin プラグインのオプションがあるはずです

    リーリー

    これがオンになっている場合、クラスパス内にコピーされるファイルはデフォルトで置き換えられ、プロパティにマッピングされます
    その後、jdbc.properties などの XML 設定で使用できるようになります。ただし、この操作は、png、gif、pdf などのバイナリ ファイルには適していません。
    これらのファイル形式を除外する必要があります。

    リーリー

    思考プロセス:
    プロジェクトが参照しているjarパッケージのせいだと思い、かなり寄り道をし始めましたが、長時間探しても原因が見つかりませんでした。最終的に、各ファイルの md5 を確認し、ターゲット ディレクトリ内のファイルとリソース ディレクトリ内のファイルが不一致であることを確認し、最終的に問題を発見しました。

    参考:
    Mavenバイナリフィルタリング
    クラスパス下のファイルを取得するその他のメソッド

    返事
    0
  • キャンセル返事