2010-04-23 1 views
3

FTP 서버에 연결하기 위해이 작은 테스트 클래스를 작성했습니다.FTP 서버 출력 및 악센트

-rw-r--r-- 1 ftp ftp   4700 Apr 30 2007 premier.java 
-rw-r--r-- 1 ftp ftp   88576 Oct 23 2007 Serie1_1.doc 
-rw-r--r-- 1 ftp ftp   1401 Nov 21 2006 tp20061121.txt 
drwxr-xr-x 1 ftp ftp    0 Apr 23 20:04 répertoire 

공지 사항 목록의 끝에있는 디렉토리의 이름 :

import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

public class FTPTest { 

    public static void main(String[] args) { 
     URL url = null; 

     try { 
      url = new URL("ftp://anonymous:[email protected]"); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 

     URLConnection conn = null; 

     try { 
      conn = url.openConnection(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     InputStream in = null; 

     try { 
      in = conn.getInputStream(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     BufferedInputStream bin = new BufferedInputStream(in); 
     int b; 

     try { 
      while ((b = bin.read()) != -1) { 
       char c = (char) b; 
       System.out.print("" + (char) b); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

여기에 출력합니다. 이중 문자 "é ©"대신 "é"(예 : 악센트가있는 e)가 있어야합니다.

이전에는 JSF와 관련하여 표준간에 혼합 된 문제가 있음을 상기시켜줍니다. 문자 인코딩에 대한 경험이 거의 없기 때문에 무슨 일이 일어나고 있는지 잘 모르겠습니다. 나는 서버 출력이 ASCII로되어 있다고 가정하므로 콘솔에서 올바르게 출력되도록 출력을 조정하는 방법은 무엇입니까?

답변

2

당신이 확실히 좋은 가사 승인 양식을하지 않습니다

char c = (char) b; 

를 사용 char들에 입력 스트림에서 byte의 변환 무차별이야.

Stream의 출력은 byte이고, 사용자는 char입니다. Reader s는 char 초이며 자동 및 제어 방식으로 문자 세트 번역을 수행합니다.

InputStreamReaderInputStream 주위에 포장해야합니다. InputStreamReader의 생성자를 사용하면 CharSet을 지정할 수 있으므로 변환을 제어 할 수 있습니다.

InputStreamReader에서 읽기는 물론 "실제"chars가됩니다. 또 다른 이점은 BufferedReaderInputStreamReader 주위에 랩핑 한 다음 readLine을 사용하여 한 번에 전체 줄을 (String) 읽을 수 있다는 것입니다.


편집 : 나는 무슨 뜻인지 설명하기 위해 "랩 어라운드"여기 몇 가지 (안된!) 아이디어를 설명하기 위해 코딩 :

BufferedReader br = new BufferedReader(new InputStreamReader(bin, "US-ASCII")); 
... 
String line = br.readLine(); 
+0

그래서 내가합니다. 그래서 이것은 자바의 문자가 유니 코드에 있다는 것을 의미합니다. 다양한 입력 클래스를 결합하는 데 대한 팁을 주셔서 감사합니다. 그건 사실 내가 가지고있는 또 다른 질문에 대답합니다. –

+0

예, Java 문자는 실제로 유니 코드입니다. 바이트를 문자로 변환 할 때는 기본적으로 해당 바이트를 ASCII 문자로 취급합니다. 나는 Java IO의 중대한 clunkiness에 대해 사과합니다. 여러 가지 목적으로 사용 가능한 여러 클래스가 있다는 것이 좋지만 일부 사람들은 상황이 복잡 할 필요가 있는지 궁금해합니다. –