问题来源
项目中有个新需求,需要将某个方法从控制台输出的信息抓取后保存起来保存到数据库表中或者一个文件中。问题是这个类是第三方包,我们没办法去修改这个类,因此只能从别的方法入手来解决这个问题。
这里分别写了两个示例,一个用来将控制台信息保存到数据库表中;另外一个则保存到指定的文件中;下面直接上代码:
1.保存到数据库表中
保存到数据库表中的步骤就不写了,这里只把抓取控制台信息的核心方法展现出来。
1.1 代码
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
public class ConsoleOutputCaptureDemo {
public static void main(String[] args) {
ConsoleOutput();
}
/**
* 获取控制台输出信息,保存至数据库或在需要的地方再输出
*/
public static void ConsoleOutput() {
// 保存原来的标准输出流和错误输出流
PrintStream originalOut = System.out;
PrintStream originalErr = System.err;
// 创建一个字节数组输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 创建一个打印流,将输出流传递给它
PrintStream printStream = new PrintStream(baos);
将标准输出重定向到自定义的PrintStream对象,从这里开始所有的标准输出流和错误输出流信息都不会在控制台输出
System.setOut(printStream);
System.setErr(printStream);
System.out.println("处理文件1...");
System.out.println("处理文件2...");
System.out.println("处理文件3...");
System.err.println("错误文件4...");
System.err.println("错误文件5...");
// 恢复原始的标准输出流和错误流
System.setOut(originalOut);
System.setErr(originalErr);
// 关闭打印流
printStream.close();
// 在控制台输出一些其他信息,用来验证打印顺序是否改变了?
System.out.println("先输出这里哦...\r\n\r\n");
// 获取捕获的控制台输出
String output = baos.toString();
System.out.println(output);
try {
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.2 效果
2.保存到指定文件中
2.1 代码
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
public class ConsoleOutputCaptureDemo {
public static void main(String[] args) {
ConsoleOutputToFile();
}
/**
* 获取控制台输出信息,保存至指定文件中,最后再次从控制台输出
*/
public static void ConsoleOutputToFile() {
// 保存原来的标准输出流和错误输出流
PrintStream originalOut = System.out;
PrintStream originalErr = System.err;
// 创建一个文件输出流,用于将信息写入文件中
FileOutputStream fos = null;
// 创建一个打印流,并将其设置为自动刷新模式
PrintStream ps = null;
try {
fos = new FileOutputStream("f:/output.txt");
ps = new PrintStream(fos, true);
// 将标准输出流和标准错误流重定向到打印流中
System.setOut(ps);
System.setErr(ps);
// 在控制台输出信息
System.out.println("正确信息1...");
System.out.println("正确信息2...");
System.out.println("正确信息3...");
System.err.println("错误信息1");
System.err.println("错误信息2");
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
// 恢复原始的标准输出流和错误流
System.setOut(originalOut);
System.setErr(originalErr);
// 关闭打印流和文件输出流
try {
if (null != ps) {
ps.close();
}
if (null != fos) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("先输出这里了...\r\n\r\n");
// 将文件的内容输出到控制台
try (BufferedReader br = new BufferedReader(new FileReader("f:/output.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}