【问题标题】:How to copy an InputStream to Apache TeeOutputStream, which expects an OutputStream?如何将 InputStream 复制到需要 OutputStream 的 Apache TeeOutputStream?
【发布时间】:2013-09-14 12:46:05
【问题描述】:

我已经调整了 Apache IOUtil sample 以与 WeatherTelnet sample 稍微不同。而WeatherTelnet 的 cmets 声明:

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

我想使用 Apache TeeOutputStream 拆分输出,但是 API 分支 OutputStreamTelnetClient “输出”是 InputStream 的形式,所以当然,它可以被阅读。方便的是,Apache copyStream 实用程序方法会将 InputStream 复制到 OutputStream。

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

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

我尽力查看copyStream 的源代码并将其用作参考,但它根本不起作用。我还没有查看 tee 的 Apache 实现的内部结构。

实用程序类:

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 下的代码。

虽然我正在“记录”InputStream,但我并没有解决记录问题,写入文件只是为了说明目的。我只想在用户与天气服务器交互时拆分InputStream

【问题讨论】:

    标签: java file-io io text-files apache-commons


    【解决方案1】:

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

    【讨论】:

    • 好的,听起来很有趣!我认为 System.out 是一个 OutputStream,也许是一个?PrintWriter?分公司?
    • @Thufir - 只需使用 FileOutputStream 而不是 FileWriter。
    • 对不起,我只是看不到 如何 可能将 InputStream 复制到 TeeOutputstream。您关于只有单个线程可以使用 telnet InputStream 的观点非常重要。
    • @Thufir - 您已经拥有将 InputStream 复制到 (Tee)OutputStream 的代码。我不明白这种混乱。
    【解决方案2】:

    不是我真正想要的,宁愿使用 Apache tee,但这可以完成工作(笨拙地):

    package apache;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    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();
        }
    
    //                TeeOutputStream tee = new TeeOutputStream(inputStream, bis);   
        private static void readInput(final InputStream inputStream) throws FileNotFoundException, IOException {
            Thread readInput = new Thread() {
    
                @Override
                public void run() {
                    char c = 0;
                    int r = 0;
                    try {
                        while ((r = inputStream.read()) != -1) {
                            c = (char) r;
                            printToConsole(c);
                            logToFile(c);
                        }
                    } catch (IOException ex) {
                        Logger.getLogger(IOUtil.class.getName()).log(Level.SEVERE, null, ex);
                    }
    
    
                }
    
                private void logToFile(char c) throws IOException {
                    String fname = "whetherOrNot.log";
                    File f = new File(fname);
                    f.createNewFile();
                    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fname, true)));
                    out.print(c);
                    out.flush();
                    out.close();
                }
    
                private void printToConsole(char c) {
                    System.out.print(c);
                }
            };
            readInput.start();
        }
    
        public static void readWriteLog(final InputStream inputStream, final OutputStream outputStream) throws FileNotFoundException, IOException {
            readFromConsole(outputStream);
            readInput(inputStream);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-14
      • 2011-01-06
      • 2012-07-27
      • 1970-01-01
      • 2012-03-29
      • 2014-07-18
      • 2018-07-19
      相关资源
      最近更新 更多