2010-04-23 4 views
3

J'ai écrit cette petite classe de test pour me connecter à un serveur FTP.Sortie et accents du serveur 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(); 
     } 
    } 
} 

est ici la sortie:

-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 

Notez que le nom du répertoire à la fin de la liste. Il devrait y avoir un "é" (e avec accent aigu) au lieu du double caractère "Ã ©". Cela me rappelle un problème rencontré précédemment avec JSF où il y avait un mélange entre les normes. J'ai peu d'expérience avec l'encodage de caractères, donc je ne suis pas sûr de ce qui se passe. Je suppose que la sortie du serveur est en ASCII alors comment puis-je adapter la sortie afin qu'elle apparaisse correctement dans la console?

Répondre

2

Vous n'êtes plus la force brute conversion byte s à partir du flux d'entrée en char s en utilisant

char c = (char) b; 

C'est certainement pas le Good Housekeeping forme approuvée.

Stream s livrer byte s, et vous voulez char s. Reader s livrer char s et fera la traduction de jeu de caractères pour vous de manière automatique et contrôlée. Vous devez placer un InputStreamReader autour du InputStream. Le constructeur pour InputStreamReader vous permet de spécifier un CharSet, ce qui vous permettra de contrôler la traduction.

La lecture à partir de InputStreamReader donnera bien sûr "réel" char s. Un autre avantage est que vous pouvez envelopper un BufferedReader autour du InputStreamReader, puis lire des lignes entières à la fois (dans un String) en utilisant readLine.


EDIT: Pour illustrer ce que je veux dire par "enrouler autour", voici quelques (non testé!) Codant pour illustrer l'idée:

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

Je suis. Cela signifie donc que les caractères Java sont en Unicode. Merci pour le conseil sur la combinaison de différentes classes d'entrée. Cela répond à une autre question que j'avais. –

+0

Oui, les caractères Java sont en effet Unicode. Lorsque vous convertissez des octets en caractères, vous traitez essentiellement ces octets comme des caractères ASCII. Je m'excuse en quelque sorte pour le grave clunkiness des IO de Java. C'est bien qu'il y ait différentes classes disponibles à de nombreuses fins, mais certaines personnes se demandent si les choses doivent être aussi complexes qu'elles le sont. –

Questions connexes