繁体   English   中英

输入流从文件,输出流到文件

[英]InputStream from file, OutputStream to a file

我在主类中有以下代码:

IOUtil.readWrite(telnet.getInputStream(), telnet.getOutputStream(),
    System.in, System.out);

这非常有效,因为System.in从用户那里获取输入,而System.out将打印所有输出。

我正在尝试更改此设置,因此,代替System.in的可能是另一个InputStream对象,该对象每次请求输入都从文件读取一行,并且System.out可能是一个将所有输出写入文件的Object。

IOUtil类如下:

package examples;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.io.Util;

public final class IOUtil
{

public  final static void readWrite(final InputStream remoteInput,
                                   final OutputStream remoteOutput,
                                   final InputStream localInput,
                                   final OutputStream localOutput)
{
    Thread reader, writer;

    reader = new Thread()
             {
                 public void run()
                 {
                     int ch;

                     try
                     {
                         while (!interrupted() && (ch = localInput.read()) != -1)
                         {
                             remoteOutput.write(ch);
                             remoteOutput.flush();
                         }
                     }
                     catch (IOException e)
                     {
                         //e.printStackTrace();
                     }
                 }
             }
             ;

    writer = new Thread()
             {
                 public void run()
                 {
                     try
                     {
                         Util.copyStream(remoteInput, localOutput);                                
                     }
                     catch (IOException e)
                     {
                         e.printStackTrace();
                         System.exit(1);
                     }
                 }
             };


    writer.setPriority(Thread.currentThread().getPriority() + 1);

    writer.start();
    reader.setDaemon(true);
    reader.start();

    try
    {
        writer.join();
        reader.interrupt();
    }
    catch (InterruptedException e)
    {
    }
}

要替换System.out,只需使用FileOutputStream

要替换System.in,可以使用FileInputStream 这不会一次提供一行输入,但是我希望远程telnet服务器可以处理预先输入,所以这无关紧要。

如果预先输入确实很重要,那么您将遇到一个难题。 telnet客户端的输入端必须与输出端同步,并等待直到远程服务器/ shell期望下一行后再发送。

  • IOUtil.readWrite方法(如所写)不会执行该操作。
  • 这样做需要输出端注意命令提示符(或其他内容),并告诉输入端编写下一行输入。 这很棘手,而且很脆弱,原因如下:
    • 您不确定命令提示符是什么样。
    • 其中一个命令可以即时更改命令提示符。
    • 命令输出看起来像一个shell命令提示符。

我对telnet协议进行了简要介绍,但看不到任何内容表明客户端必须一次发送数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM