我使用Flying Saucer生成网站的截图(任何网站,所以我不能控制它)。 因此,对于其中一些,由于它们的构造,出现错误。 问题是,对于其中一些人来说,我有这个" Stream Closed"错误,反复发生。由于问题在飞碟程序中,我无法访问它(但我可以看到错误),我无法阻止它。 我试图将有问题的操作放在一个线程中,我可以在出现错误时将其关闭,但我的代码无法检测到错误。 这是我的代码:
Tidy tidy=new Tidy();
tidy.setXHTML(true);
tidy.setForceOutput(true);
tidy.setShowWarnings(false);
tidy.setQuiet(true);
String[] dirPaths=new String[]
{
PropertiesManager.getProperty(DYNAMIC_IMAGES_ROOT),
PropertiesManager.getProperty(DYNAMIC_IMAGES_TEMPLATE),
PropertiesManager.getProperty(DYNAMIC_IMAGES_TEMP)
};
String path=PathConstructor.getPath(dirPaths);
File temporaryXhtmlFile=new File(path,GenericFunctions.getUrlRoot(url)+".html");
if(!temporaryXhtmlFile.getParentFile().exists())
temporaryXhtmlFile.getParentFile().mkdirs();
temporaryXhtmlFile.createNewFile();
FileOutputStream fous=new FileOutputStream(temporaryXhtmlFile);
InputStream inputStream=new URL(url).openStream();
tidy.parse(inputStream, fous);
fous.close();
String finalUrl=temporaryXhtmlFile.toURI().toURL().toString();
final Java2DRenderer renderer = new Java2DRenderer(finalUrl,width,height);
renderer.setBufferedImageType(BufferedImage.TYPE_INT_ARGB);
final CountDownLatch cdl=new CountDownLatch(1);
final BufferedImage[] bufferedImageArray=new BufferedImage[1];
Thread getImageThread=new Thread()
{
@Override
public void run() {
bufferedImageArray[0]=renderer.getImage();
cdl.countDown();
}
};
getImageThread.start();
try {
cdl.await();
} catch (InterruptedException e) {
getImageThread.interrupt();
}
File finalFile=new File(path,fileName);
saveImage(finalFile, bufferedImageArray[0]);
temporaryXhtmlFile.delete();
和我的错误(每30秒重复一次)
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getInIfOpen(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at org.xhtmlrenderer.css.parser.Lexer.zzRefill(Lexer.java:1634)
at org.xhtmlrenderer.css.parser.Lexer.yylex(Lexer.java:1865)
at org.xhtmlrenderer.css.parser.CSSParser.next(CSSParser.java:1798)
at org.xhtmlrenderer.css.parser.CSSParser.la(CSSParser.java:1810)
at org.xhtmlrenderer.css.parser.CSSParser.stylesheet(CSSParser.java:159)
at org.xhtmlrenderer.css.parser.CSSParser.parseStylesheet(CSSParser.java:89)
at org.xhtmlrenderer.context.StylesheetFactoryImpl.parse(StylesheetFactoryImpl.java:78)
at org.xhtmlrenderer.context.StylesheetFactoryImpl.parse(StylesheetFactoryImpl.java:95)
at org.xhtmlrenderer.context.StylesheetFactoryImpl.getStylesheet(StylesheetFactoryImpl.java:174)
at org.xhtmlrenderer.context.StyleReference.readAndParseAll(StyleReference.java:123)
at org.xhtmlrenderer.context.StyleReference.setDocumentContext(StyleReference.java:107)
at org.xhtmlrenderer.swing.Java2DRenderer.setDocument(Java2DRenderer.java:317)
at org.xhtmlrenderer.swing.Java2DRenderer.getImage(Java2DRenderer.java:265)
我接受任何建议。 非常感谢
答案 0 :(得分:1)
你所描述的错误在某些日子也给我带来了很多麻烦。您的问题的解决方案是指定正确的css样式表地址,以便xhtmlrenderer可以访问您的css文件。
例如,如果你有一些样式表或图像
您的html文件中的/styles/samplestyle.css
,您必须将其转换为filepath/styles/samplestyles.css
并且同样适用于图像。我相信这会解决你的问题。
目录路径应位于C:/filepath/
或保存样式表的任何其他磁盘中。
答案 1 :(得分:0)
我遇到了同样的问题,并在freemarker模板中包含css文件时通过添加file
前缀来修复它。所以这不起作用:
<link rel="stylesheet" type="text/css" href="/opt/3six5/template/style.css"/>
这有效:
<link rel="stylesheet" type="text/css" href="file:///opt/3six5/template/style.css"/>