java输出字符串到多个输出流 同时输出到console终端,网页,文本

本文介绍了一种简便的方法来同时记录错误信息到网页和文件中。通过使用内存输出流和自定义错误页面,可以有效地收集错误信息并进行双重记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上有不少大牛做了一些比较高级的,例如重写stream类,加入多个输出流。

但其实很多时候我们没必要用到这么复杂。

例如我的应用,我只是想把错误信息输出到网页的同时,简单加几句话,可以把网页上的信息也写一份到数据库或者文本。

之前使用了重定向System.out的做法。

但最近做自定义错误页面的时候,发现一个高手更好的办法。之前都没试过这样用~~~

首先定义一个内存输出流:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(byteArrayOutputStream);

然后过程中,不要用System.out,全部用printStream

到最后,想要输出到哪,就再建立一个PrintStream对象(例如封装FileOutputStream),使用print方法,把byteArrayOutputStream输出。

FileOutputStream fileOutputStream = new FileOutputStream(new File(dir.getAbsolutePath() + File.separatorChar + "error-" + timeStamp + ".txt"));
new PrintStream(fileOutputStream).print(byteArrayOutputStream); //写到文件

最后,贴上完整的error.jsp代码,大家慢慢分析。如果有什么问题,欢迎大家提出指正。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page isErrorPage="true" %>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page import="java.io.*"%>
<%
response.setStatus(HttpServletResponse.SC_OK);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>错误页面</title>
<script type="text/javascript" src="./javascript/jquery-1.5.1.min.js"></script>
<script>
function showErrorMessage(){
$(
"#errorMessageDiv").toggle();
}
$(document).ready(showErrorMessage);
</script>
</head>
<body>
<table width="100%">
<tr>
<td style="border-bottom:dotted 1px Gray;" colspan="2" >
<img src="images/error_title_icon.gif" id="img1" />&nbsp;&nbsp;错误提示
</td><td></td>
</tr>
<tr>
<td style="width: 130px" >
<img src="images/sorry.gif" id="error_img" />
</td>
<td>尊敬的用户:<br />系统出现了异常,请重试。
<br />如果问题重复出现,请向系统管理员反馈。<br /><br />
<a id="showErrorMessageButton" href="javascript:showErrorMessage();">详细错误信息</a>
</td>
</tr>
</table>
<div id="errorMessageDiv" >
<pre>
<%
try {
//全部内容先写到内存,然后分别从两个输出流再输出到页面和文件
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream printStream
= new PrintStream(byteArrayOutputStream);

printStream.println();
printStream.println(
"用户信息");
printStream.println(
"账号:" + request.getSession().getAttribute("userName"));
printStream.println(
"访问的路径: " + request.getAttribute("javax.servlet.forward.request_uri"));
printStream.println();

printStream.println(
"异常信息");
printStream.println(exception.getClass()
+ " : " + exception.getMessage());
printStream.println();

Enumeration
<String> e = request.getParameterNames();
if (e.hasMoreElements()) {
printStream.println(
"请求中的Parameter包括:");
while (e.hasMoreElements()) {
String key
= e.nextElement();
printStream.println(key
+ "=" + request.getParameter(key));
}
printStream.println();
}

printStream.println(
"堆栈信息");
exception.printStackTrace(printStream);
printStream.println();

out.print(byteArrayOutputStream);
//输出到网页

File dir
= new File(request.getRealPath("/errorLog"));
if (!dir.exists()) {
dir.mkdir();
}
String timeStamp
= new SimpleDateFormat("yyyyMMddhhmmssS").format(new Date());
FileOutputStream fileOutputStream
= new FileOutputStream(new File(dir.getAbsolutePath() + File.separatorChar + "error-" + timeStamp + ".txt"));
new PrintStream(fileOutputStream).print(byteArrayOutputStream); //写到文件

}
catch (Exception ex) {
ex.printStackTrace();
}
%>
</pre>
</div>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值