Мне нужно обработать xml против xslt с результирующим документом, который создает много xml. Как предлагается здесь: Поймать выходной поток документа-результата xsl
Я написал свой личный преобразователь 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 плохо обрабатывается. Попытка решить проблему натолкнула меня на некоторые мысли:
Сначала я пришел к этой идее:
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 закрывается каждый раз, когда открывается другой. Но:
1) мне не очень нравится это решение
2) что делать, если эта функция вызывается в многопоточном процессе? (Я не очень хорошо разбираюсь в саксонском разборе, поэтому я действительно не знаю..)
3) Есть ли возможность создать и обработать один FileOutputStream для каждого разрешения?