FTPサーバー上の中国語名ファイルのダウンロード後に空になる問題を解決する

2957 ワード

1台のサーバーがあって、コードはGBKで、サーバーの上の中国語のファイルがダウンロードした後にファイルの大きさが0であることを発見して、開いて空白になります.
調査によると、ファイル名の符号化フォーマットが間違っているため、中国語の場合、FTPClientを使用する場合、符号化フォーマットはISO-8859-1を使用する必要がある.
package com.neusoft.ftptest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class FtpMain {

	public static void main(String[] args) {
		FTPClient client = new FTPClient();
		try {
			client.connect("10.10.xxx.xxx", 21);
			client.login("administrator", "xxx");
			System.out.println(client.getControlEncoding());
			int reply = client.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				client.disconnect();
				System.out.println("Login error");
				return;
			}
			client.setControlEncoding("GBK");
			// client.segt

			System.out.println(client.getCharsetName());
			// client.enterRemotePassiveMode();
			client.enterLocalPassiveMode();
			client.changeWorkingDirectory("11_COMMUNICATION/201204");

			System.out.println("---------------------------------------");

			String[] names;

			names = client.listNames();
			for (int i = 0; i < names.length; i++) {
				System.out.println(names[i]);
			}
			System.out.println(names.toString());

			System.out.println("---------------------------------------");

			FTPFile f = client.listFiles()[0];
			System.out.println(f.getLink());
			client.changeWorkingDirectory("/");
			String path = "/10_NOTICE_FILE/201706";
			// String path = "/10_NOTICE_FILE/201203/";

			client.setBufferSize(1024);
			client.setFileType(FTP.BINARY_FILE_TYPE);
			client.enterLocalPassiveMode();
			client.changeWorkingDirectory(path);

			FTPFile[] fs = client.listFiles();
			FileOutputStream out = null;
			InputStream in = null;
			for (int i = 0; i < fs.length; i++) {
				FTPFile ff = fs[i];
				String outFileName = ff.getName();
				System.out.println(outFileName);

				//           
				File localFile = new File("D:\\ftp\\" + ff.getName());
				OutputStream fos = new FileOutputStream(localFile);
				// ftp   ISO-8859-1    
				String localFileName = new String(ff.getName().getBytes("GBK"), "ISO-8859-1");
				client.retrieveFile(localFileName, fos);
				fos.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			try {
				client.disconnect();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}