我使用飞碟生成网站的截图(任何网站,所以我没有任何控制它)。因此,对于其中的一些,由于它们的结构,错误发生了。问题是,对于其中一些,我有这个"流关闭"错误,反复发生。由于问题在飞碟程序内部,我无法访问它(但我可以看到错误),也无法停止它。我试图将有问题的操作放在线程中,在发生错误时可以关闭,但是我的代码无法检测到错误。下面是我的代码:
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)
我接受任何建议。谢谢大家
您描述的错误在前几天也给我带来了很多麻烦。解决这个问题的方法是指定正确的css样式表地址,以便xhtmlrenderer可以访问您的css文件。
例如,如果你有一些样式表或图像作为/styles/samplestyle.css
在你的html文件中,你必须将其转换为filepath/styles/samplestyles.css
和同样适用于图像。我相信这会解决你的问题。
目录路径应该在C:/filepath/
或保存样式表的任何其他磁盘中。
我遇到了同样的问题,并通过在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"/>