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

标签 java inputstream fileinputstream

我在主类中有这段代码:

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

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

我试图改变这一点,因此 System.in 可以是另一个每次请求输入时从文件中读取一行的 InputStream 对象,而 System.out 也可以是一个将所有输出写入文件的对象。

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 协议(protocol),但没有看到任何表明客户端必须一次一行发送数据的内容。

关于java - 从文件输入流,到文件输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6006126/

相关文章:

java - 需要程序方面的帮助,FileInputStream 只读取文本文件的一行时遇到问题。 [作业帮助]

Java 现在声明,稍后定义

java - HttpURLConnection OutputStream 问题

java - 还有其他 GXT 主题吗?

java - InputStream 跳过字节

java - Android:4.0 ICS 上奇怪的 openStream

java - getResourceAsStream 为 txt 文件返回 null 但对图像有效

java - 我怎样才能让两个线程为我的应用程序工作

android - 对Android设备上的文件系统感到困惑

java - 将文本文件中的数据解析为Java中的多个数组