【问题标题】:java read from network input stream with buffer(need to exclude emty symbols)java从带有缓冲区的网络输入流中读取(需要排除空符号)
【发布时间】:2014-01-22 23:51:09
【问题描述】:

我有从网络输入流中读取的方法。

    //pattern value is shell prompt string ":~#"
    //this do read shells output like from command "ls", etc...
    public String readUntil(String pattern) throws IOException, JSchException {
    long began = System.currentTimeMillis();
    long lastTime = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder();
    socket.setTimeout(timeout);
    iks: while (true) {
        try {
            int c = -1;
            byte[] text = new byte[1024];
            c = in.read(text);
            long now = System.currentTimeMillis();
            if (c != -1) {
                sb.append(new String(text));
                lastTime = now;
            }
            if (now - lastTime > timeout){
                System.out.println( "BREAK BY TIMEOUT");
                break;
            }
            if (sb.toString().contains(pattern)) {
                System.out.println( "BREAK BY PATTERN");
                break;
            }
            Thread.sleep(50);
        }catch(Exception e){
            System.out.println("¬"+e);
            break iks;
        }
    }
    System.out.println( "TIME TAKEN readUntil -> "+(System.currentTimeMillis()-began));
    //Log.v("¬","result -> "+sb.toString());
    return sb.toString();
}

这工作相当快,但每次读取都会用空值填充字节数组的末尾。如何执行“sb.append(new String(text));”不包括空字节?

【问题讨论】:

  • 看,Java API 提供了您需要从 InputStream 读取字符串数据的情况。查找“Reader”,尤其是“InputStreamReader”。

标签: java networking java-io


【解决方案1】:

您的读取逻辑有问题,因为您分配了一个 1024 的缓冲区(所有成员都初始化为 null),然后在最后一次通过时,显然缓冲区的某些部分可以保持为空,从而导致写入 null 值。

因此,一旦到达流的末尾,您需要停止阅读,尝试按照以下行更改您的代码:

byte[] buff = new byte[255];

    String output = "";
    InputStream is = //get input stream

    int n = 0;
    while ( (n = is.read(buff) )!=-1)
    {
        output += new String(buff,0,n);
    }

    is.close();

这样您将获得仅包含初始化缓冲区成员的字符串,“n”的值是实际读取的字节数(=无空值)。您可以根据需要更改读取的块。

【讨论】:

    【解决方案2】:

    尝试在你的代码中使用BufferedInputStream -> BufferedInputStream(InputStream in)

    And 方法read(byte[] b, int off, int len) 从此字节输入流中读取字节到指定的字节数组,从给定的偏移量开始,并返回读取的字节数,如果已到达流的末尾,则返回 -1。

    在您的代码中它将是:

    BufferedInputStream bis = new BufferedInputStream(in);
    ...
    byte text[] = new byte[]; // size of byte array can change
    c = bis.read(text, 0, 1024);
    

    【讨论】:

    • 这不回答任何问题,并且忽略了真正的编码错误。像这样将所有三个参数指定为 read() 只会造成长度错误的机会。
    • 但是当您读取最后一个字节时,并且小于 1024,您将只读取此字节,并且 text.lenght 将
    • 说的没错,但与我的评论无关。您的代码应该是bis.read(text)bis.read(text, 0, text.length),但它仍然没有回答问题。事实上,同时使用 byte[] 数组 BufferedInputStream 是多余的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    相关资源
    最近更新 更多