Java 编组后,XML未完全假脱机到文件中

Java 编组后,XML未完全假脱机到文件中,java,replace,jaxb,marshalling,Java,Replace,Jaxb,Marshalling,我试着整理一个对象,然后替换一些有效的字符。在此过程中,不会生成完整的xml。我只能在所有生成的文件中看到1024个字符 package com.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.StringReader; import java.util.Scanner; import javax.xml.XMLConstants; im

我试着整理一个对象,然后替换一些有效的字符。在此过程中,不会生成完整的xml。我只能在所有生成的文件中看到1024个字符

package com.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.Scanner;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamResult;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.apache.log4j.Logger;
import org.xml.sax.SAXException;
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

public class MessageParserComponent {
    private static final Logger LOGGER = Logger.getLogger(MessageParserComponent.class);

           public File marshalIXml(final Object obj, final String xsdSchema,
        final String xmlFileName, final JAXBContext ctx) {
        File xml = new File(xmlFileName);

        try {
            xml.createNewFile();
            Marshaller marshaller = null;
            marshaller = ctx.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
                "http://www.db.com/tf " + xsdSchema);
            marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
                new NamespacePrefixMapper() {
                    @Override
                    public String getPreferredPrefix(String arg0, String arg1,
                        boolean arg2) {
                        return "tf";
                    }
                });

            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
                "http://www.db.com/tf " + xsdSchema);
            marshaller.setSchema(getSchema(xsdSchema));
            marshaller.marshal(obj, new StreamResult(xml));
            xml = replaceInvalidChar('\u0007', '\n', xml);
            xml = replaceInvalidString("ns2", "xsi", xml);
        } catch (IOException e) {
            LOGGER.error(e);
        } catch (JAXBException e) {
            LOGGER.error(e);
        } catch (SAXException e) {
            LOGGER.error(e);
        }
        return xml;
    }

  private Schema getSchema(String xsdSchema) throws SAXException {
        SchemaFactory fact = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = fact.newSchema(this.getClass().getClassLoader()
                                           .getResource(xsdSchema));
        return schema;
    }

   private static File replaceInvalidString(String Target, String Dest,
        File Source) throws IOException {
        String xml_string;
        xml_string = new Scanner(Source).useDelimiter("\\Z").next();
        xml_string = xml_string.replace(Target, Dest);
        FileOutputStream fi = new FileOutputStream(Source);
        fi.write(xml_string.getBytes());
        return Source;
    }

    public static File replaceInvalidChar(char Target, char Dest, File Source)
        throws IOException {
        String xml_string;
        xml_string = new Scanner(Source).useDelimiter("\\Z").next();
        xml_string = xml_string.replace(Target, Dest);
        FileOutputStream fi = new FileOutputStream(Source);
        fi.write(xml_string.getBytes());
        return Source;
    }
}
字符串替换是否有限制? 我是否以错误的方式创建文件

注:

我正在UNIX日志文件夹中存储文件 我有Java6,JAXB2.2


非常感谢您提供的任何帮助。

只需检查您是否正确地使用jaxb注释对对象进行了注释。 为什么要设置Marshaller属性?是否要使用外部架构来整理对象?相反,如果您的对象在同一个工作区中可用,为什么不让jaxb处理所有这些事情呢

此示例程序可能对您有所帮助。

再看看这个

截断的标记值

打开要关闭的FileOutputStream时。您应该更改代码以包含关闭调用


问题在于扫描仪,它试图找到EOF,而不是假脱机整个文件。这在当地的开发环境中是不会发生的。其中,与部署我的应用程序的UNIX服务器一样,输入端不同,这导致了此问题

File f1 = new File(path);
     StringBuilder f2 = new StringBuilder();
        Scanner scanner = new Scanner(f1).useDelimiter("\\Z");

        while (scanner.hasNext()) {
           f2.append(scanner.next());
这就完成了把戏。 我不知道与其他涂黄油的阅读器相比,扫描仪的性能部分只占用1024个字符


任何其他提高性能的解决方案都受到高度赞赏。

可能是新的ScannerSource.useDelimiter\\Z.next只返回1024字节的数据。对ByteArrayInputStream进行封送处理,然后从中创建字符串并调用replace方法进行替换。然后将字符串保存到文件中。谢谢@Stanislav Mamontov,但我觉得它会扫描输入文件并复制到字符串中。不管怎样,我都会检查一下,然后再联系你。在其他博客中也看到类似的问题,说因为使用“/z”作为分隔符的单次读取应该读取所有内容,直到“输入结束”,所以很有可能只进行单次读取,然后将其保留,正如上面列出的示例所做的那样。在大多数情况下,这没关系,但我发现至少有一种情况是,读取“输入结束”不会读取整个输入–当输入是SequenceInputStream时,每个组成的InputStreams似乎都有自己单独的“输入结束”。我们需要为其他接口期望的每个元素提供自定义前缀,使其设置封送拆收器属性。说到我们的问题,这并不是因为马歇尔勒,正如@Stanislav Mamontov所说,在不同的环境中,扫描器将以不同的方式运行,导致完全生成的xml被截断为1024个字符。感谢帖子的提醒,我自己早就得到了它,并且已经关闭了流。@PavanSky-应该是这样的。
File f1 = new File(path);
     StringBuilder f2 = new StringBuilder();
        Scanner scanner = new Scanner(f1).useDelimiter("\\Z");

        while (scanner.hasNext()) {
           f2.append(scanner.next());