我有一个名为 Person 的班级。每个 Person 都有一个头像存储为 javafx.scene.image.Image 字段。我正在尝试将这些图像从 Persons 集合写入xml文件。
这是我写图像的方式:
Image image = p.getImage();
BufferedImage img = SwingFXUtils.fromFXImage(image, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
// baos.flush();
String encodedImage = Base64.getEncoder().encodeToString(baos.toByteArray());
baos.close();
xmlEventWriter.add(xmlEventFactory.createCharacters(encodedImage));
这就是我试图阅读它的方式:
byte[] bytes = Base64.getDecoder().decode(event.asCharacters().getData());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
BufferedImage image = ImageIO.read(byteArrayInputStream);
personImage = SwingFXUtils.toFXImage(image, null);
从xml文件中读取编码图像时出现问题。我没有收到整套人物。 event.asCharacters().getData()
的值只是xml文件中可以找到的内容的一部分。
这就是我收到javax.imageio.IIOException: Error reading PNG image data
@ (PersonXMLTool.java:77)
BufferedImage image = ImageIO.read(byteArrayInputStream);
和Caused by: java.io.EOFException: Unexpected end of ZLIB input stream
的原因。
起初我使用的是apache commons Base64,但它没有任何区别。在我的测试项目上,我做的是同样的,并且它有效。不同之处在于我没有将编码图像写入任何xml文件,而是使用它为我生成的String。
任何帮助表示赞赏。
答案 0 :(得分:1)
看起来您假设字符数据全部在一个XMLEvent
中传输。情况并非如此(除非图像很小):通常您会在多个事件中收到角色数据。
因此您需要使用以下内容解析xml文件:
XMLInputFactory inputFactory = XMLInputFactory.newFactory() ;
XMLEventReader eventReader = inputFactory.createXMLEventReader(Files.newBufferedReader(xmlFile.toPath()));
StringBuilder encodedImageBuffer = new StringBuilder();
boolean readingImage = false ;
while (eventReader.hasNext() && encodedImage == null) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement el = event.asStartElement();
if ("image".equals(el.getName().getLocalPart())) {
readingImage = true ;
}
}
if (event.isCharacters() && readingImage) {
Characters characters = event.asCharacters();
encodedImageBuffer.append(characters.getData());
}
if (event.isEndElement()) {
EndElement el = event.asEndElement();
if ("image".equals(el.getName().getLocalPart())) {
String encodedImage = encodedImageBuffer.toString();
byte[] imageData = Base64.getDecoder().decode(encodedImage);
ByteArrayInputStream dataInputStream = new ByteArrayInputStream(imageData);
BufferedImage buffImage = ImageIO.read(dataInputStream);
Image image = SwingFXUtils.toFXImage(buffImage, null);
}
}
}