【问题标题】:Java application can't run external jar (FOP) properly, when fop data are larger当 fop 数据较大时,Java 应用程序无法正确运行外部 jar (FOP)
【发布时间】:2014-12-03 11:15:10
【问题描述】:

我在从 Java 程序运行 FOP 时遇到问题。 我使用 Java 1.8_25。

运行命令:

String[] cmd4 = {"java", "-jar", rootDir+"build"+ FileSeparator +"fop.jar", "-c", rootDir+"lib" + FileSeparator + "conf" + FileSeparator + "myfop.xconf", pathToFOP.getCanonicalPath(), outputFile.getCanonicalPath()};
System.out.println(Arrays.toString(cmd4));
Process p = Runtime.getRuntime().exec(cmd4);
p.waitFor();
java.io.InputStream is=p.getInputStream();
byte b[]=new byte[is.available()];
is.read(b,0,b.length);
System.out.println(new String(b));

当我在程序中生成相对较短的输出时,FOP 正常进行并生成 .pdf 文件。

当我生成更大的输出(但仍在一个 A4 页面上)时,FOP 进程执行,创建空的 .pdf 文件并等待。当我终止主程序时,FOP 会正确保存 .pdf。但我想在主程序运行时转换 .pdf 文件(之后也会打开生成的 .pdf 文件)

不显示错误

程序输出:

[java, -jar, C:\JForm\build\fop.jar, -c, C:\JForm\lib\conf\myfop.xconf, C:\Users\Phoros\Documents\test29x.pdf.fop , C:\Users\Phoros\Documents\test29x.pdf]

感谢您的帮助。

【问题讨论】:

标签: java pdf apache-fop


【解决方案1】:

一旦输出不再适合单个缓冲区,在 Java 中从外部进程读取输出就不是那么容易了。然后,您必须创建一个单独的线程来读取该输出,否则该进程无法写入更多内容,只会阻塞并且永远不会完成(这就是您所看到的)。

您可以解决这个问题,但由于 FOP 是一个 Java 库,因此直接调用 Java API 应该更容易,无需外部进程。

另一个想法是包含一个临时文件,外部进程将其结果放置在其中。这样,进程的直接输出就不会很大。


更多评论:

java.io.InputStream is=p.getInputStream();
byte b[]=new byte[is.available()];
is.read(b,0,b.length);

我认为这也不会可靠地工作。 available 不一定会包含所有数据,只是表明在阻止获取更多数据之前有多少数据。

是否需要将整个内容读入内存?

System.out.println(new String(b));

为什么将字节转换为字符串只是为了再次打印它们?你不能直接打印字节吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    相关资源
    最近更新 更多