Вывод FTP-сервера и акценты - PullRequest
3 голосов
/ 23 апреля 2010

Я написал этот небольшой тестовый класс для подключения к 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:Password@127.0.0.1");
        } 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, так как мне настроить вывод так, чтобы он правильно отображался в консоли?

1 Ответ

2 голосов
/ 23 апреля 2010

Вы просто переворачиваете byte с из входного потока в char с, используя

char c = (char) b;

Это определенно не утвержденная форма Good Housekeeping.

Stream с доставить byte с, и вы хотите char с. Reader s доставит char s и выполнит для вас перевод набора символов в автоматическом и управляемом режиме.

Вы должны обернуть InputStreamReader вокруг InputStream. Конструктор для InputStreamReader позволяет вам указать CharSet, который позволит вам контролировать перевод.

Чтение из InputStreamReader, конечно, даст "реальные" char с. Еще одним преимуществом является то, что вы можете обернуть BufferedReader вокруг InputStreamReader и затем читать целые строки за раз (в String), используя readLine.


РЕДАКТИРОВАТЬ: Чтобы проиллюстрировать, что я подразумеваю под «обтеканием», вот несколько (непроверенных!) Кодов, иллюстрирующих идею:

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