【问题标题】:Reading an inputStream all at once [duplicate]一次读取一个 inputStream [重复]
【发布时间】:2011-08-10 17:25:09
【问题描述】:

我开发了一个 j2me 应用程序,它通过套接字连接到我的虚拟主机服务器。我使用我自己的扩展基本 InputStreamReader 的扩展 lineReader 类从服务器读取响应。如果服务器发送 5 行回复,则逐行读取服务器回复的语法为:

        line=input.readLine();
        line = line + "\n" + input.readLine();
        line = line + "\n" + input.readLine();
        line = line + "\n" + input.readLine();
        line = line + "\n" + input.readLine();

在这种情况下,我可以编写这种语法,因为我知道回复的数量是固定的。但是如果我不知道行数,并且想一次读取整个inputStream,我应该如何修改当前的readLine()函数。这是函数的代码:

public String readLine() throws IOException {
    StringBuffer sb = new StringBuffer();
    int c;
    while ((c = read()) > 0 && c != '\n' && c != '\r' && c != -1) {
        sb.append((char)c);
    }
    //By now, buf is empty.
    if (c == '\r') {
        //Dos, or Mac line ending?
        c = super.read();
        if (c != '\n' && c != -1) {
            //Push it back into the 'buffer'
            buf = (char) c;
            readAhead = true;
        }
    }
    return sb.toString();
}

【问题讨论】:

    标签: java sockets java-me inputstream


    【解决方案1】:

    Apache Commons IOUtils.readLines() 怎么样?

    使用平台的默认字符编码以字符串列表的形式获取 InputStream 的内容,每行一个条目。

    或者,如果您只想要一个字符串,请使用 IOUtiles.toString()

    使用平台的默认字符编码将 InputStream 的内容作为字符串获取。

    [更新] 根据关于 J2ME 上可用的评论,我承认我错过了那个条件,但是,IOUtils source 对依赖关系非常轻,所以也许可以直接使用代码。

    【讨论】:

    • 但它可用于 j2me 平台吗?
    • @Coding-Freak:对不起,我错过了;我对 J2ME 平台有些无知,所以我用我所知道的最好的方式更新了我的答案,祝你好运。
    • 我只想修改我当前工作的readLine() 函数,以便能够一次读取整个流。希望你能理解这个问题。
    【解决方案2】:

    如果我理解正确,您可以使用一个简单的循环:

    StringBuffer sb = new StringBuffer();
    String s;
    while ((s = input.readLine()) != null)
        sb.append(s);
    

    在您的循环中添加一个计数器,如果您的计数器 = 0,则返回 null:

    int counter = 0;
    while ((c = read()) > 0 && c != '\n' && c != '\r' && c != -1) {
        sb.append((char)c);
        counter++;
    }
    if (counter == 0)
        return null;
    

    【讨论】:

    • 我按照你说的修改了代码。现在它没有从服务器返回任何响应。
    • 这不是一个完整的例子。如果 -1 已收到且此后未读取,则应添加一些 EOF 标志。
    • 请帮我解决剩下的代码。我完全被它困住了。 :(
    • 我现在无论如何都无法编写真实且经过测试的代码(因为我在这台计算机上没有java环境)但是你为什么不使用我建议的while循环(在开头我的回答)使用原始的 readLine,而不是您的扩展名?
    【解决方案3】:

    专门用于网络服务器!

    String temp;
    StringBuffer sb = new StringBuffer();
    while (!(temp = input.readLine()).equals("")){
        sb.append(line);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 2015-10-24
      • 2018-10-24
      • 2011-12-05
      • 2016-05-25
      • 2012-09-10
      • 1970-01-01
      • 2010-12-25
      • 2014-11-19
      相关资源
      最近更新 更多