使用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
黄舟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下文件的其他方法