Символ новой строки потерян при переносе из Linux в Windows - PullRequest
2 голосов
/ 19 января 2012

Я написал простой клиент / сервер в 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();

Я знаю, что это, вероятно, имеет очевидное решение для некоторых, но я не слишком знаком со всеми этими концепциями.

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Основная проблема заключается в том, что в Linux есть \ n в качестве новой строки и окон, состоящих из \ r (возврат каретки) и \ n (перевод строки).

Чтобы получить системный разделитель строк:

System.getProperty("line.separator");

Теперь вопрос, где ты это собираешься поставить. Теперь, если вы хотите сохранить файл на стороне клиента с разделителем строк на стороне клиента, используйте приведенный выше API для получения разделителя строк и замены в данных.

Поскольку на стороне клиента вы не знаете, какой сервер использует (я пытаюсь использовать универсальный soln) для отдельной строки, попробуйте заменить оба типа разделителей строк на разделители строк на стороне клиента.

1 голос
/ 19 января 2012

Строка записывается в файл:

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
1 голос
/ 19 января 2012

В Unix символом новой строки является символ \n, а в Windows - пара \r\n. Таким образом, вы можете каждый раз просматривать буфер и вставлять \r перед \n.

...