Function Saxon解析器的自定义URI解析器中的句柄流

Function Saxon解析器的自定义URI解析器中的句柄流,function,xslt,external,saxon,Function,Xslt,External,Saxon,我必须根据xslt处理xml,结果文档创建了许多xml。 正如这里所建议的: 我编写了我的个人URI解析器: public class CustomOutputURIResolver implements OutputURIResolver{ private File directoryOut; public CustomOutputURIResolver(File directoryOut) { super(); this.director

我必须根据xslt处理xml,结果文档创建了许多xml。 正如这里所建议的:

我编写了我的个人URI解析器:

public class CustomOutputURIResolver implements OutputURIResolver{

    private File directoryOut;

    public CustomOutputURIResolver(File directoryOut) {
        super();
        this.directoryOut = directoryOut;
    }

    public void close(Result arg0) throws TransformerException {

    }

    public Result resolve(String href, String base) throws TransformerException {
       FileOutputStream fout = null;
       try {
            File f = new File(directoryOut.getAbsolutePath() + File.separator + href + File.separator + href + ".xml");
            f.getParentFile().mkdirs();
            fout = new FileOutputStream(f);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return new StreamResult(fout);
    }

}
获取输出目录,然后将文件保存在此处

但是当我在junit中测试它时,我在清理阶段遇到了一些问题,当我试图删除创建的文件时,我注意到FileOutputStream fout没有得到很好的处理。 试图解决这个问题给了我一些想法:

首先我提出了这个想法:

public class CustomOutputURIResolver implements OutputURIResolver{

    private File directoryOut;
    private FileOutputStream fout

    public CustomOutputURIResolver(File directoryOut) {
        super();
        this.directoryOut = directoryOut;
        this.fout = null;
    }

    public void close(Result arg0) throws TransformerException {
        try {
            if (null != fout) {
                fout.flush();
                fout.close();
                fout = null;
            }
        } catch (Exception e) {}
    }

    public Result resolve(String href, String base) throws TransformerException {

        try {
            if (null != fout) {
                fout.flush();
                fout.close();
            }
        } catch (Exception e) {}

        fout = null;
        try {
            File f = new File(directoryOut.getAbsolutePath() + File.separator + href + File.separator + href + ".xml");
        f.getParentFile().mkdirs();
            fout = new FileOutputStream(f);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return new StreamResult(fout);
    }

}
因此,只要打开另一个fileOutputStream,就会关闭fileOutputStream。 但是:

1) 我不太喜欢这个解决方案

2) 如果在多线程进程中调用此函数会怎么样?(我对Saxon解析不是很熟练,所以我真的不知道……)

3) 是否有机会为每个解析创建和处理一个FileOutputStream?

close()使用Result参数的原因是为了确定要关闭的流。为什么不:

public void close(Result arg0) throws TransformerException {
    try {
        if (arg0 instanceof StreamResult) {
            OutputStream os = ((StreamResult)arg0).getOutputStream();
            os.flush();
            os.close();
        }
    } catch (Exception e) {}
}

从Saxon EE 9.5开始,xsl:result文档在新线程中执行,因此OutputURIResolver应该是线程安全的,这一点非常重要。由于这一变化,从9.5开始,OutputURIResolver必须实现一个额外的方法getInstance(),这使得管理状态更加容易:如果newInstance()方法实际创建了一个新实例,那么每个正在处理的结果文档都将有一个OutputURIResolver实例,它可以保存输出流,并在请求时关闭它。

没错。。出于某种原因,我认为close函数只在整个过程结束时才被调用,我没有注意它的参数。。现在我已经整理好了代码,效果很好,谢谢!