是否有一个简单的“;T形三通&x201D;Java流的过滤器?
为了调试Purposes,我希望在处理输出流时将其内容转储到文件中。该流由是否有一个简单的“;T形三通&x201D;Java流的过滤器?,java,android,Java,Android,为了调试Purposes,我希望在处理输出流时将其内容转储到文件中。该流由org.xml.sax.XMLReader解析,它将汇总数据 我想一个需要一个过滤器来存档这个,在我自己写一个之前,我想问问是否有一个现成的版本 更新: final org.apache.http.HttpEntity responseEntity = response.getEntity (); final java.io.InputStream content = responseEnt
org.xml.sax.XMLReader
解析,它将汇总数据
我想一个需要一个过滤器来存档这个,在我自己写一个之前,我想问问是否有一个现成的版本
更新:
final org.apache.http.HttpEntity responseEntity = response.getEntity ();
final java.io.InputStream content = responseEntity.getContent ();
final java.io.InputStreamReader contentReader =
new java.io.InputStreamReader (content, "UTF-8");
habe应该提到我在Android上工作 我有什么:
final org.apache.http.HttpEntity responseEntity = response.getEntity ();
final java.io.InputStream content = responseEntity.getContent ();
final java.io.InputStreamReader contentReader =
new java.io.InputStreamReader (content, "UTF-8");
因此,我有一个
java.io.InputStream
和一个InputStreamReader
不是一个现成的,但可能会感兴趣。示例中有一个TeeOutputStream
实现。救命!查看并查看。感谢所有的指针。下面是我为解决问题而创建的类的副本:
/**
* <p>
* Tee-Filters a Reader into an Writer.
* </p>
*
* @author "Martin Krischik" <martin.krischik@noser.com>
* @version 1.0 $Revision: 1046 $
* @since 1.0
*/
public class TeeReader
extends
java.io.Reader
{
/**
* <p>
* Reader to read from
* </p>
*/
private final java.io.Reader in;
/**
* <p>
* Tee output to which read date is written before beeing passed on.
* </p>
*/
private final java.io.Writer tee;
/**
* <p>
* create new filter.
* </p>
*
* @param in
* Reader to read from
* @param tee
* Tee output to which read date is written before beeing passed
* on.
*/
public TeeReader (final java.io.Reader in, final java.io.Writer tee)
{
this.in = in;
this.tee = tee;
} // TeeReader
/**
* <p>
* Close the stream. Once a stream has been closed, further read(), ready(),
* mark(), or reset() invocations will throw an IOException. Closing a
* previously-closed stream, however, has no effect.
* </p>
*
* @throws java.io.IOException
* @see java.io.Reader#close()
*/
@Override
public void close ()
throws java.io.IOException
{
this.in.close ();
} // close
/**
* <p>
* Reads characters into a portion of an array. This method will block until
* some input is available, an I/O error occurs, or the end of the stream is
* reached.
* </p>
*
* @param cbuf
* Destination buffer
* @param off
* Offset at which to start storing characters
* @param len
* Maximum number of characters to read
* @return The number of characters read, or -1 if the end of the stream has
* been reached Throws:
* @throws java.io.IOException
* @see java.io.Reader#read(char[], int, int)
*/
@Override
public int read (final char [] cbuf, final int off, final int len)
throws java.io.IOException
{
final int retval = this.in.read (cbuf, off, len);
if (retval >= 0)
{
this.tee.write (cbuf, off, len);
}
else
{
this.tee.close ();
} // if
return retval;
} // read
} // TeeReader
/**
*
*Tee将读者过滤为作者。
*
*
*@作者“Martin Krishik”
*@version 1.0$修订版:1046$
*@自1.0以来
*/
公共类阅读器
延伸
java.io.Reader
{
/**
*
*阅读的读者
*
*/
中的私有最终java.io.Reader;
/**
*
*读取日期在传递之前写入的Tee输出。
*
*/
私有最终java.io.Writer tee;
/**
*
*创建新过滤器。
*
*
*@param-in
*阅读的读者
*@param-tee
*读取日期在通过之前写入的Tee输出
*开。
*/
公共TeeReader(最终java.io.Reader-in,最终java.io.Writer-tee)
{
this.in=in;
this.tee=tee;
}//滴酒不沾
/**
*
*关闭流。关闭流后,进一步读取(),就绪(),
*mark()或reset()调用将引发IOException
*然而,以前关闭的流没有任何影响。
*
*
*@抛出java.io.IOException
*@see java.io.Reader#close()
*/
@凌驾
公众假期结束()
抛出java.io.IOException
{
this.in.close();
}//关闭
/**
*
*将字符读入数组的一部分。此方法将阻止,直到
*某些输入可用,发生I/O错误,或流结束
*达到。
*
*
*@param cbuf
*目标缓冲区
*@param off
*开始存储字符的偏移量
*@param-len
*要读取的最大字符数
*@返回读取的字符数,如果流的结尾已被删除,则返回-1
*已达成以下协议:
*@抛出java.io.IOException
*@see java.io.Reader#read(char[],int,int)
*/
@凌驾
公共整数读取(最终字符[]cbuf,最终整数关闭,最终整数len)
抛出java.io.IOException
{
最终int retval=this.in.read(cbuf、off、len);
如果(返回值>=0)
{
this.tee.write(cbuf、off、len);
}
其他的
{
this.tee.close();
}//如果
返回返回;
}//读
}//滴酒不沾
这里是一个简单的输出流版本(无异常处理):
我也有同样的问题。我希望能够看到Xml解析器得到了什么,以便调试服务器端脚本。理想情况下,您希望将Xml发送到Xml解析器和LogCat。您可以使用附带的clss InputStreamIntercept来执行此操作。只需通过它运行输入流:
final java.io.InputStream content =
new InputStreamIntercept(responseEntity.getContent());
下面是课堂:
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import android.util.Log;
/**
* This custom stream filter can intercept data being
* sent to another stream and send it to LogCat. It is
* useful as a way to tell what is being sent to an
* Xml parser.
*/
public class InputStreamIntercept extends FilterInputStream {
/**
* The string we build from data we input.
*/
private StringBuilder sb = new StringBuilder();
/**
* Constructor.
* @param in the stream we are intercepting
*/
public InputStreamIntercept(InputStream in) {
super(in);
}
/**
* Intercept read() and store the character for output
* @returns -1 if nothing read or the character read
*/
@Override
public int read() throws IOException {
int ret = super.read();
if(ret >= 0) {
newChar((byte)ret);
}
return ret;
}
/**
* Intercept read and output the content to Log.i.
*/
@Override
public int read(byte[] buffer, int offset, int count) throws IOException {
int ret = super.read(buffer, offset, count);
for(int i=0; i<ret; i++) {
newChar(buffer[i]);
}
return ret;
}
/**
* Handle a new character. We output whenever we get a newline
* @param ch
*/
private void newChar(byte ch) {
if(ch == 10) {
String str = sb.toString();
if(str.equals("")) {
Log.i("debug", "--blank line--");
} else {
Log.i("debug", str);
}
sb = new StringBuilder();
} else if(ch == 13) {
// Skip this character
} else {
sb.append((char)ch);
}
}
/**
* Close the stream
*/
@Override
public void close() throws IOException {
super.close();
if(sb.length() > 0) {
Log.i("debug", sb.toString());
}
}
}
导入java.io.FilterInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入android.util.Log;
/**
*此自定义流筛选器可以截取正在处理的数据
*发送到另一个流并发送到LogCat。它是
*这是一种很有用的方式,可以告诉您发送给
*Xml解析器。
*/
公共类InputStreamIntercept扩展FilterInputStream{
/**
*我们从输入的数据构建的字符串。
*/
私有StringBuilder sb=新StringBuilder();
/**
*构造器。
*@param在我们拦截的溪流中
*/
公共InputStreamIntercept(InputStream in){
超级(in),;
}
/**
*截取read()并存储用于输出的字符
*@如果未读取任何内容或字符已读取,则返回-1
*/
@凌驾
public int read()引发IOException{
int-ret=super.read();
如果(ret>=0){
newChar((字节)ret);
}
返回ret;
}
/**
*拦截读取并将内容输出到Log.i。
*/
@凌驾
公共整数读取(字节[]缓冲区、整数偏移量、整数计数)引发IOException{
int-ret=super.read(缓冲区、偏移量、计数);
对于(int i=0;i 0){
Log.i(“debug”,sb.toString());
}
}
}
您需要什么样的过滤器?到目前为止你有什么?什么是TODO?habe应该提到我在Android上工作吗。但我记得以后的commons I/O。我是舒尔的其他人,也有类似的问题,我很欣赏你的回答。啊,是的……这可以改变一切。以后一定要查找commons io…它有大量节省时间的实用程序。现在链接已经关闭,但我只需要知道我必须实现自己的解决方案。