重新实现org.apache.commons.net.io.Util来解析InputStream

时间:2013-08-31 01:48:29

标签: java io inputstream telnet apache-commons

org.apache.commons.net.io.Util使用InputStream,在流终止之前无法解析直播。这是正确还是不正确?

IOUtil课程对我来说是一个黑盒子。它使用org.apache.commons.net.io.Util,但同样不透明。

具体来说,Util.copyStream(remoteInput, localOutput);的{​​{1}}行很有趣:

IOUtil

如何读取原始流或其副本进入?实时telnet连接将具有copyStream public static final long copyStream(InputStream source, OutputStream dest) throws CopyStreamException Same as copyStream(source, dest, DEFAULT_COPY_BUFFER_SIZE); Throws: CopyStreamException ,但不会终止。我在API中看不到这样的功能。

或者,重新实现Apache InputStream可以回到最初的问题:

examples.util.IOUtil

要么我有一个基本的误解,或者,如果没有重新实现(或者使用反射),这些API不允许处理实时,未终止的 package weathertelnet; import java.io.IOException; import java.io.InputStream; import java.util.logging.Logger; public class StreamReader { private final static Logger LOG = Logger.getLogger(StreamReader.class.getName()); private StringBuilder stringBuilder = new StringBuilder(); private InputStream inputStream; public StreamReader() { } public void setInputStream(InputStream inputStream) throws IOException { this.inputStream = inputStream; readWrite(); } public void readWrite() throws IOException { Thread reader = new Thread() { @Override public void run() { do { try { char ch = (char) inputStream.read(); stringBuilder.append(ch); } catch (IOException ex) { } } while (true); //never stop reading the stream.. } }; Thread writer = new Thread() { @Override public void run() { //Util.copyStream(remoteInput, localOutput); //somehow write the *live* stream to file *as* it comes in //or, use org.apache.commons.net.io.Util to "get the data" } }; } }

我真的不倾向于在这里使用反射,我认为下一阶段是要开始分解InputStream做什么以及它是如何做到的,但那真的是在兔子洞里。它在哪里结束?

http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/io/Util.html#copyStream%28java.io.InputStream,%20java.io.OutputStream%29

2 个答案:

答案 0 :(得分:1)

您可以复制流“ live ”但是当没有更多输入时,InputStream可能会阻止。

您可以看到org.apache.commons.net.io.Util#copyStream(...) here

的代码

答案 1 :(得分:0)

先输出:

thufir@dur:~$ 
thufir@dur:~$ java -jar NetBeansProjects/SSCCE/dist/SSCCE.jar 
print..
makeString..
cannot remove       java.util.NoSuchElementException
------------------------------------------------------------------------------
*               Welcome to THE WEATHER UNDERGROUND telnet service!            *
------------------------------------------------------------------------------
*                                                                            *
*   National Weather Service information provided by Alden Electronics, Inc. *
*    and updated each minute as reports come in over our data feed.          *
*                                                                            *
*   **Note: If you cannot get past this opening screen, you must use a       *
*   different version of the "telnet" program--some of the ones for IBM      *
*   compatible PC's have a bug that prevents proper connection.              *
*                                                                            *
*           comments: jmasters@wunderground.com                              *
------------------------------------------------------------------------------

Press Return to continue:finally -- waiting for more data..





cannot remove       java.util.NoSuchElementException
finally -- waiting for more data..

------------------------------------------------------------------------------
*               Welcome to THE WEATHER UNDERGROUND telnet service!            *
------------------------------------------------------------------------------
*                                                                            *
*   National Weather Service information provided by Alden Electronics, Inc. *
*    and updated each minute as reports come in over our data feed.          *
*                                                                            *
*   **Note: If you cannot get past this opening screen, you must use a       *
*   different version of the "telnet" program--some of the ones for IBM      *
*   compatible PC's have a bug that prevents proper connection.              *
*                                                                            *
*           comments: jmasters@wunderground.com                              *
------------------------------------------------------------------------------

Press Return to continue:



cannot remove       java.util.NoSuchElementException
^Cthufir@dur:~$ 
thufir@dur:~$ 

然后代码:

thufir@dur:~$ cat NetBeansProjects/SSCCE/src/weathertelnet/Telnet.java 
package weathertelnet;

import static java.lang.System.out;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.logging.Logger;
import org.apache.commons.net.telnet.TelnetClient;

public final class Telnet {

    private final static Logger LOG = Logger.getLogger(Telnet.class.getName());
    private TelnetClient telnetClient = new TelnetClient();

    public Telnet() throws SocketException, IOException {
        InetAddress host = InetAddress.getByName("rainmaker.wunderground.com");
        int port = 3000;
        telnetClient.connect(host, port);

        final InputStream inputStream = telnetClient.getInputStream();
        final ConcurrentLinkedQueue<Character> clq = new ConcurrentLinkedQueue();
        final StringBuilder sb = new StringBuilder();

        Thread print = new Thread() {

            @Override
            public void run() {
                out.println("print..");
                try {
                    char ch = (char) inputStream.read();
                    while (255 > ch && ch >= 0) {
                        clq.add(ch);
                        out.print(ch);
                        ch = (char) inputStream.read();
                    }
                } catch (IOException ex) {
                    out.println("cannot read inputStream:\t" + ex);
                }
            }
        };

        Thread makeString = new Thread() {

            @Override
            public void run() {
                out.println("makeString..");
                do {
                    try {
                        do {
                            char ch = clq.remove();
                            sb.append(ch);
                            // out.println("appended\t" + ch);
                        } while (true);
                    } catch (java.util.NoSuchElementException | ClassCastException e) {
                        out.println("cannot remove\t\t" + e);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException interruptedException) {
                            out.println("cannot sleep1\t\t" + interruptedException);
                        }
                    } finally {
                        out.println("finally -- waiting for more data..\n\n" + sb + "\n\n\n");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException interruptedException) {
                            out.println("cannot sleep1\t\t" + interruptedException);
                        }
                    }
                } while (true);
            }
        };
        print.start();
        makeString.start();
    }

    private void cmd(String cmd) throws IOException {//haven't tested yet..
        byte[] b = cmd.getBytes();
        System.out.println("streamreader has\t\t" + cmd);
        int l = b.length;
        for (int i = 0; i < l; i++) {
            telnetClient.sendCommand(b[i]);
        }
    }

    public static void main(String[] args) throws SocketException, IOException {
        new Telnet();
    }
}thufir@dur:~$ 
thufir@dur:~$