从具有不一致的行终止符的java套接字读取行

时间:2012-01-01 16:01:22

标签: java readline bufferedreader terminator

我使用BufferedReader#readLine()从TCP / IP套接字获取文本行。

在同一个会话期间,我的服务器有时发送以\ r \ n结尾的行,有时它会发送仅使用\ n终止的行。

此行为不在我的控制之下:(

readLine()的Javadoc说:

  

“一条线被认为是换行符('\ n'),回车符('\ r')或回车符后面的任何一个终止。”

不幸的是,这似乎不起作用(至少在Windows上)。它只“知道”读取以\ r \ n结尾的行。

有什么建议吗?

提前致谢, 阿德里安。

2 个答案:

答案 0 :(得分:1)

写了一个简单的套接字客户端并针对netcat服务器进行了测试。 问题是netcat服务器总是以UTF-8发送,客户端不能指望UTF-16。

以下是客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;

public class LineReader {

    /**
     * @param args
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("usage: java LineReader charset url");
            System.exit(1);
        }

        try {
            final String charset = args[0];
            final URI url = new URI(args[1]);
            final String host = url.getHost();
            final int port = url.getPort();
            final Socket socket = new Socket(host, port);
            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream(), charset));
            while (true) {
                final String line = reader.readLine();
                System.out.println(line);
            }
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

结论:readLine方法没有问题。

答案 1 :(得分:0)

尝试使用底层操作系统的line.separator属性:您可以按如下方式执行此操作:

static final String lineSeparator = System.getProperty ( "line.separator" );