2012-01-18 6 views
2

자바 NIO Socketchannel을 사용하여 파일을 전송하는 간단한 클라이언트/서버를 작성했습니다. Linux에서 Windows로 간단한 텍스트 파일을 전송할 때 줄 바꿈은 모두 사라졌습니다. 두 운영 체제가 서로 다른 문자 인코딩을 사용한다는 것을 알고 있지만 프로세스의 어느 부분을 고려해야하는지 알아 내려고합니다.리눅스에서 창으로의 전송에서 줄 바꿈 문자가 사라짐

서버가 파일을 전송하면 그냥 원시 바이트를 보내고 FileInputStream으로 읽습니다.

클라이언트가 채널의 바이트를 ByteBuffer로 읽은 다음 바이트 배열을 가져옵니다.

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

: 바이트의 배열 내가 EOF를 찾고, 채널에서 더 받고, 내가 그것을 찾을 수없는 경우, 내가 파일에 넣을 때마다 통해

socketChannel.read(this.readBuffer); 

I 루프 나는 이것이 아마도 명백한 해결책을 가지고 있음을 알고 있지만, 관련된 모든 개념에 너무 익숙하지 않다.

+1

을 FileReader 대신에 당신이 FileInputStream에를 사용하는 이유라도? FileInputStream의 doc로부터 : FileInputStream는, 이미지 데이터 등의 raw 바이트의 스트림을 읽어 들이기 위해서 (때문에) 사용됩니다. 문자 스트림을 읽으려면 FileReader 사용을 고려하십시오. – GoingTharn

+0

FileReader가 개행 문자를 존중/보존하기 때문에 물어 보았습니다. (비록 내가 java.io를 사용한 이후로 8 개월 이상 지났음) – GoingTharn

답변

2

기본 문제는 리눅스가 줄 바꿈과 \ r (캐리지 리턴) 및 \ n (줄 바꿈)으로 구성된 창이 있다는 것입니다. 당신이 거 넣어 어디에 지금

System.getProperty("line.separator"); 

질문 :

에 의해 시스템의 행 분리를 얻으려면. 이제 클라이언트 쪽 줄 구분자를 사용하여 클라이언트 쪽에서 파일을 저장하려면 위의 api를 사용하여 줄 구분 기호를 가져 와서 데이터를 바꾸십시오.

클라이언트가 어떤 서버를 사용하고 있는지 (일반 솔루션을 찾으려고 노력하고 있습니다.) 줄을 구분할 수 없으므로 두 가지 유형의 줄 구분 기호를 클라이언트 쪽 줄 구분 기호로 바꾸십시오.

1

유닉스에서 줄 바꿈 문자는 \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