2012-01-18 48 views
2

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

当服务器发送文件时,它只是发送原始字节,由FileInputStream读入。

我的客户端将通道中的字节读入ByteBuffer,然后从中获取字节数组。

FileOutputStream fos = new FileOutputStream(filepath); 
fos.write(data); //data is my byte[] 
fos.close(); 

:通过字节的每一个我收到更多来自渠道,寻找EOF,如果我不觉得,我把它放到一个文件时,该阵列

socketChannel.read(this.readBuffer); 

我环路我知道这对某些人可能有一个明显的解决方案,但我并不太熟悉所涉及的所有概念。

+1

你使用的FileInputStream任何理由代替的FileReader呢?从FileInputStream的文档:FileInputStream是用于读取诸如图像数据的原始字节流。为了读取字符流,请考虑使用FileReader。 – GoingTharn 2012-01-18 22:14:14

+0

我问,因为FileReader会尊重/保留换行符。 (尽管距离使用java.io已经有8个多月了) – GoingTharn 2012-01-18 22:32:17

回答

2

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

若要获得系统的行分隔符:

System.getProperty("line.separator"); 

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

因为你不知道客户端服务器正在使用什么服务器(我试图去通用soln)分离线,尝试用客户端行分隔符替换这两种类型的行分隔符。最后

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内容:

1

在Unix中,换行符是字符\n,而在Windows中,它是一对\r\n。因此,您可以考虑每次查看缓冲区并在\n前插入\r

1

这一行行写入到文件

 
line1 
line2 
line3 
+0

如果我只发送几个信息包,我喜欢这个解决方案。但是,我将通过大约4kb的数据包发送字节数组,用于可能达到300MB的文件。实例化这些对象数千次的开销会有点多我想。虽然我确实喜欢这个想法。谢谢! – Indigenuity 2012-01-24 18:18:59