我目前正在开发一个基于某些模板文件生成并验证.xml文件的应用程序。
我调用生成这些文件的方法如下:
FtlProcessingController ctrl = new FtlProcessingController();
ctrl.process(TEMPLATES, OUTPUT_DIRECTORY, root, metadata);
我不是 FtlProcessingController 类的作者,但进程方法基本上从 TEMPLATES 目录中获取模板文件,用 root 对象(Answer对象的树)和metadata
对象(附加数据的Map)中的内容填充它们,然后输出.xml文件到 OUTPUT _ DIRECTORY 。
简而言之,主要代码如下:
// Prepare files and data
FtlProcessingController ctrl = new FtlProcessingController();
ctrl.process(TEMPLATES, OUTPUT_DIRECTORY, root, metadata);
// Validate XML files
问题 进程调用不起作用后的任何控制台输出;控制台中没有显示任何内容。
我尝试使用一些测试输出来围绕调用并保存PrintStream
以进行重置:
System.out.println("Console");
PrintStream stdOut = System.out;
FtlProcessingController ctrl = new FtlProcessingController();
ctrl.process(TEMPLATES, OUTPUT_DIRECTORY, root, metadata);
// Test Exception was thrown here.
System.setOut(stdOut);
System.out.println("Console again");
但我只得到:
控制台
我确信此调用中没有无限循环或 System.exit(),因为文件已成功生成。我甚至试图在调用之后立即抛出 Exception 来确认,并且异常被正常抛出。
我的问题是:独立于进程方法对 System.out 执行或不执行的操作,不应该&#39 ; t System.setOut(stdOut)
电话后我能在控制台上再次打印吗?
什么可能会弄乱标准输出,以便保存的PrintStream不起作用?
谢谢!
完整的主要代码,对于好奇:
public static void main(String[] args) {
try {
// Parse answers
Answer root = AnswerUtils.fromJSON(JSON_FILE, Answer.class);
ModuleInfo manager = new SimpleModuleInfo(MODULE_MANAGER_ID, MODULE_MANAGER_CATEGORY, MODULE_MANAGER_NAME,
MODULE_MANAGER_VERSION, MODULE_MANAGER_VERSION);
ModuleInfo module = new SimpleModuleInfo(MODULE_ID, MODULE_CATEGORY, MODULE_NAME, MODULE_VERSION, INSTANCE);
List<ModuleInfo> info = new ArrayList<ModuleInfo>();
info.add(manager);
info.add(module);
if (DEPENDENCIES_FILES != null) {
// property file, with all dependencies as a comma-separated value under the 'dependencies' key
Properties props = new Properties();
InputStream in = null;
try {
in = new FileInputStream(DEPENDENCIES_FILES);
props.load(in);
} finally {
IOUtils.closeQuietly(in);
}
String[] values = StringUtils.split(props.getProperty("dependencies"), ',');
if (values != null) {
for (String value : values) {
ModuleDependency dep = new ModuleDependency(StringUtils.trim(value));
info.add(new SimpleModuleInfo(dep.getIdentifier(), "Category", WordUtils.capitalizeFully(
dep.getIdentifier(), new char[] { '-' }), dep.getVersion().toString(), dep
.isInstanceDependency() ? module.getInstance() : "Default"));
}
}
}
Map<String, Object> metadata = getMetadata(HOME, os, arch, module, info.toArray(new ModuleInfo[info.size()]));
System.out.println("Console");
PrintStream stdOut = System.out;
FtlProcessingController ctrl = new FtlProcessingController();
ctrl.process(TEMPLATES, OUTPUT_DIRECTORY, root, metadata);
System.setOut(stdOut);
System.out.println("Console again");
// Validate XML
Collection<File> xmlFiles = FileUtils.listFiles(OUTPUT_DIRECTORY, OUTPUT_FILES_EXTENSIONS, WITH_SUBDIRECTORIES);
for (File file : xmlFiles) {
System.out.println(file.getAbsolutePath());
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
factory.setFeature(FACTORY_DTD_FEATURE, false);
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new SPErrorHandler());
reader.parse(file.getAbsolutePath());
}
if(true)
throw new IOException();
} catch (SAXException se) {
se.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
}
}
答案 0 :(得分:1)
您调用的方法可能会重新分配System.out
流,这可以使用System.setOut(PrintStream)
方法完成。
如果是这种情况并且输出在Java控制台中不再可见,则输出可能会写入日志文件。然而,这种记录方法是一个非常糟糕的想法,不应该这样做,特别是在其他人可能最终使用的库中。
比这更糟糕的想法是实际关闭System.out
流。我无法想到任何可以证明这样做的场景。