首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smooks :返回OutputStream

Smooks :返回OutputStream
EN

Stack Overflow用户
提问于 2022-05-16 08:57:26
回答 1查看 62关注 0票数 0

我目前正在编写一个JAVA应用程序,它将输入一个EDI文件,并为此使用Smooks库返回一个OutputStream。我正在努力返回输出流,并使用它而不扼杀内存。输出流的目标是允许用户将其转换为InputStream,并将流操作为对象创建、文件、推送到db等。如果有人能给我一个机会,让我了解我做错了什么,我会非常感激的。提前谢谢..。

代码语言:javascript
复制
public class EdiToXml {

  private static final int headerBufferSize = 100;
  private static final byte[] buf = new byte[headerBufferSize];
  private static Smooks smooks;
  private static final String headerVersion1 = "IFLIRR\u001F15\u001F2\u001F1A";
  private static StreamSource stream;


 protected static ByteArrayOutputStream TransformBifToJava(FileInputStream inputStream) throws IOException, SAXException, SmooksException {

    Locale defaultLocale = Locale.getDefault();
    Locale.setDefault(new Locale("en", "EN"));

    //Creating a bufferedInputStream
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

    //Marking the bufferedInputStream
    bufferedInputStream.mark(0);

    //Obtaining the first 100 bytes to detect the file version
    bufferedInputStream.read(buf);

    //Reading first 100 bytes
    String value = new String(buf);

    if(value.indexOf(headerVersion1) > 0) {
      // Instantiate Smooks with the config for 15.2.1A
      smooks = new Smooks("smooks-config.xml");
    }

    bufferedInputStream.reset();

    stream = new StreamSource(bufferedInputStream);

    try {
      return Parse1(defaultLocale, smooks, stream);
    }finally {
      bufferedInputStream.close();
      inputStream.close();
    }

 }

 protected static ByteArrayOutputStream Parse1(Locale locale, Smooks smooks, StreamSource streamSource) throws IOException, SAXException, SmooksException {
    try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    
        // Create an exec context - no profiles....
        ExecutionContext executionContext = smooks.createExecutionContext();
    
        // Filter the input message
        smooks.filterSource(executionContext, streamSource, new StreamResult(byteArrayOutputStream));
    
        Locale.setDefault(locale);

        System.out.println(byteArrayOutputStream.size());
    
        return byteArrayOutputStream;
    } finally {
        smooks.close();
    }
 }

 public static void main(String[] args) throws IOException, SAXException, SmooksException {

    ByteArrayOutputStream byteArrayOutputStream = EdiToXml.TransformBifToJava(new FileInputStream("xxxx/BifInputFile.DATA"));

    InputStream is = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
    byteArrayOutputStream.close();

    int b = is.read();

    while (b != -1) {
        System.out.printf("%c", b);
        b = is.read();
    }

    is.close();

    System.out.println("======================================\n\n");
    System.out.print("Finished");
    System.out.println("======================================\n\n");

 }

}

Exception in thread "main" org.milyn.SmooksException: Smooks Filtering operation failed.
    at org.milyn.Smooks._filter(Smooks.java:548)
    at org.milyn.Smooks.filterSource(Smooks.java:482)
    at com.maureva.xfunctional.EdiToXml.Parse1(EdiToXml.java:102)
    at com.maureva.xfunctional.EdiToXml.TransformBifToJava(EdiToXml.java:86)
    at com.maureva.xfunctional.EdiToXml.main(EdiToXml.java:173)
Caused by: java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3236)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
    at org.milyn.delivery.sax.SAXHandler.flushCurrentWriter(SAXHandler.java:503)
    at org.milyn.delivery.sax.SAXHandler.endElement(SAXHandler.java:234)
    at org.milyn.delivery.SmooksContentHandler.endElement(SmooksContentHandler.java:96)
    at org.milyn.edisax.EDIParser.endElement(EDIParser.java:897)
    at org.milyn.edisax.EDIParser.endElement(EDIParser.java:883)
    at org.milyn.edisax.EDIParser.mapComponent(EDIParser.java:693)
    at org.milyn.edisax.EDIParser.mapField(EDIParser.java:636)
    at org.milyn.edisax.EDIParser.mapFields(EDIParser.java:603)
    at org.milyn.edisax.EDIParser.mapSegment(EDIParser.java:564)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:535)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:453)
    at org.milyn.edisax.EDIParser.mapSegment(EDIParser.java:566)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:535)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:453)
    at org.milyn.edisax.EDIParser.mapSegment(EDIParser.java:566)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:535)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:453)
    at org.milyn.edisax.EDIParser.mapSegment(EDIParser.java:566)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:535)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:453)
    at org.milyn.edisax.EDIParser.mapSegment(EDIParser.java:566)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:535)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:453)

Process finished with exit code 1
EN

回答 1

Stack Overflow用户

发布于 2022-05-16 22:02:25

我建议您升级到斯莫克斯的最新版本(v2.0.0-RC1),因为EDI墨盒已经被彻底检修过。这个应用程序内存不足,因为您正在写入一个java.io.ByteArrayOutputStream,它将所写的字节保存在内存中。我不明白你想做什么。您提到的一些事情,比如创建对象、写入文件和保存到数据库,都可以在Smooks内部完成。

如果您只想使用Smooks将EDI转换为XML,那么您应该将结果写入一个输出流,该输出流不像FileOutputStream那样将数据保存在内存中,或者实现您自己的OutputStream,如果您想对结果做一些奇怪的事情的话。话虽如此,但仅将Smooks用于将输入转换为XML并没有太大的意义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72256554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档