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

标签 java io inputstream telnet apache-commons

org.apache.commons.net.io.Util 使用 InputStream,在流终止之前无法实时解析它。这是正确还是错误?

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

具体来说,IOUtilUtil.copyStream(remoteInput, localOutput); 行很有趣:

copyStream

public static final long copyStream(InputStream source,
              OutputStream dest)
                             throws CopyStreamException

Same as copyStream(source, dest, DEFAULT_COPY_BUFFER_SIZE);

Throws:
    CopyStreamException

如何读取原始流或其副本传入?实时 telnet 连接将有一个不会终止的 InputStream。我在 API 中没有看到这样的功能。

或者,重新实现 Apache examples.util.IOUtil 会回到原来的问题:

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"
            }
        };
    }
}

要么是我有根本性的误解,要么是在不重新实现(或者可能使用反射)的情况下,这些 API 不允许处理实时、未终止InputStream

我真的不倾向于在这里使用反射,我认为下一阶段是开始分解 org.apache.commons.net.io.Util 的作用以及它的作用是的,但这确实是在掉入兔子洞。哪里结束了?

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

最佳答案

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

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

关于java - 重新实现 org.apache.commons.net.io.Util 来解析 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18543703/

相关文章:

java - TODO-FIXME : In Java 8's Integer class?

java - 无法打开套接字文件: process not responding while Dumping the JVM?的原因是什么

Java输入流

java - PDFBox 文档到 InputStream

java - 使用 mybatis 检索 BLOB?

java - 我使用 2 个线程打印 10 以内的偶数奇数的实现有什么问题

java - 是否可以在没有任何数据库功能的情况下在 Java GUI 应用程序运行时临时保存数据?

从文件读取时的 java.net.URL 缓存

haskell - 可以在 Haskell 中以纯代码读取文件吗?

c++ - 如何在 C++ 中读取/写入大文件时减少 I/O 磁盘访问次数