InputStream из файла, OutputStream в файл - PullRequest
1 голос
/ 15 мая 2011

У меня есть этот код в основном классе:

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)
    {
    }
}

1 Ответ

1 голос
/ 15 мая 2011

Для замены System.out просто используйте FileOutputStream.

. Для замены System.in вы можете использовать FileInputStream.Это не обеспечивает ввод строки за раз, но я ожидаю, что удаленный сервер telnet может обрабатывать опечатки, поэтому это не должно иметь значения.

Если опережающий ввод имеет значение , значит, у вас сложная проблема.Сторона ввода вашего клиента telnet должна синхронизироваться со стороной вывода и ждать, пока удаленный сервер / оболочка ожидает следующую строку, прежде чем отправлять ее.

  • Метод IOUtil.readWrite (как написано)не делает этого.
  • Для этого требуется, чтобы выходная сторона замечала командные подсказки (или что-то в этом роде) и указывала входной стороне записывать следующую строку ввода.Это сложно ... и хрупко по следующим причинам:
    • Вы точно не знаете, как будет выглядеть командная строка (и).
    • Одна из команд может изменить командуприглашения на лету.
    • Вывод команды может выглядеть как командная строка оболочки.

Я кратко рассмотрел протокол telnet,и я не вижу ничего, что говорит о том, что клиент должен отправлять данные строкой за раз.

...