替代BufferedReader中的readLine()方法?

时间:2013-08-03 22:28:33

标签: java tcp network-programming

我是java网络编程的新手。我正在使用java搜索TCP客户端的代码。我遇到了以下示例。

import java.lang.*;
import java.io.*;
import java.net.*;

class Client {
   public static void main(String args[]) {
      try {
         Socket skt = new Socket("localhost", 1234);
         BufferedReader in = new BufferedReader(new
            InputStreamReader(skt.getInputStream()));
         System.out.print("Received string: '");

         while (!in.ready()) {}
         System.out.println(in.readLine()); // Read one line and output it

         System.out.print("'\n");
         in.close();
      }
      catch(Exception e) {
         System.out.print("Whoops! It didn't work!\n");
      }
   }
}

客户似乎一次只读出一行数据?我正在连接到一个流式传输OpenFlow数据包的服务器。下面给出了OpenFlow数据包的wireshark屏幕截图。

[http://www.openflow.org/downloads/screenshot-openflow-dissector-2008-07-15-2103.jpg] [1]

一旦我收到完整的数据包,我想将其转储到一个文件,然后稍后使用wireshark读取它。在上面的代码中,他们使用calss BufferedReader来读取“行”中的数据?至少这就是我理解它的方式。在某种程度上,我可以获得完整的数据包,然后将其写入文件?

2 个答案:

答案 0 :(得分:2)

读者可以使用文本数据。如果您正在使用二进制数据(从该屏幕截图中并不完全清楚),您应该使用某种类型的Stream(InputStream或可能DataInputStream)。不要只是在网上寻找随机的例子,试着找到那些真正适用于你感兴趣的事情。

另外,不要使用InputStream.available,它几​​乎没用。就像使用它的任何示例代码一样。

另外,一个简单的谷歌搜索“OpenFlow java”有一些有趣的点击。你确定你需要从头开始写东西吗?

答案 1 :(得分:2)

不,但有些库提供了这样的功能。参见例如Guava

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/ByteStreams.html

如果您不想(或不能)使用库,您应该使用像这样的流

List<String> lst = new ArrayList<String>();
String line;
while ((line = in.readLine()) != null) {
   lst.add(line);
}

String str = "";
String line;
while ((line = in.readLine()) != null) {
   str += line + "\n";
}

请注意,BufferedReader.readLine()方法将为换行符('\ n')提供一个新行。如果InputStream是二进制的,那么你应该使用字节。