使用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
Le problème a été résolu~ !
Résumé : cela est dû au placement d'un fichier binaire sur le chemin de classe et à l'utilisation du plug-in maven-resources-plugin pour copier le fichier de ressources.
Dans le détail, il devrait y avoir une option pour le plugin maven-resources-plugin
S'il est activé, tous les fichiers à copier dans le chemin de classe seront remplacés par défaut, ce qui signifie qu'ils seront mappés aux propriétés
et pourront ensuite être utilisés dans la configuration XML, comme le jdbc. propriétés. Mais cette opération ne convient pas aux fichiers binaires, tels que png, gif, pdf, etc.
Nous devons exclure ces formats de fichiers.
Processus de réflexion :
J'ai fait beaucoup de détours au début, je pensais que c'était à cause du problème avec le package jar référencé dans le projet, mais après une longue recherche, je n'ai toujours pas trouvé. la raison. Enfin, j'ai découvert le md5 de chaque fichier et constaté que les fichiers du répertoire cible n'étaient pas cohérents avec ceux du répertoire des ressources, et j'ai finalement trouvé le problème.
Référence :
Filtrage binaire Maven
Autres méthodes pour obtenir des fichiers sous classpath