当前位置: 首页 > 知识库问答 >
问题:

当 fop 数据较大时,Java 应用程序无法正常运行外部 jar (FOP)

樊浩初
2023-03-14

我在从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:\用户\Phoros\文档\test29x.pdf]

谢谢你的帮助。

共有1个答案

臧弘和
2023-03-14

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

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

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

更多备注:

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

我认为这也不会可靠地起作用。可用不一定包含所有数据,只需指示在阻止获取更多数据之前有多少数据。

有必要将整个事情读入内存吗?

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

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

 类似资料:
  • 问题内容: 根据我的阅读,执行以下命令时: 然后,将忽略主类路径,并从清单文件中获取类路径。 此外,在命令行上声明的类路径也将被忽略。所以在: /usr/local/jar/foobar.jar被忽略。 最后,我读过清单文件在jar文件中只能包含相对路径。 因此,如何包含系统上存在的外部jar的绝对路径,而不是正在执行的jar文件中的绝对路径? 问题答案: 您是否有理由避免像这样调用主类 ? 这种

  • 当我用IntelliJ Idea运行它时-它完全正常工作。当我从output运行app.jar文件时--所有的东西都运行得很好,但有一个特性是由supportlib.jar支持的。使用时,我得到。输出的结构为: 类路径为:

  • 注意:test.class文件也使用了example.jar文件中的类文件,有自己的包结构。 我知道我可以将它们放在一个jar文件中,不幸的是我需要将test.class文件分开。

  • 问题内容: 我有一个用netbeans在java下开发的程序。它具有一个文本窗格,该窗格接受以非英语编写的文本,并执行一些操作,包括保存打开的新..... 当我从netbeans运行该程序时,它很好,并且可以完美地工作。但是,当我转到dist文件夹并运行jar(应该是可执行文件)时,它运行良好,但是当我将先前保存的文件打开到编辑器中时,它显示了神秘的字体。 喜欢- লিখ“原始输入是” <<নতু

  • 问题: 运行JavaFX应用程序jar失败,尽管主类成功运行,显示一个GUI窗口。 IntelliJ创意社区版2021.2.1 Liberica Full JDK 11.0.12+7x86 64位for Windows(已包含JavaFX) Windows 10 Home 64bit 项目结构(IDE生成,未修改): 源代码: null null null null null 异常堆栈跟踪(运行应

  • 问题内容: 我已经用Java编写了一个应用程序,并且想添加一个功能来报告该应用程序的正常运行时间。JVM中是否有可以执行此操作的类/方法? 我应该在应用程序启动时保存时间戳,然后在请求时计算与当前正常运行时间的差额吗? 用Java检索应用程序正常运行时间的更好方法是什么? 问题答案: 您可以使用RuntimeMXBean.getUptime()