我用Java编写了一个简单的客户端/服务器,该客户端/服务器使用Java NIO Socketchannel传输文件。当我将简单的文本文件从Linux传输到Windows时,返回的行全部消失了。我知道两个操作系统使用不同的字符编码,但是我试图弄清楚在此过程中我会考虑到什么。

服务器发送文件时,只会发送原始字节,并由FileInputStream读取。

我的客户端从 channel 读取字节到ByteBuffer,然后从中获取字节数组。

socketChannel.read(this.readBuffer);

每次从 channel 接收更多字节时,我都会遍历字节数组,寻找EOF,如果找不到,则将其放入文件中:
FileOutputStream fos = new FileOutputStream(filepath);
fos.write(data);  //data is my byte[]
fos.close();

我知道这也许可以为某些问题提供一个明显的解决方案,但是我对所涉及的所有概念不是很熟悉。

最佳答案

基本问题是Linux将\n作为换行符,并将窗口由\r(回车符)和\n(换行符)组成。

要通过以下方法获取系统的行分隔符:

System.getProperty("line.separator");

现在的问题是你要把它放在哪里。现在,如果要使用客户端行分隔符在客户端保存文件,请使用上面的api获取行分隔符并替换数据。

由于您不知道客户端使用什么服务器(我打算使用通用解决方案)进行行分隔,因此请尝试用客户端行分隔符替换这两种类型的行分隔符。

10-07 21:01