java中用FTPClient,执行到ftp.storeFile(fileName, inputFile);无反应

2023-05-16

package com.aa.test;

import cn.hutool.core.util.StrUtil;
import com.nuctech.platform.tip.constant.TipConstant;
import lombok.extern.slf4j.Slf4j;
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.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @Description  ftp操作工具类
 */
@Slf4j
public class FTPClientUtil {

    /**
     * Description: 从FTP服务器下载文件
     * @param url FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param remotePath FTP服务器上的相对路径
     * @param fileName 要下载的文件名
     * @param localPath 下载后保存到本地的路径
	 * @param  menuName 使用menuname 来作为zip包的名称
     * @return
     */
    public static boolean downloadFile(String url, int port, String username, String password, List<String> remotePathes,
                                       List<String> fileName, String localPath,String menuName)
    {
        boolean success = false;
        FTPClient ftp = new FTPClient();
		String zipPath=TipConstant.WORK_DIR+menuName+TipConstant.WORK_DIR_FIX;
		ZipOutputStream zipOutputStream=null;
		FileInputStream fileInputStream=null;
		OutputStream is=null;
		try
        {
        	//创建zip包
			zipOutputStream= new ZipOutputStream(new FileOutputStream(zipPath));
            int reply;

            // 连接FTP服务器
            if (port > -1)
            {
                ftp.connect(url, port);
            }
            else
            {
                ftp.connect(url);
            }
            //登录
            ftp.login(username, password);
            // 设置连接超时时间,5000毫秒
            ftp.setConnectTimeout(5000);
            // 设置中文编码集,防止中文乱码
            ftp.setControlEncoding("UTF-8");
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                log.info("下载ftp文件时,未连接到FTP,用户名或密码错误");
                ftp.disconnect();
                return success;
            }else {
                log.info("下载ftp文件时,FTP连接成功");
            }
            for(String remotePath:remotePathes){
				remotePath = new String(remotePath.getBytes("GBK"),"iso-8859-1");
				ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
				FTPFile[] fs = ftp.listFiles();
				for (FTPFile ff : fs)
				{
					if (fileName.contains(ff.getName()))
					{
						File file = new File(localPath);
						if(!file.exists()){
							file.mkdirs();
						}
						File localFile = new File(localPath + "/" + ff.getName());
						//开始从ftp下载图片
						is = new FileOutputStream(localFile);
						ftp.retrieveFile(ff.getName(), is);
						is.close();
						//创建条目
						String name=menuName+File.separator+ff.getName();
						ZipEntry zipEntry = new ZipEntry(name);
						zipOutputStream.putNextEntry(zipEntry);
						//获取文件资源
						String absolutePath = localFile.getAbsolutePath();
						fileInputStream = new FileInputStream(absolutePath);
						//把文件写到zip包中
						byte[] bytes = new byte[1024];
						int read;
						while ((read = fileInputStream.read(bytes)) != -1) {
							zipOutputStream.write(bytes,0,read);
						}
						fileInputStream.close();
					}
				}
			}
            ftp.logout();
            success = true;
        }
        catch (IOException e)
        {
            log.error("从FTP服务器下载文件异常:", e);
        }
        finally
        {
            if (ftp.isConnected())
            {
                try
                {
					is.close();
                	fileInputStream.close();
					zipOutputStream.close();
                    ftp.disconnect();
                }
                catch (IOException e)
                {
                    log.error("下载文件后关闭连接异常:", e);
                }
            }
        }
        return success;
    }

    /**
     * Description: 向FTP服务器上传文件
     * @param url FTP服务器hostname
     * @param port FTP服务器端口,如果默认端口请写-1
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param path FTP服务器保存目录
     * @param filename 上传到FTP服务器上的文件名
     * @param input 输入流
     * @return 成功返回true,否则返回false
     */
    public static boolean uploadFile(String url, int port, String username, String password, String path,
                                     String filename, InputStream input)
    {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        try
        {
            int reply;

            // 连接FTP服务器
            if (port > -1)
            {
                ftp.connect(url, port);
            }
            else
            {
                ftp.connect(url);
            }

            // 登录FTP
            ftp.login(username, password);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply))
            {
                ftp.disconnect();
                return success;
            }
			//切换工作路径
			List<String> pathList = getPathList(path);
            for(int i=0;i<pathList.size();i++){
				String dir = new String(pathList.get(i).getBytes("GBK"),"iso-8859-1");
				if(!ftp.changeWorkingDirectory(dir)){
            		if(!ftp.makeDirectory(dir)){
            			log.error("创建文件夹失败");
            			throw new IOException("创建文件夹失败");
					}
					ftp.changeWorkingDirectory(dir);
				}
			}
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
            ftp.storeFile(filename, input);
            input.close();
            ftp.logout();
            success = true;
        }
        catch (IOException e)
        {
            success = false;
            log.error("从FTP服务器上传文件异常", e);
        }
        finally
        {
            if (ftp.isConnected())
            {
                try
                {
                    ftp.disconnect();
                }
                catch (IOException e)
                {
                    log.error("上传文件后关闭连接异常", e);
                }
            }
        }
        return success;
    }
	/**
	 * Description: 向FTP服务器上传xml文件
	 * @param url FTP服务器hostname
	 * @param port FTP服务器端口,如果默认端口请写-1
	 * @param username FTP登录账号
	 * @param password FTP登录密码
	 * @param path FTP服务器保存目录
	 * @param filename 上传到FTP服务器上的文件名
	 * @param input 输入流
	 * @return 成功返回true,否则返回false
	 */
	public static boolean uploadXmlFile(String url, int port, String username, String password, String path,
									 String filename, InputStream input)
	{
		boolean success = false;
		FTPClient ftp = new FTPClient();
		try
		{
			int reply;

			// 连接FTP服务器
			if (port > -1)
			{
				ftp.connect(url, port);
			}
			else
			{
				ftp.connect(url);
			}

			// 登录FTP
			ftp.login(username, password);
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply))
			{
				ftp.disconnect();
				return success;
			}
			String dir = new String(path.getBytes("GBK"),"iso-8859-1");
			if(!ftp.changeWorkingDirectory(dir)){
				if(!ftp.makeDirectory(dir)){
					log.error("创建文件夹失败");
					throw new IOException("创建文件夹失败");
				}
				ftp.changeWorkingDirectory(dir);
			}
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			ftp.storeFile(filename, input);
			input.close();
			ftp.logout();
			success = true;
		}
		catch (IOException e)
		{
			success = false;
			log.error("从FTP服务器上传文件异常", e);
		}
		finally
		{
			if (ftp.isConnected())
			{
				try
				{
					ftp.disconnect();
				}
				catch (IOException e)
				{
					log.error("上传文件后关闭连接异常", e);
				}
			}
		}
		return success;
	}

    /**
     * <删除FTP上的文件>
     * <远程删除FTP服务器上的录音文件>
     * @param url FTP服务器IP地址
     * @param port FTP服务器端口
     * @param username FTP服务器登录名
     * @param password FTP服务器密码
     * @param remotePath 远程文件路径
     * @param fileName 待删除的文件名
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static boolean deleteFtpFile(String url, int port, String username, String password, String remotePath,
                                        String fileName)
    {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        try
        {
            int reply;

            // 连接FTP服务器
            if (port > -1)
            {
                ftp.connect(url, port);
            }
            else
            {
                ftp.connect(url);
            }

            // 登录
            ftp.login(username, password);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply))
            {
                ftp.disconnect();
                return success;
            }
            // 转移到FTP服务器目录
			//删除空的文件夹
			String path = remotePath.substring(0, remotePath.lastIndexOf(File.separator));
			remotePath = new String(remotePath.getBytes("GBK"),"iso-8859-1");
            fileName=new String(fileName.getBytes("GBK"),"iso-8859-1");
			if(StrUtil.isBlank(fileName)){
				success=ftp.deleteFile(remotePath);
			}else{
				ftp.changeWorkingDirectory(remotePath);
				//获取当前目录下所有得子文件名称,进行删除
				FTPFile[] ftpFiles = ftp.listFiles();
				for (FTPFile ftpFile : ftpFiles) {
					boolean  isDel=ftp.deleteFile(remotePath + File.separator + ftpFile.getName());
					if(!isDel){
						throw new IOException("删除子文件失败");
					}
				}
				FTPFile[] ftpFiles1 = ftp.listFiles();
				if(null!=ftpFiles1&&ftpFiles1.length!=0){

				}else{
					ftp.changeWorkingDirectory(path);
					ftp.removeDirectory(remotePath);
				}
				success=true;
			}
            ftp.logout();
        }
        catch (IOException e)
        {
            log.error("FTP服务器上删除文件异常", e);
            success = false;
        }
        finally
        {
            if (ftp.isConnected())
            {
                try
                {
                    ftp.disconnect();
                }
                catch (IOException e)
                {
                    log.error("FTP服务器上删除文件后关闭连接", e);
                }
            }
        }
        return success;
    }

	/**
	 * <删除FTP上的文件>
	 * <远程删除FTP服务器上的录音文件>
	 * @param url FTP服务器IP地址
	 * @param port FTP服务器端口
	 * @param username FTP服务器登录名
	 * @param password FTP服务器密码
	 * @param remotePath 远程文件路径
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
    public static boolean delDirPath(String url, int port, String username, String password, String remotePath
									 ) {
		boolean success = false;
		FTPClient ftp = new FTPClient();
		try
		{
			int reply;

			// 连接FTP服务器
			if (port > -1)
			{
				ftp.connect(url, port);
			}
			else
			{
				ftp.connect(url);
			}

			// 登录
			ftp.login(username, password);
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply))
			{
				ftp.disconnect();
				return success;
			}
			String path = remotePath.substring(0, remotePath.lastIndexOf(File.separator));
			remotePath=new String(remotePath.getBytes("GBK"),"iso-8859-1");
			ftp.changeWorkingDirectory(remotePath);
			FTPFile[] ftpFiles = ftp.listFiles();
			if(null!=ftpFiles&&ftpFiles.length!=0){

			}else{
				ftp.changeWorkingDirectory(path);
				ftp.removeDirectory(remotePath);
			}
			ftp.logout();
		}
		catch (IOException e)
		{
			log.error("FTP服务器上删除文件异常", e);
			success = false;
		}
		finally
		{
			if (ftp.isConnected())
			{
				try
				{
					ftp.disconnect();
				}
				catch (IOException e)
				{
					log.error("FTP服务器上删除文件后关闭连接", e);
				}
			}
		}
		return success;

	}


	/**
	 * <删除FTP上的文件>
	 * <远程删除FTP服务器上的录音文件>
	 * @param url FTP服务器IP地址
	 * @param port FTP服务器端口
	 * @param username FTP服务器登录名
	 * @param password FTP服务器密码
	 * @param remotePath 远程文件路径
	 * @param fileName 待删除的文件名
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public static boolean delXmlFile(String url, int port, String username, String password, String remotePath,
										String fileName)
	{
		boolean success = false;
		FTPClient ftp = new FTPClient();
		try
		{
			int reply;

			// 连接FTP服务器
			if (port > -1)
			{
				ftp.connect(url, port);
			}
			else
			{
				ftp.connect(url);
			}

			// 登录
			ftp.login(username, password);
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply))
			{
				ftp.disconnect();
				return success;
			}
			remotePath = new String(remotePath.getBytes("GBK"),"iso-8859-1");
			fileName=new String(fileName.getBytes("GBK"),"iso-8859-1");
			//切换工作目录
			ftp.changeWorkingDirectory(remotePath);
			//获取当前目录下所有得子文件名称,进行删除
			boolean  isDel=ftp.deleteFile(remotePath + File.separator + fileName);
			if(!isDel){
				throw new IOException("删除子文件失败");
			}
			success=true;
			ftp.logout();
		}
		catch (IOException e)
		{
			log.error("FTP服务器上删除文件异常", e);
			success = false;
		}
		finally
		{
			if (ftp.isConnected())
			{
				try
				{
					ftp.disconnect();
				}
				catch (IOException e)
				{
					log.error("FTP服务器上删除文件后关闭连接", e);
				}
			}
		}
		return success;
	}

	//分割路径
	public static List<String> getPathList(String path){
		String[] dirs = path.split("/");
		List<String> list = new ArrayList<>();
		String pathname = "";
		for(String str : dirs){
			if(StrUtil.isEmpty(str)){
				continue;
			}
			pathname = pathname + "/" + str;
			list.add(pathname);
		}
		return list;
	}



}

工具类,一找一大把,那就不多说了。我主要说说遇到的问题:连接ftp的客户端,我没有和ftp服务器部署在同一个电脑,如果是同一个电脑,应该也没啥问题。我发现,在我拿到流数据,往ftp文件夹下写图片数据的时候,没有把图片写进去。通过一行一行代码打印日志,排查发现


boolean storeFile = ftp.storeFile(filename, input);方法没有拿到返回值,没有反应。  

原因是:

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT 命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的 XXXX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV 命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口 发送连接请求,建立一条数据链路来传送数据。

解决办法:ftpclient.enterLocalPassiveMode();

/**
	 * Description: 向FTP服务器上传文件
	 *
	 * @param url      FTP服务器hostname
	 * @param port     FTP服务器端口,如果默认端口请写-1
	 * @param username FTP登录账号
	 * @param password FTP登录密码
	 * @param path     FTP服务器保存目录
	 * @param filename 上传到FTP服务器上的文件名
	 * @param input    输入流
	 * @return 成功返回true,否则返回false
	 **/
	public static boolean uploadFile(String url, int port, String username, String password, String path,
									 String filename, InputStream input) {
		log.info("开始调用uploadfile方法");
		boolean success = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;

			// 连接FTP服务器
			if (port > -1) {
				log.info("开始调用uploadfile方法,url:"+url+",port:"+port);
				ftp.connect(url, port);
			} else {
				log.info("开始调用uploadfile方法else,url:"+url+",port:"+port);
				ftp.connect(url);
			}
			// 登录FTP
			boolean login = ftp.login(username, password);
			log.info("开始调用uploadfile方法,登录FTP,login:"+login);
			reply = ftp.getReplyCode();
			log.info("开始调用uploadfile方法,登录FTP,reply:"+reply);
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				log.info("开始调用uploadfile方法==ftp.disconnect()");
				return success;
			}
			String[] ftpPathDir = path.split("/");
			//切换工作路径
			List<String> pathList = Arrays.asList(ftpPathDir);
			for (int i = 0; i < pathList.size(); i++) {
				String dir = new String(pathList.get(i).getBytes("GBK"), "iso-8859-1");
				if (!ftp.changeWorkingDirectory(dir)) {
					if (!ftp.makeDirectory(dir)) {
						log.error("创建文件夹失败");
					}
					ftp.changeWorkingDirectory(dir);
				}
			}
			boolean setFileType = ftp.setFileType(FTP.BINARY_FILE_TYPE);
			log.info("开始调用uploadfile方法==setFileType:"+setFileType);
			ftp.enterLocalPassiveMode();
			boolean storeFile = ftp.storeFile(filename, input);
			log.info("开始调用uploadfile方法==storeFile:"+storeFile);
			input.close();
			boolean logout = ftp.logout();
			log.info("开始调用uploadfile方法==logout:"+logout);
			success = true;
		} catch (IOException e) {
			success = false;
			log.error("从FTP服务器上传文件异常", e);
		} finally {
			log.error("finally从FTP服务器上传文件异常");
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException e) {
					log.error("上传文件后关闭连接异常", e);
				}
			}
		}
		log.info("调用uploadfile方法结束,结果="+success);
		return success;
	}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中用FTPClient,执行到ftp.storeFile(fileName, inputFile);无反应 的相关文章

  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • 当分配给变量时,我可以以某种方式重用 Gremlin GraphTraversals 代码吗?

    我有看起来像这样的 GraphTraversals attrGroup GraphTraversal
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • 【Java二十周年】Delphi转行java的一些小感触

    本文纯属一届小码农对java使用过程的体验感触 目录 xff1a 初遇java编程语言与java的擦肩深入java 跨平台性开源支持web的支撑 初遇java编程语言 刚上大学的时候 xff0c 完全是个电脑盲 刚入学学的计算机普及知识就是
  • 给大家安利一个学习angular2的视频网站

    本文地址 xff1a http blog csdn net sushengmiyan 本文作者 xff1a 苏生米沿 视频地址 xff1a https egghead io courses angular 2 fundamentals 网站
  • 记一个万金油开源框架JHipster

    本文地址 xff1a http blog csdn net sushengmiyan article details 53190236 百搭代码生成框架 体验新技术汇总 xff1a Spring BootSpring SecurityAng
  • SQLServer触发器创建、删除、修改、查看...适用于级联删除

    一 触发器是一种特殊的存储过程 它不能被显式地调用 而是在往表中插入记录 更新记录或者删除记录时被自动地激活 所以触发器可以用来实现对表实施复杂的完整性约束 二 SQL Server为每个触发器都创建了两个专用表 Inserted表和Del
  • 工薪族巧理财之定期存款中整存整取、零存整取、存本取息之间的微妙区别

    银行的官方术语先给大家普及一下 xff1a 定期存款是在存款时约定存储时间 一次或按期分次 在约定存期 存入本金 xff0c 整笔或分期平均支取本金利息的一种储蓄 按存取方式定期存款分为整存整取定期存款 零存整取定期存款 存本取息定期存款
  • CentOS防火墙相关命令

    目录 1 开放端口2 查看防火墙所有开放的端口3 关闭防火墙4 查看防火墙状态5 查看监听的端口6 检查端口被哪个进程占用7 查看进程的详细信息 1 开放端口 firewall cmd zone span class token opera
  • no module named win32com.client错误解决

    无论什么时候 xff0c 你在运行的时候发现有importError no module named win32com client这个提示 你都可以这么解决 xff1a 请下载http sourceforge net projects p
  • java.util.concurrent同步框架(AQS论文中文翻译)

    java util concurrent同步框架 摘要目录和主题描述一般条款关键字1 介绍 xff1a 需求设计实现4 使用方式5 性能6 结论7 致谢 Doug Lea SUNY Oswego Oswego NY 13126 dl 64
  • POJ2287 田忌赛马---贪心算法

    田忌赛马 题目详见http poj org problem id 61 2287 田忌赛马大家都听过 xff0c 可是如果不是上中下三等马 xff0c 而是很多匹马 xff0c 优劣有很多种分类 xff0c 就不仅仅是321的问题了 这个很
  • 贪心算法详解

    之前讲过动态规划DP xff0c 现在来说说贪心 贪心算法在解决问题的策略上目光短浅 xff0c 只根据当前已有的信息就做出选择 xff0c 而且一旦做出了选择 xff0c 不管将来有什么结果 xff0c 这个选择都不会改变 也就是说贪心对
  • 搜索智能提示suggestion,附近点搜索

    第三十六 三十七章 搜索智能提示suggestion xff0c 附近地点搜索 作者 xff1a July 致谢 xff1a caopengcs 胡果果 时间 xff1a 二零一三年九月七日 题记 写博的近三年 xff0c 整理了太多太多的
  • 多重继承及虚继承中对象内存的分布

    多重继承及虚继承中对象内存的分布 这篇文章主要讲解G 43 43 编译器中虚继承的对象内存分布问题 xff0c 从中也引出了dynamic cast和static cast本质区别 虚函数表的格式等一些大部分C 43 43 程序员都似是而非
  • 【Google】25匹马的角逐

    问题是这样的 xff1a 一共有25匹马 xff0c 有一个赛场 xff0c 赛场有5个赛道 xff0c 就是说最多同时可以有5匹马一起比赛 假设每匹马都跑的很稳定 xff0c 不用任何其他工具 xff0c 只通过马与马之间的比赛 xff0
  • HDOJ 1058 Humble Numbers解题报告【DP】

    Humble Numbers 题目详见http acm hdu edu cn showproblem php pid 61 1058 开始拿到这个题目的时候还纠结了半天 xff0c 英语很差的话这个题是不可能AC的 而我就是其中之一 Hum
  • 背包问题详解

    背包问题 背包问题 Knapsack problem 是一种组合优化的NP完全问题 问题可以描述为 xff1a 给定一组物品 xff0c 每种物品都有自己的体积和价值 xff0c 在限定的总体积内 xff0c 我们如何选择 xff0c 才能
  • 楼教主男人必解八题之 Coins 解题报告

    楼教主男人必解八题之 Coins 解题报告 题目详见http acm hdu edu cn showproblem php pid 61 2844 这个题目和POJ1742是一个题目 xff0c 也是楼教主的男人八题之一 说的是给出N种硬币
  • CentOS7安装MySQL5.7过程以及常用需要修改操作,安装mysqlclient,安装mysql-devel报错问题以及卸载MySQL

    目录 Docker安装运行命令mysql配置 Centos安装下载安装启动修改root用户密码修改远程访问权限1 改表法2 授权法 MySQL密码验证mysqlclient时候报错 OSError mysql config not foun
  • 如何证明程序的正确性?

    什么样的程序才是正确的 xff1f 如何来保证程序是正确的 xff1f 测试 xff1f NO xff01 采用测试方法确实可以发现程序中的错误 xff0c 但却不能保证和证明程序中没有错误 xff01 先来看一些概念 xff0c 有关 程
  • 平摊分析

    平摊分析 我们经常在处理数据结构的时间复杂度的时候 xff0c 大多数操作代价很低 xff0c 可是由于某些个别操作的代价较高 xff0c 导致最后求得时间复杂度的上界不是那么的紧凑 在平摊分析中 xff0c 执行一系列数据结构操作所需要的
  • java中用FTPClient,执行到ftp.storeFile(fileName, inputFile);无反应

    package com aa test import cn hutool core util StrUtil import com nuctech platform tip constant TipConstant import lombo