使用JavaFX从XML文件接收png

使用JavaFX从XML文件接收png,java,xml,javafx,Java,Xml,Javafx,我有一个名为Person的类。每个人都有一个存储为javafx.scene.image.image字段的化身图像。我正在尝试将这些图像从一组人员写入一个xml文件 这就是我写这张图片的方式: Image image = p.getImage(); BufferedImage img = SwingFXUtils.fromFXImage(image, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.w

我有一个名为Person的类。每个人都有一个存储为javafx.scene.image.image字段的化身图像。我正在尝试将这些图像从一组人员写入一个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图像数据
@(PersonXMLTool.java:77)
,它是
BufferedImage image=imageio.read(byteArrayInputStream)和由以下原因引起的
:java.io.EOFException:ZLIB输入流意外结束

起初我使用的是ApacheCommonsBase64,但它没有任何区别。在我的测试项目中,我也做了同样的事情,并且成功了。区别在于我没有将编码图像写入任何xml文件,而是使用它为我生成的字符串


谢谢你的帮助

看起来您假设字符数据都在一个
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);
                    }
                }
            }