Java:JAVA通过FTP协议与IO流远程编辑文件

应用场景:鉴于某些硬件设备的通信协议较为复杂,而其功能又依托底层文件实现。考虑直接修改其底层文件的方式来实现业务(安全性将再从网络与框架层面考虑)。

一、将需要修改的文件地址发布为FTP站点

1.开启Windows功能

FTP服务器.png
TFTP客户端.png

2.通过ISS创建FTP站点

新建站点.png
连接方式.png
验证.png

3.创建用户

创建用户.png

二、Java代码实现

1.maven

<!-- FTP 协议-->
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.6</version>
    </dependency>

2.常用方法

package com.enjoyor.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * FTP协议工具类
 * @author LuoJiaLei
 *
 */
public class FTPUtil {

    /**
     * ftp登录验证
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:12  
     * @version V1.0  
     * @param ftpIP           ftp站点 IP地址
     * @param ftpPort         ftp站点 端口
     * @param ftpUserName     ftp站点 登录用户名
     * @param ftpPassword     ftp站点 密码
     * @return FTPClient      ftp客户端连接信息
     */
    public static synchronized FTPClient FTPConnect(String ftpIP, int ftpPort,String ftpUserName, String ftpPassword) {
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding("UTF-8");// 解决上传文件时文件名乱码
        int reply = 0;
        try {
            // 连接至服务器
            ftpClient.connect(ftpIP, ftpPort);
            // 登录服务器
            ftpClient.login(ftpUserName, ftpPassword);
            // 登陆成功,返回码是230
            reply = ftpClient.getReplyCode();
            // 判断返回码是否合法
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                System.out.println("未连接到FTP,用户名或密码错误。");
                ftpClient = null;
            } else {
                System.out.println("FTP连接成功。");
            }
        } catch (SocketException e) {
            ftpClient = null;
            System.out.println("FTP的端口错误,请正确配置。");
            e.printStackTrace();
        } catch (IOException e) {
            ftpClient = null;
            System.out.println("FTP的IP地址可能错误,请正确配置。");
            e.printStackTrace();
        }
        return ftpClient;
    }
    /**
     * 判断服务器路径是否存在
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:34  
     * @version V1.0  
     * @param path         路径 
     * @param ftpClient    ftp客户端连接信息
     * @return boolean
     */
    public static boolean FTPExistPath(String filePath, FTPClient ftpClient) {
        boolean flag = false;
        FTPFile[] ftpFileArr;
        try {
            //设置被动模式 linux环境下listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            ftpFileArr = ftpClient.listFiles(filePath);
            if (ftpFileArr.length > 0) {
                flag = true;
                System.out.println("文件存在");
            } else {
                System.out.println("文件不存在");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 判断服务器文件是否存在
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:34  
     * @version V1.0  
     * @param path         路径 
     * @param ftpClient    ftp客户端连接信息
     * @return boolean
     */
    public static boolean FTPExistFile(String filePath,String fileName, FTPClient ftpClient) {
        boolean flag = false;
        try {
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(filePath);
            // 检验文件是否存在
            InputStream is = ftpClient.retrieveFileStream(fileName);
            if(is == null || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE){
                return false;
            }
            if(is != null){
                is.close();
                ftpClient.completePendingCommand();
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 删除ftp文件 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:50:33  
     * @version V1.0  
     * @param filePath    文件路径
     * @param fileName    文件名
     * @param ftpClient   ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPDeleteFile(String filePath,String fileName, FTPClient ftpClient) {
        boolean flag = false;
        try {
            System.out.println("开始删除文件");
            // 切换FTP目录
            //设置被动模式 linux环境listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(filePath);
            ftpClient.dele(fileName);
            /*ftpClient.logout();*/
            flag = true;
            System.out.println("删除文件成功");
        } catch (Exception e) {
            System.out.println("删除文件失败");
            e.printStackTrace();
        } 
        return flag;
    }
    /**
     * 下载ftp文件到本地
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:12  
     * @version V1.0  
     * @param filePath      文件路径
     * @param fileName      文件名
     * @param localPath     本地路径
     * @param ftpClient     ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPDownload(String filePath,String fileName, String localPath, FTPClient ftpClient) {
        boolean flag = false;
        try {
            //设置被动模式 linux环境listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            // 转移到FTP服务器目录至指定的目录下
            ftpClient.changeWorkingDirectory(filePath);
            // 获取文件列表
            FTPFile[] fs = ftpClient.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(localPath + ff.getName());
                    OutputStream is = new FileOutputStream(localFile);
                    ftpClient.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }
            /*ftpClient.logout();*/
            flag = true;
            System.out.println("下载文件:" + fileName + " 成功");
        } catch (IOException e) {
            System.out.println("下载文件:" + fileName + " 失败");
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 本地上传文件到ftp
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:23  
     * @version V1.0  
     * @param filePath      文件路径
     * @param fileName      文件名
     * @param localPath     本地路径
     * @param ftpClient     ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPUpload(String filePath,String fileName, String localPath, FTPClient ftpClient) {
        boolean flag = false;
        try {
            // 转移工作目录至指定目录下
            boolean change = ftpClient.changeWorkingDirectory(filePath);
            // 设置1M缓冲
            ftpClient.setBufferSize(1024);
            // 设置被动模式
            ftpClient.enterLocalPassiveMode();
            // 设置以二进制方式传输
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            FileInputStream in = new FileInputStream(new File(localPath
                    + fileName));
            if (change) {
                flag = ftpClient.storeFile(fileName, in);
                if (flag) {
                    System.out.println("上传文件:" + fileName + " 成功");
                } else {
                    System.out.println("上传文件:" + fileName + " 失败");
                }
            }
            in.close();
            /*ftpClient.logout();*/
        } catch (IOException e) {
            flag = false;
            System.out.println("上传文件:" + fileName + " 失败");
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 断开远程服务器连接 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:39  
     * @version V1.0  
     * @param ftpClient void
     */
    public static synchronized boolean FTPDisConnect(FTPClient ftpClient) {
        boolean flag=false;
        if (ftpClient != null && ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
                flag=true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }
    /**
     * 查看文件内是否已有命令  
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:59  
     * @version V1.0  
     * @param localPath     本地路径
     * @param fileName      文件名
     * @param orderId       命令ID
     * @return String 
     */
    public static String queryPlanInFile(String localPath, String fileName,String orderId) {
        String result = "";
        try {
            FileReader file = new FileReader(localPath + fileName);
            BufferedReader br = new BufferedReader(file);
            LineNumberReader reader = new LineNumberReader(br);
            String str = null;
            while ((str = reader.readLine()) != null) {
                if (str.indexOf(orderId+":") == 0) {
                    result += str + "\r\n";
                    while ((str = reader.readLine()) != null) {
                        if ("".equals(str)) {
                            break;
                        }
                        result += str + "\r\n";
                    }
                    break;
                }
            }
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 添加命令到已有文件末尾
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:52:16  
     * @version V1.0  
     * @param localPath     本地路径
     * @param fileName      文件名
     * @param orderId       命令ID
     * @param planOrder     命令内容
     * @return boolean
     */
    public static boolean addPlanAppendFile(String localPath, String fileName,String planOrder) {
        boolean flag = false;
        File file = new File(localPath + fileName);
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        try {
            if (!file.exists()) {
                boolean hasFile = file.createNewFile();
                if (hasFile) {
                    System.out.println("文件不存在,请创建该文件");
                }
                fos = new FileOutputStream(file);
            } else {
                fos = new FileOutputStream(file, true);
            }
            osw = new OutputStreamWriter(fos, "UTF-8");
            osw.write(planOrder);
            flag = true;
            System.out.println("写入内容成功");
        } catch (Exception e) {
            flag = false;
            System.out.println("写入内容失败");
            e.printStackTrace();
        } finally {
            // 关闭流
            try {
                if (osw != null) {
                    osw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }
    /**
     * 替换原有的命令 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:52:54  
     * @version V1.0  
     * @param localPath      文件路径
     * @param fileName       文件名
     * @param originalOrder       需修改的命令
     * @param planOrder      命令内容
     * @return boolean
     */
    public static boolean replacePlanInFile(String localPath, String fileName,String originalOrder, String planOrder) {
        boolean flag = false;
        try {
            FileReader file = new FileReader(localPath + fileName); // 创建文件输入流
            BufferedReader br = new BufferedReader(file);
            char[] data = new char[1024]; // 创建缓冲字符数组
            int rn = 0;
            StringBuilder sb = new StringBuilder(); // 创建字符串构建器
            // fis.read(data):将字符读入数组。在某个输入可用、发生 I/O
            // 错误或者已到达流的末尾前,此方法一直阻塞。读取的字符数,如果已到达流的末尾,则返回 -1
            while ((rn = file.read(data)) > 0) { // 读取文件内容到字符串构建器
                String str = String.valueOf(data, 0, rn);// 把数组转换成字符串
                sb.append(str);
            }
            file.close();// 关闭输入流
            // 从构建器中生成字符串,并替换搜索文本
            String str = sb.toString().replace(originalOrder, planOrder);
            str=str.replaceAll("(?m)^\\s*$"+System.lineSeparator(), "\r\n"); //移除多余空行
            FileWriter fout = new FileWriter(localPath + fileName);// 创建文件输出流
            fout.write(str.toCharArray());// 把替换完成的字符串写入文件内
            fout.close();// 关闭输出流
            flag = true;
        } catch (FileNotFoundException e) {
            System.out.println("未找到文件");
            e.printStackTrace();
            flag = false;
        } catch (IOException e) {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }
    /**
     * 删除本地文件
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:53:13  
     * @version V1.0  
     * @param localPath    本地路径
     * @param fileName     文件名
     * @return boolean
     */
    public static boolean removeLocalFile(String localPath, String fileName) {
        boolean flag = false;
        File file = new File(localPath + fileName);
        if (!file.exists()) {
            flag = false;
        } else {
            file.delete();
            flag = true;
        }
        return flag;
    }

}
linux版本:、 区别点:

1、读数据时候的换行符区别

2、ftpclient的被动模式设置,linux的某些端口问题

关键语法

str=str.replaceAll(System.lineSeparator(), "\r\n");   //转换换行符
str=str.replaceAll("(\r\n){3,}", "\r\n\r\n"); //移除多余空行


// 设置被动模式
ftpClient.enterLocalPassiveMode();
package com.enjoyor.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * FTP协议工具类用于linux系统
 * @author LuoJiaLei
 *
 */
public class FTPUtilLinux {

    /**
     * ftp登录验证
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:12  
     * @version V1.0  
     * @param ftpIP           ftp站点 IP地址
     * @param ftpPort         ftp站点 端口
     * @param ftpUserName     ftp站点 登录用户名
     * @param ftpPassword     ftp站点 密码
     * @return FTPClient      ftp客户端连接信息
     */
    public static synchronized FTPClient FTPConnect(String ftpIP, int ftpPort,String ftpUserName, String ftpPassword) {
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding("UTF-8");// 解决上传文件时文件名乱码
        int reply = 0;
        try {
            // 连接至服务器
            ftpClient.connect(ftpIP, ftpPort);
            // 登录服务器
            ftpClient.login(ftpUserName, ftpPassword);
            // 登陆成功,返回码是230
            reply = ftpClient.getReplyCode();
            // 判断返回码是否合法
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                System.out.println("未连接到FTP,用户名或密码错误。");
                ftpClient = null;
            } else {
                System.out.println("FTP连接成功。");
            }
        } catch (SocketException e) {
            ftpClient = null;
            System.out.println("FTP的端口错误,请正确配置。");
            e.printStackTrace();
        } catch (IOException e) {
            ftpClient = null;
            System.out.println("FTP的IP地址可能错误,请正确配置。");
            e.printStackTrace();
        }
        return ftpClient;
    }
    /**
     * 判断服务器路径是否存在
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:34  
     * @version V1.0  
     * @param path         路径 
     * @param ftpClient    ftp客户端连接信息
     * @return boolean
     */
    public static boolean FTPExistPath(String filePath, FTPClient ftpClient) {
        boolean flag = false;
        FTPFile[] ftpFileArr;
        try {
            //设置被动模式 linux环境下listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            ftpFileArr = ftpClient.listFiles(filePath);
            if (ftpFileArr.length > 0) {
                flag = true;
                System.out.println("文件存在");
            } else {
                System.out.println("文件不存在");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 判断服务器文件是否存在
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:34  
     * @version V1.0  
     * @param path         路径 
     * @param ftpClient    ftp客户端连接信息
     * @return boolean
     */
    public static boolean FTPExistFile(String filePath,String fileName, FTPClient ftpClient) {
        boolean flag = false;
        try {
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(filePath);
            // 检验文件是否存在
            InputStream is = ftpClient.retrieveFileStream(fileName);
            if(is == null || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE){
                return false;
            }
            if(is != null){
                is.close();
                ftpClient.completePendingCommand();
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 删除ftp文件 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:50:33  
     * @version V1.0  
     * @param filePath    文件路径
     * @param fileName    文件名
     * @param ftpClient   ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPDeleteFile(String filePath,String fileName, FTPClient ftpClient) {
        boolean flag = false;
        try {
            System.out.println("开始删除文件");
            // 切换FTP目录
            //设置被动模式 linux环境listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(filePath);
            ftpClient.dele(fileName);
            /*ftpClient.logout();*/
            flag = true;
            System.out.println("删除文件成功");
        } catch (Exception e) {
            System.out.println("删除文件失败");
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 下载ftp文件到本地
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:12  
     * @version V1.0  
     * @param filePath      文件路径
     * @param fileName      文件名
     * @param localPath     本地路径
     * @param ftpClient     ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPDownload(String filePath,String fileName, String localPath, FTPClient ftpClient) {
        boolean flag = false;
        try {
            //设置被动模式 linux环境listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            // 转移到FTP服务器目录至指定的目录下
            ftpClient.changeWorkingDirectory(filePath);
            // 获取文件列表
            FTPFile[] fs = ftpClient.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(localPath + ff.getName());
                    OutputStream is = new FileOutputStream(localFile);
                    ftpClient.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }
            /*ftpClient.logout();*/
            flag = true;
            System.out.println("下载文件:" + fileName + " 成功");
        } catch (IOException e) {
            flag = false;
            System.out.println("下载文件:" + fileName + " 失败");
            e.printStackTrace();
        } 
        return flag;
    }
    /**
     * 本地上传文件到ftp
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:23  
     * @version V1.0  
     * @param filePath      文件路径
     * @param fileName      文件名
     * @param localPath     本地路径
     * @param ftpClient     ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPUpload(String filePath,String fileName, String localPath, FTPClient ftpClient) {
        boolean flag = false;
        try {
            //换行符转换
            FileReader file = new FileReader(localPath + fileName);
            BufferedReader br = new BufferedReader(file);
            char[] data = new char[1024];
            int rn = 0;
            StringBuilder sb = new StringBuilder(); 
            while ((rn = file.read(data)) > 0) { 
                String str = String.valueOf(data, 0, rn);
                sb.append(str);
            }
            file.close();
            String str=sb.toString();
            str=str.replaceAll(System.lineSeparator(), "\r\n");   //转换换行符
            str=str.replaceAll("(\r\n){3,}", "\r\n\r\n"); //移除多余空行
            FileWriter fout = new FileWriter(localPath + fileName);
            fout.write(str.toCharArray());
            fout.close();
            // 转移工作目录至指定目录下
            boolean change = ftpClient.changeWorkingDirectory(filePath);
            // 设置1M缓冲
            ftpClient.setBufferSize(1024);
            // 设置被动模式
            ftpClient.enterLocalPassiveMode();
            // 设置以二进制方式传输
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            FileInputStream in = new FileInputStream(new File(localPath
                    + fileName));
            if (change) {
                flag = ftpClient.storeFile(fileName, in);
                if (flag) {
                    System.out.println("上传文件:" + fileName + " 成功");
                } else {
                    System.out.println("上传文件:" + fileName + " 失败");
                }
            }
            in.close();
            /*ftpClient.logout();*/
        } catch (IOException e) {
            flag = false;
            System.out.println("上传文件:" + fileName + " 失败");
            e.printStackTrace();
        } 
        return flag;
    }
    /**
     * 断开远程服务器连接 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:39  
     * @version V1.0  
     * @param ftpClient void
     */
    public static synchronized boolean FTPDisConnect(FTPClient ftpClient) {
        boolean flag=false;
        if (ftpClient != null && ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
                flag=true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }
    /**
     * 查看文件内是否已有命令  
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:59  
     * @version V1.0  
     * @param localPath     本地路径
     * @param fileName      文件名
     * @param orderId       命令ID
     * @return String 
     */
    public static String queryPlanInFile(String localPath, String fileName,String orderId) {
        String result = "";
        try {
            FileReader file = new FileReader(localPath + fileName);
            BufferedReader br = new BufferedReader(file);
            LineNumberReader reader = new LineNumberReader(br);
            String str = null;
            while ((str = reader.readLine()) != null) {
                if (str.indexOf(orderId+":") == 0) {
                    result += str + "\n";
                    while ((str = reader.readLine()) != null) {
                        if ("".equals(str)) {
                            break;
                        }
                        result += str + "\n";
                    }
                    break;
                }
            }
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 添加命令到已有文件末尾
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:52:16  
     * @version V1.0  
     * @param localPath     本地路径
     * @param fileName      文件名
     * @param orderId       命令ID
     * @param planOrder     命令内容
     * @return boolean
     */
    public static boolean addPlanAppendFile(String localPath, String fileName, String planOrder) {
        boolean flag = false;
        File file = new File(localPath + fileName);
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        try {
            if (!file.exists()) {
                boolean hasFile = file.createNewFile();
                if (hasFile) {
                    System.out.println("文件不存在,请创建该文件");
                }
                fos = new FileOutputStream(file);
            } else {
                fos = new FileOutputStream(file, true);
            }
            osw = new OutputStreamWriter(fos, "UTF-8");
            osw.write(planOrder);
            flag = true;
            System.out.println("写入内容成功");
        } catch (Exception e) {
            flag = false;
            System.out.println("写入内容失败");
            e.printStackTrace();
        } finally {
            // 关闭流
            try {
                if (osw != null) {
                    osw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }
    /**
     * 替换原有的命令 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:52:54  
     * @version V1.0  
     * @param localPath      文件路径
     * @param fileName       文件名
     * @param oriOrder       需修改的命令
     * @param planOrder      命令内容
     * @return boolean
     */
    public static boolean replacePlanInFile(String localPath, String fileName,String oriOrder, String planOrder) {
        boolean flag = false;
        try {
            FileReader file = new FileReader(localPath + fileName); // 创建文件输入流
            BufferedReader br = new BufferedReader(file);
            char[] data = new char[1024]; // 创建缓冲字符数组
            int rn = 0;
            StringBuilder sb = new StringBuilder(); // 创建字符串构建器
            // fis.read(data):将字符读入数组。在某个输入可用、发生 I/O
            // 错误或者已到达流的末尾前,此方法一直阻塞。读取的字符数,如果已到达流的末尾,则返回 -1
            while ((rn = file.read(data)) > 0) { // 读取文件内容到字符串构建器
                String str = String.valueOf(data, 0, rn);// 把数组转换成字符串
                sb.append(str);
            }
            file.close();// 关闭输入流
            // 从构建器中生成字符串,并替换搜索文本
            String str = sb.toString().replace(oriOrder, planOrder);
            FileWriter fout = new FileWriter(localPath + fileName);// 创建文件输出流
            fout.write(str.toCharArray());// 把替换完成的字符串写入文件内
            fout.close();// 关闭输出流
            flag = true;
        } catch (FileNotFoundException e) {
            System.out.println("未找到文件");
            e.printStackTrace();
            flag = false;
        } catch (IOException e) {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }
    /**
     * 删除本地文件
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:53:13  
     * @version V1.0  
     * @param localPath    本地路径
     * @param fileName     文件名
     * @return boolean
     */
    public static boolean removeLocalFile(String localPath, String fileName) {

        boolean flag = false;
        File file = new File(localPath + fileName);
        if (!file.exists()) {
            flag = false;
        } else {
            file.delete();
            flag = true;
        }
        return flag;
    }
}
针对中文编码乱码问题的修改

package com.enjoyor.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * FTP协议工具类用于linux系统
 * @author LuoJiaLei
 *
 */
public class FTPUtilLinux {

    private static final Logger logger = LoggerFactory.getLogger(FTPUtilLinux.class);
    /**
     * ftp登录验证
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:12  
     * @version V1.0  
     * @param ftpIP           ftp站点 IP地址
     * @param ftpPort         ftp站点 端口
     * @param ftpUserName     ftp站点 登录用户名
     * @param ftpPassword     ftp站点 密码
     * @return FTPClient      ftp客户端连接信息
     */
    public static synchronized FTPClient FTPConnect(String ftpIP, int ftpPort,String ftpUserName, String ftpPassword) {
        FTPClient ftpClient = new FTPClient();
        // 解决上传文件时文件名与中文路径乱码
        ftpClient.setControlEncoding("iso-8859-1");
        int reply = 0;
        try {
            // 连接至服务器
            ftpClient.connect(ftpIP, ftpPort);
            // 登录服务器
            ftpClient.login(ftpUserName, ftpPassword);
            // 登陆成功,返回码是230
            reply = ftpClient.getReplyCode();
            // 判断返回码是否合法
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                logger.info("未连接到FTP,用户名或密码错误。");
                ftpClient = null;
            } else {
                logger.info("FTP连接成功。");
            }
        } catch (SocketException e) {
            ftpClient = null;
            logger.info("FTP的端口错误,请正确配置。");
            e.printStackTrace();
        } catch (IOException e) {
            ftpClient = null;
            logger.info("FTP的IP地址错误,请正确配置。");
            e.printStackTrace();
        }
        return ftpClient;
    }
    /**
     * 判断服务器路径是否存在
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:34  
     * @version V1.0  
     * @param path         路径 
     * @param ftpClient    ftp客户端连接信息
     * @return boolean
     */
    public static boolean FTPExistPath(String filePath, FTPClient ftpClient) {
        boolean flag = false;
        FTPFile[] ftpFileArr;
        try {
            //设置被动模式 linux环境下listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            ftpFileArr = ftpClient.listFiles(filePath);
            if (ftpFileArr.length > 0) {
                flag = true;
                logger.info("文件存在");
            } else {
                logger.info("文件不存在");
            }
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPExistPath() -> 路径读取异常");
        }
        return flag;
    }
    /**
     * 判断服务器文件是否存在
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:49:34  
     * @version V1.0  
     * @param path         路径 
     * @param ftpClient    ftp客户端连接信息
     * @return boolean
     */
    public static boolean FTPExistFile(String filePath,String fileName, FTPClient ftpClient) {
        boolean flag = false;
        InputStream is = null;
        try {
            // 设置被动模式 linux环境下listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(filePath);
            // 检验文件是否存在
            is = ftpClient.retrieveFileStream(fileName);
            if (is == null
                    || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE) {
                return false;
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPExistFile() -> 文件流读取异常");
        } finally {
            try {
                if (is != null) {
                    is.close();
                    ftpClient.completePendingCommand();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
                logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPExistFile() -> 文件流关闭异常");
            }
        }
        return flag;
    }
    /**
     * 删除ftp文件 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:50:33  
     * @version V1.0  
     * @param filePath    文件路径
     * @param fileName    文件名
     * @param ftpClient   ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPDeleteFile(String filePath,String fileName, FTPClient ftpClient) {
        boolean flag = false;
        try {
            // 设置被动模式 linux环境listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            // 切换FTP目录
            ftpClient.changeWorkingDirectory(filePath);
            ftpClient.dele(fileName);
            logger.info("删除文件成功");
            return true;
        } catch (Exception e) {
            logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPDeleteFile() -> 删除文件失败");
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 下载ftp文件到本地
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:12  
     * @version V1.0  
     * @param filePath      文件路径
     * @param fileName      文件名
     * @param localPath     本地路径
     * @param ftpClient     ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPDownload(String filePath,String fileName, String localPath, FTPClient ftpClient) {
        boolean flag = false;
        try {
            // 设置被动模式 linux环境listFiles和retrieveFile方法报错解决方案
            ftpClient.enterLocalPassiveMode();
            // 转移到FTP服务器目录至指定的目录下
            ftpClient.changeWorkingDirectory(filePath);
            // 获取文件列表
            FTPFile[] fs = ftpClient.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(localPath + ff.getName());
                    OutputStream is = new FileOutputStream(localFile);
                    ftpClient.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }
            logger.info("下载文件:" + fileName + " 成功");
            return true;
        } catch (IOException e) {
            logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPDownload() -> 下载文件:" + fileName + " 失败");
            e.printStackTrace();
        }
        return flag;
    }
    /**
     * 本地上传文件到ftp
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:23  
     * @version V1.0  
     * @param filePath      文件路径
     * @param fileName      文件名
     * @param localPath     本地路径
     * @param ftpClient     ftp客户端连接信息
     * @return boolean
     */
    public static synchronized boolean FTPUpload(String filePath,String fileName, String localPath, FTPClient ftpClient) {
        boolean flag = false;
        InputStreamReader isr =null;
        BufferedReader br=null;
        Writer writer=null;
        FileInputStream in=null;
        try {
            // 以GBK编码读文件
            isr = new InputStreamReader(new FileInputStream(new File(localPath
                    + fileName)), "GBK");
            br = new BufferedReader(isr);
            StringBuilder sb = new StringBuilder();
            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line + System.lineSeparator());
            }
            String str = sb.toString();
            // 转换换行符
            str = str.replaceAll(System.lineSeparator(), "\r\n");
            // 移除多余空行
            str = str.replaceAll("(\r\n){3,}", "\r\n\r\n");
            // 以so-8859-1编码写文件
            writer = new OutputStreamWriter(new FileOutputStream(new File(
                    localPath + fileName)), "iso-8859-1");
            String strFinal = new String(str.getBytes("GBK"), "iso-8859-1");
            writer.write(strFinal.toCharArray());
            writer.close();
            // 转移工作目录至指定目录下
            boolean change = ftpClient.changeWorkingDirectory(filePath);
            // 设置1M缓冲
            ftpClient.setBufferSize(1024);
            // 设置被动模式
            ftpClient.enterLocalPassiveMode();
            // 设置以二进制方式传输
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            in = new FileInputStream(new File(localPath + fileName));
            if (change) {
                flag = ftpClient.storeFile(fileName, in);
                if (flag) {
                    logger.info("上传文件:" + fileName + " 成功");
                } else {
                    logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPUpload() -> 上传文件:"
                            + fileName + " 失败");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPUpload() -> 上传文件:"
                    + fileName + " 异常");
            return false;
        } finally {
            try {
                if (isr != null) {
                    isr.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
                logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPUpload() -> 读文件流 关闭异常");
            }
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
                logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPUpload() -> 上传文件流 关闭异常");
            }
        }
        return flag;
    }
    /**
     * 断开远程服务器连接 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:39  
     * @version V1.0  
     * @param ftpClient void
     */
    public static synchronized boolean FTPDisConnect(FTPClient ftpClient) {
        boolean flag=false;
        if (ftpClient != null && ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                logger.info("package com.enjoyor.utils -> FTPUtilLinux ->FTPDisConnect() -> 断开连接失败");
            }
        }
        return flag;
    }
    /**
     * 查看文件内是否已有命令  
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:51:59  
     * @version V1.0  
     * @param localPath     本地路径
     * @param fileName      文件名
     * @param orderId       命令ID
     * @return String 
     */
    public static String queryPlanInFile(String localPath, String fileName,String orderId) {
        String result = "";
        InputStreamReader isr =null;
        try {
            File file = new File(localPath + fileName);
            isr=new InputStreamReader(new FileInputStream(file), "GBK");
            BufferedReader br = new BufferedReader(isr);
            LineNumberReader reader = new LineNumberReader(br);
            String str = null;
            while ((str = reader.readLine()) != null) {
                if (str.indexOf(orderId+":") == 0) {
                    result += str + "\n";
                    while ((str = reader.readLine()) != null) {
                        if ("".equals(str)) {
                            break;
                        }
                        result += str + "\n";
                    }
                    break;
                }
            }
            isr.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 添加命令到已有文件末尾
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:52:16  
     * @version V1.0  
     * @param localPath     本地路径
     * @param fileName      文件名
     * @param orderId       命令ID
     * @param planOrder     命令内容
     * @return boolean
     */
    public static boolean addPlanAppendFile(String localPath, String fileName, String planOrder) {
        boolean flag = false;
        File file = new File(localPath + fileName);
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        try {
            if (!file.exists()) {
                boolean hasFile = file.createNewFile();
                if (hasFile) {
                    logger.info("文件不存在,请创建该文件");
                }
                fos = new FileOutputStream(file);
            } else {
                fos = new FileOutputStream(file, true);
            }
            // 将输入命令转换为iso-8859-1编码
            String planOrderFinal = new String(planOrder.getBytes("GBK"),
                    "iso-8859-1");
            // 将文件以iso-8859-1写入
            osw = new OutputStreamWriter(fos, "iso-8859-1");
            osw.write(planOrderFinal);
            logger.info("写入内容成功");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("package com.enjoyor.utils -> FTPUtilLinux ->addPlanAppendFile() -> 写入内容失败");
        } finally {
            // 关闭流
            try {
                if (osw != null) {
                    osw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                logger.info("package com.enjoyor.utils -> FTPUtilLinux ->addPlanAppendFile() -> 写文件流 关闭失败");
            }
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                logger.info("package com.enjoyor.utils -> FTPUtilLinux ->addPlanAppendFile() -> 读文件流 关闭失败");
            }
        }
        return flag;
    }
    /**
     * 替换原有的命令 
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:52:54  
     * @version V1.0  
     * @param localPath      文件路径
     * @param fileName       文件名
     * @param oriOrder       需修改的命令
     * @param planOrder      命令内容
     * @return boolean
     */
    public static boolean replacePlanInFile(String localPath, String fileName,String oriOrder, String planOrder) {
        boolean flag = false;
        InputStreamReader isr = null;
        BufferedReader br = null;
        Writer writer = null;
        try {
            // 以GBK编码读文件
            isr = new InputStreamReader(new FileInputStream(new File(localPath
                    + fileName)), "GBK");
            br = new BufferedReader(isr);
            StringBuilder sb = new StringBuilder();
            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line + System.lineSeparator());
            }
            String str = sb.toString().replace(oriOrder, planOrder);
            // 以so-8859-1编码写文件
            writer = new OutputStreamWriter(new FileOutputStream(new File(
                    localPath + fileName)), "iso-8859-1");
            // 修改字符串编码为iso-8859-1
            String strFinal = new String(str.getBytes("GBK"), "iso-8859-1");
            writer.write(strFinal.toCharArray());
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            logger.info("package com.enjoyor.utils -> FTPUtilLinux ->replacePlanInFile() -> 未找到文件");
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("package com.enjoyor.utils -> FTPUtilLinux ->replacePlanInFile() -> 文件流读取异常");
        } finally {
            try {
                if (isr != null) {
                    isr.close();
                }
            } catch (Exception e2) {
                logger.info("package com.enjoyor.utils -> FTPUtilLinux ->replacePlanInFile() -> 读文件流 关闭异常");
            }
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (Exception e2) {
                logger.info("package com.enjoyor.utils -> FTPUtilLinux ->replacePlanInFile() -> 写文件流 关闭异常");
            }
        }
        return flag;
    }
    /**
     * 删除本地文件
     * @author LuoJiaLei
     * @date 2019年2月13日 下午3:53:13  
     * @version V1.0  
     * @param localPath    本地路径
     * @param fileName     文件名
     * @return boolean
     */
    public static boolean removeLocalFile(String localPath, String fileName) {
        boolean flag = false;
        File file = new File(localPath + fileName);
        if (file.exists()) {
            file.delete();
            return true;
        }
        return flag;
    }
}

以上代码均以Linux环境考虑编码和空格,Windows环境使用时要注意

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343