搜索

首页  >  问答  >  正文

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

伊谢尔伦伊谢尔伦2801 天前985

全部回复(1)我来回复

  • 黄舟

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

    问题已经解决~!
    总结由于将一个二进制的文件放在classpath下并且使用了maven-resources-plugin这个插件来拷贝资源文件导致。

    详细来说是应为maven-resources-plugin这个插件有一个选项

      <filtering>true</filtering>

    如果开启那么只要是classpath下要被拷贝的文件默认都会进行替换也就是说将会映射成properties
    之后就可以在xml的配置中使用,比如那个jdbc.properties。但是这一个操作对于二进制文件,例如png,gif,pdf等就不合适了。
    我们需要将这些文件格式都排除掉。

    <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.4.3</version>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <nonFilteredFileExtensions>
                            <nonFilteredFileExtension>dat</nonFilteredFileExtension>
                            <nonFilteredFileExtension>swf</nonFilteredFileExtension>
                        </nonFilteredFileExtensions>
                    </configuration>
                </plugin>

    思考过程:
    开始走了不少弯路,我以为是因为项目的引用jar包问题,结果查询了很久还是找不到原因。最后我把各个文件的md5求出来才发现在target目录下的文件和resources目录下的不一致,最终发现问题所在。

    参考:
    Maven Binary filtering
    获取classpath下文件的其他方法

    回复
    0
  • 取消回复