FtpClient read write create upload download

本文介绍如何通过FTP协议实现文件的上传和下载操作,包括连接FTP服务器、创建目录、读取文件、写入文件等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.chinasoft.ge.util;

 

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.StringTokenizer;

import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;

public class FtpServer {
    private FtpClient ftpClient;
    private String FtpIP,FtpUser,FtpPwd;
    private int FtpPort = 21;
    private Boolean bConnected = false;
   
    public FtpServer(String IP, int port, String user, String pwd){
     FtpIP = IP;
     FtpPort = port;
     FtpUser = user;
     FtpPwd = pwd;
     ConnectServer(FtpIP, FtpPort, FtpUser, FtpPwd);
    }

    public Boolean ConnectServer(String IP, int port, String user, String pwd){
     try{
      //System.out.println(IP + "   " + port);
         ftpClient = new FtpClient(IP,port);
         ftpClient.login(user, pwd);
         System.out.println(IP +" FTP��¼�ɹ�!");           
         bConnected = true;
         //System.out.println("|" + IP + "bConnected:" + bConnected);
     }
     catch(IOException e){
      e.printStackTrace();
     }

     return bConnected;
    }

    // ��FTP�Ͻ��ļ���
    public void CreateDirectory(String path){
        //System.out.println("bConnected:" + bConnected);
     if(!bConnected) {System.out.println("CreateDirectory:FTP������δl��!"); return;}
     try{
   //System.out.println("00a");
   ftpClient.binary();
   //System.out.println("00a");
   
   // ���ļ���
   ftpClient.ascii();
   StringTokenizer s = new StringTokenizer(path,"/");//"abc4/abc2/abc3", "/"); // sign
   //System.out.println(path);
   int count = s.countTokens();
   //System.out.println(count);
   String pathName = "";
   while (s.hasMoreElements()) {
    pathName = pathName + "/" + (String) s.nextElement();
    //System.out.println(pathName);
    try {
     ftpClient.sendServer("XMKD " + pathName + "\r\n");
    } catch (Exception e) {
     e.printStackTrace();
    }
    int reply = ftpClient.readServerResponse();
   }
   System.out.println(FtpIP + " FTP���ļ��гɹ�!");
     }catch(Exception e){}

    }
   
    // FileName ȫ·���ļ���
    public byte[] ReadFile(String FileName){
        byte rbyts[]=null;
        try{
   ftpClient.binary();
   //System.out.println("00");
         TelnetInputStream tis = ftpClient.get(FileName);
         ByteArrayOutputStream baos=new ByteArrayOutputStream();
   //System.out.println("001");
         byte[] byts = new byte[1024];
         int len;
         while ((len = tis.read(byts)) != -1) {
    //System.out.println(len);
          for(int i = 0; i<len; i++){
           baos.write(byts[i]);
          }
          //baos.write(byts);
             //tos.write(bytes, 0, c);
         }
   //System.out.println("002");
         tis.close();
        
         rbyts=baos.toByteArray();
        }
        catch(Exception e){
         e.printStackTrace();
        }
       
        return rbyts;
    }
   
