我已经编写了这个小测试类来连接到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格式,那么如何调整输出以使其在控制台中正确显示?
答案 0 :(得分:2)
您使用
强行将byte
从输入流转换为char
s
char c = (char) b;
这绝对不是Good Housekeeping批准的表格。
Stream
传递byte
,您需要char
s。 Reader
传递char
并以自动和受控的方式为您进行字符集翻译。
您应该在InputStreamReader
周围包裹InputStream
。 InputStreamReader
的构造函数允许您指定CharSet
,以便您控制翻译。
从InputStreamReader
阅读当然会产生“真实”char
。另一个好处是,您可以在BufferedReader
周围包裹InputStreamReader
,然后使用String
一次读取整行(readLine
)。
编辑:为了说明“环绕式”的含义,这里有一些(未经测试的!)编码来说明这个想法:
BufferedReader br = new BufferedReader(new InputStreamReader(bin, "US-ASCII"));
...
String line = br.readLine();