如何将 InputStream 复制到需要 OutputStream 的 Apache TeeOutputStream? [英] How to copy an InputStream to Apache TeeOutputStream, which expects an OutputStream?

查看:33
本文介绍了如何将 InputStream 复制到需要 OutputStream 的 Apache TeeOutputStream?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经改编了 Apache IOUtil sampleWeatherTelnet sample 有点不同.虽然 WeatherTelnet 的评论指出:

I've adapted the Apache IOUtil sample to work with the WeatherTelnet sample a little differently. While the comments for WeatherTelnet state that:

自身使用的 TelnetClient 类主要用于自动访问 telnet 资源,而不是交互式使用.

The TelnetClient class used by itself is mostly intended for automating access to telnet resources rather than interactive use.

我想使用 Apache TeeOutputStream 拆分输出,但是 API 分支 OutputStreamTelnetClient "output" 是 的形式>InputStream,当然可以读取.方便的是,Apache copyStream 实用程序方法会将 InputStream 复制到 OutputStream.

I would like to split the output using Apache TeeOutputStream, but the API branches OutputStream whereas TelnetClient "output" is in the form of an InputStream, so that, of course, it can be read. Conveniently, the Apache copyStream utility method will copy an InputStream to an OutputStream.

1.) 如何将 InputStream 复制到 printKindaWorksprintToFile 中的 OutputStream?2.) 我如何将 OutputStream 写入文件,或将其打开?

1.) How do I copy the InputStream to an OutputStream in printKindaWorks or printToFile? 2.) How do I either write the OutputStream to a file, or tee it?

诀窍是实时进行这些操作,同时用户与天气服务器交互.

the trick is to do these operations live, while the user interacts with the weather server.

我尽力查看了 copyStream 的源代码并将其用作参考,但它只是简单地不起作用.我还没有研究 tee 的 Apache 实现的内部结构.

I did my best to look at the source code for copyStream and used that for reference, but it just plain doesn't work. I haven't yet looked at the internals for the Apache implementation of tee.

实用程序类:

package apache;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.net.io.Util;

public final class IOUtil {

    private static final Logger log = Logger.getLogger(IOUtil.class.getName());

    private static void readFromConsole(final OutputStream outputStream) {
        Thread read = new Thread() {

            @Override
            public void run() {
                int ch;

                try {
                    while ((ch = System.in.read()) != -1) {
                        outputStream.write(ch);
                        outputStream.flush();
                    }
                } catch (IOException ioe) {
                    log.warning(ioe.toString());
                }
            }
        };
        read.start();
    }

    private static void writeToConsole(final InputStream inputStream) {
        Thread write = new Thread() {

            @Override
            public void run() {
                try {
                    Util.copyStream(inputStream, System.out);
                } catch (IOException ioe) {
                    log.warning(ioe.toString());
                }
            }
        };
        write.start();
    }

    private static void printKindaWorks(final InputStream inputStream) {
        Thread write = new Thread() {

            @Override
            public void run() {
                PrintStream printStream = null;
                try {
                    File file = new File("weather.log");
                    FileOutputStream fos = new FileOutputStream(file, true);
                    printStream = new PrintStream(fos);
                    Util.copyStream(inputStream, printStream);
                } catch (IOException ioe) {
                    log.warning(ioe.toString());
                }
            }
        };
        write.start();
    }

//                TeeOutputStream tee = new TeeOutputStream(inputStream, bis);   
    private static void writeToFile(final InputStream inputStream) throws FileNotFoundException, IOException {
        final String fname = "whether.log";
        File f = new File(fname);
        f.createNewFile();
        Thread fileWriter = new Thread() {

            @Override
            public void run() {
                char c = 0;
                int r = 0;
                try {
                    while ((r = inputStream.read()) != -1) {
                        c = (char) r;
                        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fname, true)));
                        out.print(c);
                        out.close();
                    }
                } catch (IOException ex) {
                    Logger.getLogger(IOUtil.class.getName()).log(Level.SEVERE, null, ex);
                }


            }
        };
        fileWriter.start();
    }

    public static void readWriteLog(final InputStream inputStream, final OutputStream outputStream) throws FileNotFoundException, IOException {
        readFromConsole(outputStream);
        writeToConsole(inputStream);
        writeToFile(inputStream);  //doesn't write much
  //      printKindaWorks(inputStream);       //blocks writeToConsole ?
    }
}

和司机:

package weather;

import apache.IOUtil;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.commons.net.telnet.TelnetClient;

public class Weather {

    public Weather() {
    }

    public static void main(String[] args) throws UnknownHostException, IOException {
        int port = 3000;
        InetAddress host = InetAddress.getByName("rainmaker.wunderground.com");
        TelnetClient telnetClient = new TelnetClient();
        telnetClient.connect(host, port);
        IOUtil.readWriteLog(telnetClient.getInputStream(), telnetClient.getOutputStream());
    }
}

请考虑 ASL 下的代码.

Please consider the code under the ASL.

虽然我正在记录"InputStream,但我不是在处理记录问题,写入文件只是为了说明目的.我只想在用户与天气服务器交互时拆分 InputStream.

While I am "logging" the InputStream I'm not not working on a logging problem, writing to a file is just for illustration purposes. I just want to split the InputStream while the user interacts with the weather server.

推荐答案

您需要实例化一个包装 System.out 和日志文件的 TeeOutputStream.然后创建一个线程,将 telnet InputStream 复制到 TeeOutputStream.(您只能有一个线程使用 telnet InputStream)

You need to instantiate a TeeOutputStream which wraps System.out and the log file. Then create a thread which copies the telnet InputStream to the TeeOutputStream. (you can only have a single thread consuming the telnet InputStream)

这篇关于如何将 InputStream 复制到需要 OutputStream 的 Apache TeeOutputStream?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