    // FTP��д�ļ�
 public void WriteFile(String FileName, byte[] byts) {
  try {
   ftpClient.binary();

   TelnetOutputStream tos = ftpClient.put(FileName);
   tos.write(byts);
   tos.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
    /**
     * �ϴ��ļ�
     * @param localFile �����ļ�
     * @param remoteFile Զ���ļ�
     */
    public void upload(String localFile, String remoteFile) {
        TelnetOutputStream os = null;
        FileInputStream is = null;
        try {
            //��Զ���ļ������������
            os = ftpClient.put(remoteFile);
            //��ȡ�����ļ���������
            File file_in = new File(localFile);
            is = new FileInputStream(file_in);
            //����һ�����
            byte[] bytes = new byte[1024];
            int c;
            while ((c = is.read(bytes)) != -1) {
                os.write(bytes, 0, c);
            }
            System.out.println("upload success");
        } catch (IOException ex) {
            System.out.println("not upload");
            ex.printStackTrace();
            throw new RuntimeException(ex);
        } finally{
            try {
                if(is != null){
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(os != null){
                        os.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
   
    /**
     * �����ļ�
     * @param remoteFile Զ���ļ�·��(�������)
     * @param localFile �����ļ�·��(�ͻ���)
     */
    public void download(String remoteFile, String localFile) {
        TelnetInputStream is = null;
        FileOutputStream os = null;
        try {
            //��ȡԶ�̻����ϵ��ļ�filename������TelnetInputStream�Ѹ��ļ����͵����ء�
            is = ftpClient.get(remoteFile);
            File file_in = new File(localFile);
            os = new FileOutputStream(file_in);
            byte[] bytes = new byte[1024];
            int c;
            while ((c = is.read(bytes)) != -1) {
                os.write(bytes, 0, c);
            }
            System.out.println("download success");
        } catch (IOException ex) {
            System.out.println("not download");
            ex.printStackTrace();
            throw new RuntimeException(ex);
        } finally{
            try {
                if(is != null){
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(os != null){
                        os.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void CloseConnect() {
        try {
         if(bConnected) ftpClient.closeServer();
            System.out.println(FtpIP + " FTP�Ͽ��ɹ�!");
        } catch (IOException ex) {
            System.out.println(FtpIP + " FTP�Ͽ�Pʧ��");
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
    }

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println("ϵͳ��!");

  FtpServer ftp1 = new FtpServer("192.168.0.101", 21, "anonymous", "IEUser@");
  byte[] byts = ftp1.ReadFile("/12358(v2.0).ppt");
  ftp1.CloseConnect();
  
  FtpServer ftp2 = new FtpServer("192.168.0.102", 21, "anonymous", "IEUser@");
  String path2 = "abc1/abc2/abc3";
  ftp2.CreateDirectory(path2);
  ftp2.WriteFile(path2 + "/" + "abc.ppt", byts);
  ftp2.CloseConnect();
 }
}

package com.epf.nrt.document.utils; 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; import org.apache.commons.pool2.impl.GenericObjectPool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.*; import java.nio.charset.Charset; //@Slf4j @Component public class ContinueFTP { public FTPClient ftpClient; @Autowired private GenericObjectPool<FTPClient> pool; public ContinueFTP() throws Exception { ftpClient = pool.borrowObject(); // 设置将过程中使用到的命令输出到控制台 // this.ftpClient.addProtocolCommandListener(new // PrintCommandListener(new PrintWriter(System.out))); } /** * 连接到FTP服务器 * * @param hostname 主机名 * @param port 端口 * @param username 用户名 * @param password 密码 * @return 是否连接成功 * @throws IOException */ public boolean connect(String hostname, int port, String username, String password) throws Exception { try { // if(!ftpClient.isConnected()){ ftpClient.connect(hostname, port); // } // ftpClient.setControlEncoding("GBK"); //ftpClient.setConnectTimeout(60*000); //连接超时为60秒 } catch (Exception e) { e.printStackTrace(); throw new Exception("登陆异常,请检查主机端口"); } if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { if (ftpClient.login(username, password)) { //该代码的作用是将文件编码由ISO-889-1转为utf-8,也可以转为其他的,例如GBK ftpClient.setControlEncoding("UTF-8"); ftpClient.setCharset(Charset.forName("UTF-8")); return true; } else throw new Exception("登陆异常,请检查密码账号"); } else throw new Exception("登陆异常"); } /** * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 * * @param remote 远程文件路径 * @param local 本地文件路径 * @return 上传的状态 * @throws IOException */ public DownloadStatus download(String remote, String local) throws IOException { // 设置被动模式 ftpClient.enterLocalPassiveMode(); // 设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); DownloadStatus result; // 检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("UTF-8"), "UTF-8")); if (files.length != 1) { // System.out.println("远程文件不存在"); //log.info("远程文件不存在"); return DownloadStatus.Remote_File_Noexist; } long lRemoteSize = files[0].getSize(); File f = new File(local); // 本地存在文件,进行断点下载 if (f.exists()) { long localSize = f.length(); // 判断本地文件大小是否大于远程文件大小 if (localSize >= lRemoteSize) { //log.info("本地文件大于远程文件,下载中止"); return DownloadStatus.Local_Bigger_Remote; } // 进行断点续传,并记录状态 FileOutputStream out = new FileOutputStream(f, true); // 找出本地已经接收了多少 ftpClient.setRestartOffset(localSize); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("UTF-8"), "UTF-8")); try { byte[] bytes = new byte[1024]; // 总的进度 long step = lRemoteSize / 100; long process = localSize / step; int c; while ((c = in.read(bytes)) != -1) { out.write(bytes, 0, c); localSize += c; long nowProcess = localSize / step; if (nowProcess > process) { process = nowProcess; if (process % 10 == 0) { //log.info("下载进度:" + process); } // TODO 更新文件下载进度,值存放在process变量中 } } } catch (Exception e) { } finally { if (in != null) in.close(); if (out != null) out.close(); } // 确认是否全部下载完毕 boolean isDo = ftpClient.completePendingCommand(); if (isDo) { result = DownloadStatus.Download_From_Break_Success; } else { result = DownloadStatus.Download_From_Break_Failed; } } else { OutputStream out = new FileOutputStream(f); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("UTF-8"), "UTF-8")); try { byte[] bytes = new byte[1024]; long step = lRemoteSize / 100; long process = 0; long localSize = 0L; int c; while ((c = in.read(bytes)) != -1) { out.write(bytes, 0, c); localSize += c; long nowProcess = localSize / step; if (nowProcess > process) { process = nowProcess; if (process % 10 == 0) { //log.info("下载进度:" + process); } // TODO 更新文件下载进度,值存放在process变量中 } } } catch (Exception e) { } finally { if (in != null) in.close(); if (out != null) out.close(); } boolean upNewStatus = ftpClient.completePendingCommand(); if (upNewStatus) { result = DownloadStatus.Download_New_Success; } else { result = DownloadStatus.Download_New_Failed; } } return result; } /** * 从FTP服务器上下载文件流,以便下载 * * @param remote 远程文件路径 * @return 上传的状态 * @throws IOException */ public InputStream getFTPFileInputStream(String remote) throws IOException { // 设置被动模式 ftpClient.enterLocalPassiveMode(); // 设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("UTF-8"), "UTF-8")); if (files.length != 1) { // System.out.println("远程文件不存在"); //log.info("远程文件不存在"); return null; } // 找出本地已经接收了多少 InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("UTF-8"), "UTF-8")); // 确认是否全部下载完毕 // boolean isDo = ftpClient.completePendingCommand(); // if (isDo) { return in; // } else { // return null; // } } /** * 上传文件到FTP服务器,支持断点续传 * * @param local 本地文件名称,绝对路径 * @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext * 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 * @return 上传结果 * @throws IOException */ public UploadStatus upload(File localFile, String remote) throws IOException { // 设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); // 设置以二进制流的方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setControlEncoding("UTF-8"); UploadStatus result; // 对远程目录的处理 String remoteFileName = remote; if (remote.contains("/")) { remoteFileName = remote.substring(remote.lastIndexOf("/") + 1); // 创建服务器远程目录结构,创建失败直接返回 if (CreateDirecroty(remote, ftpClient) == UploadStatus.Create_Directory_Fail) { return UploadStatus.Create_Directory_Fail; } } // 检查远程是否存在文件 FTPFile[] files = ftpClient.listFiles(new String(remoteFileName.getBytes("UTF-8"), "UTF-8")); if (files.length == 1) { long remoteSize = files[0].getSize(); long localSize = localFile.length(); if (remoteSize == localSize) { return UploadStatus.File_Exits; } else if (remoteSize > localSize) { return UploadStatus.Remote_Bigger_Local; } // 尝试移动文件内读取指针,实现断点续传 result = uploadFile(remoteFileName, localFile, ftpClient, remoteSize); // 如果断点续传没有成功,则删除服务器上文件,重新上传 if (result == UploadStatus.Upload_From_Break_Failed) { if (!ftpClient.deleteFile(remoteFileName)) { return UploadStatus.Delete_Remote_Faild; } result = uploadFile(remoteFileName, localFile, ftpClient, 0); } } else { result = uploadFile(remoteFileName, localFile, ftpClient, 0); } return result; } /** * 断开与远程服务器的连接 * * @throws IOException */ public void disconnect() throws IOException { if (ftpClient.isConnected()) { ftpClient.disconnect(); } } /** * 递归创建远程服务器目录 * * @param remote 远程服务器文件绝对路径 * @param ftpClient FTPClient对象 * @return 目录创建是否成功 * @throws IOException */ public UploadStatus CreateDirecroty(String remote, FTPClient ftpClient) throws IOException { UploadStatus status = UploadStatus.Create_Directory_Success; String directory = remote.substring(0, remote.lastIndexOf("/") + 1); if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(new String(directory.getBytes("UTF-8"), "UTF-8"))) { // 如果远程目录不存在,则递归创建远程服务器目录 int start = 0; int end = 0; if (directory.startsWith("/")) { start = 1; } else { start = 0; } end = directory.indexOf("/", start); while (true) { String subDirectory = new String(remote.substring(start, end).getBytes("UTF-8"), "UTF-8"); if (!ftpClient.changeWorkingDirectory(subDirectory)) { if (ftpClient.makeDirectory(subDirectory)) { ftpClient.changeWorkingDirectory(subDirectory); } else { System.out.println("创建目录失败"); return UploadStatus.Create_Directory_Fail; } } start = end + 1; end = directory.indexOf("/", start); // 检查所有目录是否创建完毕 if (end <= start) { break; } } } return status; } /** * 上传文件到服务器,新上传和断点续传 * * @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变 * @param localFile 本地文件File句柄,绝对路径 * @param processStep 需要显示的处理进度步进值 * @param ftpClient FTPClient引用 * @return * @throws IOException */ public UploadStatus uploadFile(String remoteFile, File localFile, FTPClient ftpClient, long remoteSize) throws IOException { UploadStatus status; // 显示进度的上传 // long step = localFile.length() / 100; // long process = 0; // long localreadbytes = 0L; RandomAccessFile raf = new RandomAccessFile(localFile, "r"); OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("UTF-8"), "UTF-8")); // 断点续传 if (remoteSize > 0) { ftpClient.setRestartOffset(remoteSize); // process = remoteSize / step; raf.seek(remoteSize); // localreadbytes = remoteSize; } byte[] bytes = new byte[1024]; int c; while ((c = raf.read(bytes)) != -1) { out.write(bytes, 0, c); // localreadbytes += c; // if (localreadbytes / step != process) { // process = localreadbytes / step; // System.out.println("上传进度:" + process); // TODO 汇报上传状态 // } } out.flush(); raf.close(); out.close(); boolean result = ftpClient.completePendingCommand(); if (remoteSize > 0) { status = result ? UploadStatus.Upload_From_Break_Success : UploadStatus.Upload_From_Break_Failed; } else { status = result ? UploadStatus.Upload_New_File_Success : UploadStatus.Upload_New_File_Failed; } return status; } public enum DownloadStatus { Remote_File_Noexist, // 远程文件不存在 Local_Bigger_Remote, // 本地文件大于远程文件 Download_From_Break_Success, // 断点下载文件成功 Download_From_Break_Failed, // 断点下载文件失败 Download_New_Success, // 全新下载文件成功 Download_New_Failed; // 全新下载文件失败 } public enum UploadStatus { Create_Directory_Fail, // 远程服务器相应目录创建失败 Create_Directory_Success, // 远程服务器闯将目录成功 Upload_New_File_Success, // 上传新文件成功 Upload_New_File_Failed, // 上传新文件失败 File_Exits, // 文件已经存在 Remote_Bigger_Local, // 远程文件大于本地文件 Upload_From_Break_Success, // 断点续传成功 Upload_From_Break_Failed, // 断点续传失败 Delete_Remote_Faild; // 删除远程文件失败 } } 调整下,原代码逻辑尽量不变,只是改造下 连接的创建和释放
05-14
package com.epf.nrt.document.utils; 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; import java.io.*; import java.nio.charset.Charset; //@Slf4j public class ContinueFTP { public FTPClient ftpClient; public ContinueFTP() { ftpClient = new FTPClient(); // 设置将过程中使用到的命令输出到控制台 // this.ftpClient.addProtocolCommandListener(new // PrintCommandListener(new PrintWriter(System.out))); } /** * 连接到FTP服务器 * * @param hostname 主机名 * @param port 端口 * @param username 用户名 * @param password 密码 * @return 是否连接成功 * @throws IOException */ public boolean connect(String hostname, int port, String username, String password) throws Exception { try { // if(!ftpClient.isConnected()){ ftpClient.connect(hostname, port); // } // ftpClient.setControlEncoding("GBK"); //ftpClient.setConnectTimeout(60*000); //连接超时为60秒 } catch (Exception e) { e.printStackTrace(); throw new Exception("登陆异常,请检查主机端口"); } if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { if (ftpClient.login(username, password)) { //该代码的作用是将文件编码由ISO-889-1转为utf-8,也可以转为其他的,例如GBK ftpClient.setControlEncoding("UTF-8"); ftpClient.setCharset(Charset.forName("UTF-8")); return true; } else throw new Exception("登陆异常,请检查密码账号"); } else throw new Exception("登陆异常"); } /** * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 * * @param remote 远程文件路径 * @param local 本地文件路径 * @return 上传的状态 * @throws IOException */ public DownloadStatus download(String remote, String local) throws IOException { // 设置被动模式 ftpClient.enterLocalPassiveMode(); // 设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); DownloadStatus result; // 检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("UTF-8"), "UTF-8")); if (files.length != 1) { // System.out.println("远程文件不存在"); //log.info("远程文件不存在"); return DownloadStatus.Remote_File_Noexist; } long lRemoteSize = files[0].getSize(); File f = new File(local); // 本地存在文件,进行断点下载 if (f.exists()) { long localSize = f.length(); // 判断本地文件大小是否大于远程文件大小 if (localSize >= lRemoteSize) { //log.info("本地文件大于远程文件,下载中止"); return DownloadStatus.Local_Bigger_Remote; } // 进行断点续传,并记录状态 FileOutputStream out = new FileOutputStream(f, true); // 找出本地已经接收了多少 ftpClient.setRestartOffset(localSize); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("UTF-8"), "UTF-8")); try { byte[] bytes = new byte[1024]; // 总的进度 long step = lRemoteSize / 100; long process = localSize / step; int c; while ((c = in.read(bytes)) != -1) { out.write(bytes, 0, c); localSize += c; long nowProcess = localSize / step; if (nowProcess > process) { process = nowProcess; if (process % 10 == 0) { //log.info("下载进度:" + process); } // TODO 更新文件下载进度,值存放在process变量中 } } } catch (Exception e) { } finally { if (in != null) in.close(); if (out != null) out.close(); } // 确认是否全部下载完毕 boolean isDo = ftpClient.completePendingCommand(); if (isDo) { result = DownloadStatus.Download_From_Break_Success; } else { result = DownloadStatus.Download_From_Break_Failed; } } else { OutputStream out = new FileOutputStream(f); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("UTF-8"), "UTF-8")); try { byte[] bytes = new byte[1024]; long step = lRemoteSize / 100; long process = 0; long localSize = 0L; int c; while ((c = in.read(bytes)) != -1) { out.write(bytes, 0, c); localSize += c; long nowProcess = localSize / step; if (nowProcess > process) { process = nowProcess; if (process % 10 == 0) { //log.info("下载进度:" + process); } // TODO 更新文件下载进度,值存放在process变量中 } } } catch (Exception e) { } finally { if (in != null) in.close(); if (out != null) out.close(); } boolean upNewStatus = ftpClient.completePendingCommand(); if (upNewStatus) { result = DownloadStatus.Download_New_Success; } else { result = DownloadStatus.Download_New_Failed; } } return result; } /** * 从FTP服务器上下载文件流,以便下载 * * @param remote 远程文件路径 * @return 上传的状态 * @throws IOException */ public InputStream getFTPFileInputStream(String remote) throws IOException { // 设置被动模式 ftpClient.enterLocalPassiveMode(); // 设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("UTF-8"), "UTF-8")); if (files.length != 1) { // System.out.println("远程文件不存在"); //log.info("远程文件不存在"); return null; } // 找出本地已经接收了多少 InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("UTF-8"), "UTF-8")); // 确认是否全部下载完毕 // boolean isDo = ftpClient.completePendingCommand(); // if (isDo) { return in; // } else { // return null; // } } /** * 上传文件到FTP服务器,支持断点续传 * * @param local 本地文件名称,绝对路径 * @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext * 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 * @return 上传结果 * @throws IOException */ public UploadStatus upload(File localFile, String remote) throws IOException { // 设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); // 设置以二进制流的方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setControlEncoding("UTF-8"); UploadStatus result; // 对远程目录的处理 String remoteFileName = remote; if (remote.contains("/")) { remoteFileName = remote.substring(remote.lastIndexOf("/") + 1); // 创建服务器远程目录结构,创建失败直接返回 if (CreateDirecroty(remote, ftpClient) == UploadStatus.Create_Directory_Fail) { return UploadStatus.Create_Directory_Fail; } } // 检查远程是否存在文件 FTPFile[] files = ftpClient.listFiles(new String(remoteFileName.getBytes("UTF-8"), "UTF-8")); if (files.length == 1) { long remoteSize = files[0].getSize(); long localSize = localFile.length(); if (remoteSize == localSize) { return UploadStatus.File_Exits; } else if (remoteSize > localSize) { return UploadStatus.Remote_Bigger_Local; } // 尝试移动文件内读取指针,实现断点续传 result = uploadFile(remoteFileName, localFile, ftpClient, remoteSize); // 如果断点续传没有成功,则删除服务器上文件,重新上传 if (result == UploadStatus.Upload_From_Break_Failed) { if (!ftpClient.deleteFile(remoteFileName)) { return UploadStatus.Delete_Remote_Faild; } result = uploadFile(remoteFileName, localFile, ftpClient, 0); } } else { result = uploadFile(remoteFileName, localFile, ftpClient, 0); } return result; } /** * 断开与远程服务器的连接 * * @throws IOException */ public void disconnect() throws IOException { if (ftpClient.isConnected()) { ftpClient.disconnect(); } } /** * 递归创建远程服务器目录 * * @param remote 远程服务器文件绝对路径 * @param ftpClient FTPClient对象 * @return 目录创建是否成功 * @throws IOException */ public UploadStatus CreateDirecroty(String remote, FTPClient ftpClient) throws IOException { UploadStatus status = UploadStatus.Create_Directory_Success; String directory = remote.substring(0, remote.lastIndexOf("/") + 1); if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(new String(directory.getBytes("UTF-8"), "UTF-8"))) { // 如果远程目录不存在,则递归创建远程服务器目录 int start = 0; int end = 0; if (directory.startsWith("/")) { start = 1; } else { start = 0; } end = directory.indexOf("/", start); while (true) { String subDirectory = new String(remote.substring(start, end).getBytes("UTF-8"), "UTF-8"); if (!ftpClient.changeWorkingDirectory(subDirectory)) { if (ftpClient.makeDirectory(subDirectory)) { ftpClient.changeWorkingDirectory(subDirectory); } else { System.out.println("创建目录失败"); return UploadStatus.Create_Directory_Fail; } } start = end + 1; end = directory.indexOf("/", start); // 检查所有目录是否创建完毕 if (end <= start) { break; } } } return status; } /** * 上传文件到服务器,新上传和断点续传 * * @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变 * @param localFile 本地文件File句柄,绝对路径 * @param processStep 需要显示的处理进度步进值 * @param ftpClient FTPClient引用 * @return * @throws IOException */ public UploadStatus uploadFile(String remoteFile, File localFile, FTPClient ftpClient, long remoteSize) throws IOException { UploadStatus status; // 显示进度的上传 // long step = localFile.length() / 100; // long process = 0; // long localreadbytes = 0L; RandomAccessFile raf = new RandomAccessFile(localFile, "r"); OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("UTF-8"), "UTF-8")); // 断点续传 if (remoteSize > 0) { ftpClient.setRestartOffset(remoteSize); // process = remoteSize / step; raf.seek(remoteSize); // localreadbytes = remoteSize; } byte[] bytes = new byte[1024]; int c; while ((c = raf.read(bytes)) != -1) { out.write(bytes, 0, c); // localreadbytes += c; // if (localreadbytes / step != process) { // process = localreadbytes / step; // System.out.println("上传进度:" + process); // TODO 汇报上传状态 // } } out.flush(); raf.close(); out.close(); boolean result = ftpClient.completePendingCommand(); if (remoteSize > 0) { status = result ? UploadStatus.Upload_From_Break_Success : UploadStatus.Upload_From_Break_Failed; } else { status = result ? UploadStatus.Upload_New_File_Success : UploadStatus.Upload_New_File_Failed; } return status; } public enum DownloadStatus { Remote_File_Noexist, // 远程文件不存在 Local_Bigger_Remote, // 本地文件大于远程文件 Download_From_Break_Success, // 断点下载文件成功 Download_From_Break_Failed, // 断点下载文件失败 Download_New_Success, // 全新下载文件成功 Download_New_Failed; // 全新下载文件失败 } public enum UploadStatus { Create_Directory_Fail, // 远程服务器相应目录创建失败 Create_Directory_Success, // 远程服务器闯将目录成功 Upload_New_File_Success, // 上传新文件成功 Upload_New_File_Failed, // 上传新文件失败 File_Exits, // 文件已经存在 Remote_Bigger_Local, // 远程文件大于本地文件 Upload_From_Break_Success, // 断点续传成功 Upload_From_Break_Failed, // 断点续传失败 Delete_Remote_Faild; // 删除远程文件失败 } } ContinueFTP ftp = new ContinueFTP(); try { ftp.connect(ftpProperties.getIp(), ftpProperties.getPort(), ftpProperties.getUsername(), ftpProperties.getPassword()); ftp.ftpClient.makeDirectory(new String(saveDir.getBytes("GBK"), "iso-8859-1")); ftp.ftpClient.changeWorkingDirectory(new String(saveDir.getBytes("GBK"), "iso-8859-1")); ftp.upload(tempFile, saveDir + fileName); ftp.disconnect(); } finally { if (!tempFile.delete()) { log.warn("删除临时文件失败,file={}", tempFile.getParentFile()); } } 对这个类进行改造,使其适配连接池的功能
05-14
内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值