2010-04-23 26 views
3

我已經寫了這個小測試類來連接到FTP服務器。FTP服務器輸出和口音

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(); 
     } 
    } 
} 

下面是輸出:

-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 

注意在列表的末尾目錄的名稱。應該有一個「é」(e用尖銳的重音)而不是雙重字符「Ã」。

這讓我想起以前JSF遇到的一個問題,標準之間有混淆。我對字符編碼沒有經驗,但我不確定發生了什麼。我假設服務器輸出是ASCII格式的,那麼如何調整輸出以使其在控制檯中正確顯示?

回答

2

你使用

char c = (char) b; 

這絕對不是好管家覈定表蠻力從輸入流轉換byte s轉換char秒。

Stream s遞送byte s,並且您想要char s。 Reader s提供char s,並將以自動和受控的方式爲您做字符集轉換。

您應該圍繞InputStream包裝InputStreamReaderInputStreamReader的構造函數允許你指定一個CharSet,它可以讓你控制翻譯。

InputStreamReader讀取當然會產生「真實的」char s。另一個好處是您可以圍繞InputStreamReader打包BufferedReader,然後使用readLine一次讀取整行(到String)。


編輯:爲了說明我的意思是「環繞」,這裏的一些(未經測試!)編碼來說明這個想法:

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

所以我。所以這意味着Java中的字符是Unicode的。感謝您結合不同輸入類的提示。這實際上回答了我的另一個問題。 – 2010-04-24 15:49:40

+0

是的,Java字符確實是Unicode。當您將字節轉換爲字符時,您基本上將這些字節視爲ASCII字符。我有點爲Java的IO的嚴重笨拙道歉。很高興有不同的類可用於這麼多目的,但有些人想知道事情是否需要像現在這樣複雜。 – 2010-04-24 16:14:44