飞碟 - >重复发生流关闭错误

时间:2014-06-26 16:34:26

标签: image stream ioexception recurrence flying-saucer

我使用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)

我接受任何建议。 非常感谢

2 个答案:

答案 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"/>