使用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
問題は解決しました〜!
概要: この問題は、バイナリ ファイルをクラスパスに配置し、maven-resources-plugin プラグインを使用してリソース ファイルをコピーすることが原因で発生します。
詳細には、maven-resources-plugin プラグインのオプションがあるはずです
リーリーこれがオンになっている場合、クラスパス内にコピーされるファイルはデフォルトで置き換えられ、プロパティにマッピングされます
その後、jdbc.properties などの XML 設定で使用できるようになります。ただし、この操作は、png、gif、pdf などのバイナリ ファイルには適していません。
これらのファイル形式を除外する必要があります。
思考プロセス:
プロジェクトが参照しているjarパッケージのせいだと思い、かなり寄り道をし始めましたが、長時間探しても原因が見つかりませんでした。最終的に、各ファイルの md5 を確認し、ターゲット ディレクトリ内のファイルとリソース ディレクトリ内のファイルが不一致であることを確認し、最終的に問題を発見しました。
参考:
Mavenバイナリフィルタリング
クラスパス下のファイルを取得するその他のメソッド