2012-01-18 8 views
2

私は、Java NIO Socketchannelを使ってファイルを転送する単純なクライアント/サーバをjavaで作成しました。 LinuxからWindowsに単純なテキストファイルを転送すると、改行はすべて消えてしまいます。私は2つのオペレーティングシステムが異なる文字エンコーディングを使用していることを知っていますが、プロセスのどこでそれを考慮に入れようとしています。Linuxからウィンドウへの転送で改行文字が失われた

サーバーがファイルを送信すると、生のバイトが送信され、FileInputStreamで読み取られます。

クライアントがチャネルのバイトをByteBufferに読み込むと、バイト配列が取得されます。バイトの配列によって

socketChannel.read(this.readBuffer); 

Iループ私はEOFを探して、チャンネルからより多くを受け取るたびに、私はそれを見つけていない場合、私は、ファイルにそれを置く:

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

私はこれが明らかにいくつかの明らかな解決策を持っていることを知っているが、私は関与するすべての概念にあまり慣れていない。

+1

あなたがFileReaderをの代わりにFileInputStreamのを使用している任意の理由は? FileInputStreamのドキュメントから:FileInputStreamは、画像データなどの生のバイトストリームを読み込むためのものです。文字のストリームを読み込むには、FileReaderの使用を検討してください。 – GoingTharn

+0

FileReaderがあなたのために改行を尊重/保存するので、私は尋ねました。 (私はjava.ioを使用してから8ヶ月も経ちましたが) – GoingTharn

答えて

2

基本的な問題は、Linuxが改行として\ n(改行)と\ n(改行)で構成されていることです。

により、システムの行区切り文字を取得するには:今

System.getProperty("line.separator"); 

あなたはつもりそれを置く質問を。クライアント側のセパレータを使ってファイルをクライアント側に保存する場合は、上記のapiを使用して行区切りを取得し、データを置き換えます。

サーバがどのサーバを使用しているのか分かりません(私は一般的なsolnのために行こうとしています)ので、両方のタイプのラインセパレータをクライアントサイドラインセパレータに置き換えてみてください。

1

Unixでは、改行文字は\nですが、Windowsの場合は\r\nとなります。したがって、毎回バッファを調べて、\nの前に\rを挿入することを検討できます。

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 
+0

私は少数の情報パケットを送信していた場合、私はこの解決策が好きです。しかし、最大300MBに達する可能性のあるファイルについては、約4kbのパケットでバイト配列を送信します。これらのオブジェクトを何千回もインスタンス化するオーバーヘッドは、私が思うところでは多少なりともです。私はそのアイディアが好きです。ありがとう! – Indigenuity

関連する問題