Smooks:返回一个OutputStream



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

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 = "IFLIRRu001F15u001F2u001F1A";
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("======================================nn");
System.out.print("Finished");
System.out.println("======================================nn");
}
}
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

我建议您升级到最新版本的Smooks (v2.0.0-RC1),因为EDI墨盒已经被彻底检修了。应用程序内存不足,因为您正在写入java.io.ByteArrayOutputStream,它将写入的字节保留在内存中。我不明白你想要达到什么目的。您提到的创建对象、写入文件和保存到数据库等操作都可以在smoks中完成。

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

相关内容

最新更新