2013-10-20 89 views
1

我正在开发一个工具来获取客户端信息,发送到服务器,并再次接收信息(代理)。我也试图转储从服务器接收的数据。我可以读取inputStream的Integer表示,但我无法读取String格式。我已经尝试了下面的例子,但它挂起并且从不连接到服务器。此外,System.out.println(inputStream.nextLine())只显示一行并挂起。Java输入流到字符串挂起

public void run() { 
    try { 
     int i; 
     while ((i = inputStream.read()) != -1){ 
      System.out.println(IOUtils.toString(inputStream)); 
      outputStream.write(i); 
     } 
    } catch (IOException e) { 
     System.out.println("Lost connection to the client."); 
    } 
} 
+0

哪些IOUtils库您使用? – axiopisty

+0

我在IOTools中使用2.4 – baseman101

回答

1

我的猜测是,您正在从输入流中读取数据,然后使用IOUtils库从数据流中读取数据。我怀疑你的应用程序是从输入流中读取第一个字节,然后用IOUtils库读取输入流的其余部分,然后输出读取的初始字节。

从循环内调用IOUtils.toString(inputstream)没有任何意义。该方法调用将把来自输入流的所有数据放入一个字符串中。为什么在这种情况下有回路?

您可能想尝试不为此使用IOUtils库。只需读取一个字节的数据,将其推入一个StringBuilder,然后打印该字节。在这种方法中,循环将是必要的,你可能会得到你想要的。

尝试这样的事情,但修改根据需要在同一时间打印数据传输到输出流:

public static String inputStreamToString(final InputStream is, final int bufferSize) 
{ 
    final char[] buffer = new char[bufferSize]; 
    final StringBuilder out = new StringBuilder(); 
    try { 
    final Reader in = new InputStreamReader(is, "UTF-8"); 
    try { 
     for (;;) { 
     int rsz = in.read(buffer, 0, buffer.length); 
     if (rsz < 0) 
      break; 
     out.append(buffer, 0, rsz); 
     } 
    } 
    finally { 
     in.close(); 
    } 
    } 
    catch (UnsupportedEncodingException ex) { 
    /* ... */ 
    } 
    catch (IOException ex) { 
     /* ... */ 
    } 
    return out.toString(); 
} 
1
  1. 您发布不试图连接到服务器,但如果它的任何执行必须已连接的代码。
  2. 如果您的程序挂在此代码中,服务器尚未发送任何数据,或者IOUtils.toString()方法可能会尝试读取到EOS,因此如果对等方未关闭连接,您将永远阻止此处。
  3. 如果程序在readLine()调用中挂起,则意味着对等方没有发送行来读取。
+0

这是线程的一部分,它是我主代码的一部分。代码与服务器建立连接,但尝试以字符串格式写出数据不起作用。使用以上代码,直到我的设备从服务器断开连接才会输出。然后,inputStream以我想要的格式显示。我想让inputStream不断输出服务器数据。 – baseman101

+0

还有其他一些将输入流转换为字符串的例子,为什么会有一种方法将输入流转换为字符串,如果“没有意义”? – baseman101