我在java中编写了一个简单的客户端/服务器,它使用java NIO Socketchannel传输文件。当我将一个简单的文本文件从Linux传输到Windows时,行返回都消失了。我知道这两个操作系统使用不同的字符编码,但我想弄清楚在这个过程中我会考虑到这一点。
当服务器发送文件时,它只发送原始字节,由FileInputStream
读入。
我的客户端将通道中的字节读入ByteBuffer,然后从中获取字节数组。
socketChannel.read(this.readBuffer);
每次从频道收到更多字节时,我都会遍历字节数组,寻找EOF,如果我找不到它,我会把它放到一个文件中:
FileOutputStream fos = new FileOutputStream(filepath);
fos.write(data); //data is my byte[]
fos.close();
我知道这可能对某些人有明显的解决方案,但我对所涉及的所有概念都不太熟悉。
答案 0 :(得分:2)
基本问题是Linux有\ n作为换行符,窗口由\ r(回车)和\ n(换行符)组成。
通过以下方式获取系统的行分隔符:
System.getProperty("line.separator");
现在问题你要把它放在哪里。现在,如果要使用客户端行分隔符在客户端保存文件,请使用上面的api获取行分隔符并替换数据。
由于您不知道客户端哪个服务器正在使用(我试图使用通用soln)以分离行,尝试用客户端行分隔符替换这两种类型的行分隔符。
答案 1 :(得分:1)
在Unix中,换行符是字符\n
,而在Windows中,换行符是\r\n
对。因此,您可以考虑每次查看缓冲区并在\r
前插入\n
。
答案 2 :(得分:1)
这会逐行写入文件:
byte[] buff = "line1\nline2\nline3".getBytes();
InputStream is = new ByteArrayInputStream(buff);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
File file = new File("C:\\folder", "outputFile.txt");
PrintStream ps = new PrintStream(file);
String line;
while((line = br.readLine()) != null) {
ps.println(line);
}
br.close();
ps.close();
最后,outputFile.txt
的内容:
line1 line2 line3