是否有一个简单的“;T形三通&x201D;Java流的过滤器?

是否有一个简单的“;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

为了调试Purposes,我希望在处理输出流时将其内容转储到文件中。该流由
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…它有大量节省时间的实用程序。现在链接已经关闭,但我只需要知道我必须实现自己的解决方案。