直接上代码,亲测可用:
需要下面这个pom:
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
import com.csvreader.CsvReader;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.nio.charset.Charset;
import java.util.ArrayList;
public class FtpUtil {
/**
* 打开FTP服务链接
* @param ftpHost
* @param ftpPort
* @param ftpUserName
* @param ftpPassword
*/
public static FTPClient getFTPClient(String ftpHost, Integer ftpPort, String ftpUserName, String ftpPassword){
FTPClient ftpClient = null;
try {
ftpClient = new FTPClient();
ftpClient.setConnectTimeout(60000);
if(ftpPort != null){
ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
}else {
ftpClient.connect(ftpHost);// 连接FTP服务器
}
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
if (ftpClient.login(ftpUserName, ftpPassword)) {// 登陆FTP服务器
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
"OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
ftpClient.setControlEncoding("UTF-8");
}else {
ftpClient.setControlEncoding("GBK");
}
ftpClient.enterLocalPassiveMode();// 设置被动模式
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置传输的模式,以二进制流的方式读取
ftpClient.enterLocalPassiveMode();
System.out.println("FTP服务连接成功!");
}else {
System.out.println("FTP服务用户名或密码错误!");
disConnection(ftpClient);
}
}else {
System.out.println("连接到FTP服务失败!");
disConnection(ftpClient);
}
} catch (SocketException e) {
e.printStackTrace();
disConnection(ftpClient);
System.out.println("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
disConnection(ftpClient);
System.out.println("FTP的端口错误,请正确配置。");
}
return ftpClient;
}
/**
* 关闭FTP服务链接
* @throws IOException
*/
public static void disConnection(FTPClient ftpClient){
try {
if(ftpClient.isConnected()){
ftpClient.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static ArrayList<String[]> readCsvFile(InputStream in){
ArrayList<String[]> csvList = new ArrayList<String[]>();
if (null != in) {
CsvReader reader = new CsvReader(in, ',', Charset.forName("UTF-8"));
try {
//遍历每一行,若有#注释部分,则不处理,若没有,则加入csvList
while (reader.readRecord()) {
if (!reader.getValues()[0].contains("#"))// 清除注释部分
{
//获取的为每一行的信息,以数组的形式
csvList.add(reader.getValues());
}
}
} catch (IOException e) {
e.printStackTrace();
}
reader.close();
}
return csvList;
}
/**
* 获取文件夹下的所有文件信息
* @param path 文件路径
*/
public static Integer getFTPFile(FTPClient ftpClient, String path, String fileName){
InputStream in = null;
Integer cnt=0;
try {
ftpClient.setControlEncoding("GBK");
ftpClient.changeWorkingDirectory(path);
ftpClient.enterLocalPassiveMode();
FTPFile[] files = ftpClient.listFiles(path);
if(files.length==0){
System.out.println("无法找到目录");
}
for (int i = 0; files != null && i < files.length; i++) {
if (files[i].getName().contains(fileName)) {
in = ftpClient.retrieveFileStream(files[i].getName());
ArrayList<String[]> csvList = readCsvFile(in);
//获取第一行的统计数
String[] x = csvList.get(0);
String ftpSharedCnt=x[0];
cnt= Integer.parseInt(ftpSharedCnt);
/*for (int row = 0; row < csvList.size(); row++) {
// 遍历每一行中的每一列
for (int j = 0; j < csvList.get(row).length; j++) {
System.out.print(csvList.get(0)[0] + "\t|");
}
System.out.println();
}*/
}
}
}catch (Exception e){
e.printStackTrace();
System.out.println("FTP读取数据异常!");
}finally {
//关闭连接
disConnection(ftpClient);
}
return cnt;
}
public static void main(String args[]){
InputStream in = null;
BufferedReader br = null;
try{
//相对路径
String path = "/lz";
//读取单个文件
FTPClient ftpClient = getFTPClient("10.1.80.19",21,"tech","tech@2021");
String fileName = "test.csv";
getFTPFile(ftpClient,path,fileName);
//关闭连接
disConnection(ftpClient);
}catch (Exception e){
e.printStackTrace();
}finally {
try{
//关闭流
if (br != null)
br.close();
if (in != null)
in.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}