windows环境下如何优雅搭建ftp服务?

目录
  • 0. 前言
  • 1.ftp简介
  • 2.下载Apache FTPServer
  • 3.下载并解压压缩包
  • 4.修改配置文件
    • 4.1 修改users.properties配置文件
    • 4.2 修改ftpd-typical.xml配置文件
  • 5.启动FTPServer
  • 6.访问FTP
  • 7.ftp 的启动与关闭

0. 前言

由于学习或工作需要,我们经常需要和他人或其他电脑共享文件,在这之前我们普遍的做法是用U盘来回拷贝文件,但这样就存在着一个风险,①U盘容易中毒;②容易把U盘上的病毒带到别的电脑上。

不管哪个风险都是我们不愿看到的,为了尽可能规避以上风险,我们就想到了ftp服务。
为什么我们不在自己服务器上搭建一个ftp服务呢?

只要我们控制好权限,哪些用户可以上传文件,哪些用户只可以下载文件。这不就给我们共享文件带来了很大方便么,同事也规避了一些风险。

只要将我们需要共享的文件放到服务器上,只要网络正常,我们就很容易从服务器上拉取文件,或者将我们的文件共享给其他小伙伴。

说干就干,接下来我们就行动起来呗。搭建一个属于自己的ftp服务。

1.ftp简介

在搭建ftp服务前呢,我们先来了解下ftp协议和ftp服务器

  • ftp协议: 一种文件传输协议。在本地和服务器之间进行文件传输。
  • ftp服务器:支持ftp传输协议的服务器。一般windows都带有ftp服务,只是默认情况下都没启动。

ftp相关软件也比较多,其中运用比较广泛的有Server-U、FileZilla、VsFTP、apache旗下的FtpServer。

今天我们就来介绍一个开源的ftp服务器,Apache FTPServerFtpServer也就这次的主角,Apache FTPServer是一个100%纯Java的FTP服务器。FTPServer可独立运行作为Windows服务或Unix/ Linux后台程序或是被嵌入在Java应用程序中。

接下来我们就以FtpServer为例,搭建ftp服务。

2.下载Apache FTPServer

可以到官网下载:http://mina.apache.org/ftpserver-project/downloads.html 目前最新版本是Apache FtpServer 1.1.1 Release,出于稳定考虑我这里下载的就是1.0.6版本

3.下载并解压压缩包

将下载下来的压缩包解压到本地,我的是放在D盘根目录下,其目录结构如下图:
在这里插入图片描述

4.修改配置文件

4.1 修改users.properties配置文件

配置文件路径:
D:\apache-ftpserver-1.0.6\res\conf\users.properties
在此配置文件中可以增加用户,如果不希望匿名登录的话,可以将匿名用户这个配置注释掉

# Password is "admin"
ftpserver.user.admin.userpassword=admin
ftpserver.user.admin.homedirectory=./res/home
ftpserver.user.admin.enableflag=true
ftpserver.user.admin.writepermission=true
ftpserver.user.admin.maxloginnumber=0
ftpserver.user.admin.maxloginperip=0
ftpserver.user.admin.idletime=0
ftpserver.user.admin.uploadrate=0
ftpserver.user.admin.downloadrate=0
ftpserver.user.anonymous.userpassword=
ftpserver.user.anonymous.homedirectory=./res/home
ftpserver.user.anonymous.enableflag=true
ftpserver.user.anonymous.writepermission=false
ftpserver.user.anonymous.maxloginnumber=20
ftpserver.user.anonymous.maxloginperip=2
ftpserver.user.anonymous.idletime=300
ftpserver.user.anonymous.uploadrate=4800
ftpserver.user.anonymous.downloadrate=4800
#密码 配置新的用户
ftpserver.user.lxw.userpassword=123456
#主目录
ftpserver.user.lxw.homedirectory=./res/home
#当前用户可用
ftpserver.user.lxw.enableflag=true
#具有上传权限
ftpserver.user.lxw.writepermission=true
#最大登陆用户数为20
ftpserver.user.lxw.maxloginnumber=20
#同IP登陆用户数为2
ftpserver.user.lxw.maxloginperip=2
#空闲时间为300秒
ftpserver.user.lxw.idletime=300
#上传速率限制为480000字节每秒
ftpserver.user.lxw.uploadrate=48000000
#下载速率限制为480000字节每秒
ftpserver.user.lxw.downloadrate=48000000

4.2 修改ftpd-typical.xml配置文件

配置文件路径:
D:\apache-ftpserver-1.0.6\res\conf\ftpd-typical.xml

<server xmlns="http://mina.apache.org/ftpserver/spring/v1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
       http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd    
       "
    id="myServer">
    <listeners>
        <!-- 默认端口是2121,可以修改为自己的端口 -->
        <nio-listener name="default" port="2121">  
            <ssl>
                <keystore file="./res/ftpserver.jks" password="password" />
            </ssl>
        </nio-listener>
    </listeners>
    <file-user-manager file="./res/conf/users.properties" encrypt-passwords="clear"/>
    <!-- 添加encrypt-passwords="clear",将密码加密方式修改给clear -->
</server>

5.启动FTPServer

打开CMD命令窗口,切换到D:\apache-ftpserver-1.0.6\bin这个目录下 输入以下命令:

service install
ftpd.bat res/conf/ftpd-typical.xml

注意:由于ftpserver是纯java编写的,所以第二条命令的执行需要在环境变量中配置java环境JAVA_HOME。java环境此处省去,不会可以自行百度

输入完命令之后如下图所示,当出现FtpServer started 出现即启动成功
在这里插入图片描述

6.访问FTP

在游览器中,输入ftp://ip:2121进行访问,如果端口修改了,要换成对应的端口,ip就是FTP所在的服务器的ip,访问如下图所示:
在这里插入图片描述

当然我们也能通过工具直接访问,进行上传和下载文件操作
下面提供一个比较好用的免安装工具给大家,大家可以放心食用。

winscp553 百度云下载链接 提取码:sncs

7.ftp 的启动与关闭

将dos命令窗口关掉,ftp服务即关闭
那么我们怎么样启动ftp服务呢,

  • 可以根据前面所提到的命令启动,切换到D:\apache-ftpserver-1.0.6\bin这个目录下 输入以下命令:
service install
ftpd.bat res/conf/ftpd-typical.xml
  • 可以把启动命令制作成bat文件,内容为:
d:
cd D:\apache-ftpserver-1.0.5\bin
ftpd.bat res/conf/ftpd-typical.xml

随便起一个名字xx,命名为xx.bat,点击xx.bat文件即可启动ftp服务器。

是不是很简单呀,到此呢属于我们自己的ftp服务就搭建好了(●'◡'●)。

本文转载于网络 如有侵权请联系删除

相关文章

  • 实战SSM_O2O商铺_05集成SSM后验证DAO层、Service层、Controller层的配置

    文章目录概述验证DAO层的配置接口SQL映射文件单元测试类基类DAO层单元测试类验证Service层的配置接口以及实现类单元测试类验证Controller层的配置控制层启动服务,浏览器访问附-模拟HTTP请求调测利器PostmanPostman概述Postman安装使用使用PostmanGithub地址概述整合SSM框架之后,我们分别对持久层、业务层、控制层分别做下单元测试。Area这个实体类属性相对较少,我们就选择使用Area来测试吧。首先为tb_area表准备2条数据------------------------------ --Recordsoftb_area ------------------------------ INSERTINTO`tb_area`VALUES('1','北京','帝都','0','2018-05-1321:00:26','2018-05-1421:00:33'); INSERTINTO`tb_area`VALUES('2

  • python战反爬虫:爬取猫眼电影数据 (二)

    非常荣幸邀请到赛迪人工智能大赛(简称AI世青赛)全球总决赛银奖的获得者隋顺意小朋友为本公众号投稿,隋小朋友虽然小小年纪,但编程能力已经比大多数大学生强非常多了,欢迎大家关注,捧场。本文主要介绍破解反爬,可以先去上一篇观看爬取无反爬内容python战反爬虫:爬取猫眼电影数据(一)(https://blog.csdn.net/Sui_da_xia/article/details/105716242)前言:前一篇文章介绍了猫眼无反爬的内容,我就接着前一篇,接着为您爬取猫眼电影排行榜!如今,所有人无时无刻在使用互联网。它就像一张大网,将所有人联系在一起。而总有些可恶的刺头,只让他人看他的内容,不把他的数据给大家用。正因为如此,我们有了伟大的爬虫工程师,他们手持利剑,突破刺头设置的重重难关,获取数据。今天,就让我们一起,共同大战“猫眼电影”设置的障碍把!获取更多信息(大战美团验证码拦截):上一篇文章,我讲到了以下代码:deflink(url): header={ "User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)Ap

  • 基于Python实现视频的人脸融合功能

    ​图片提取为了方便技术展示,我们选取素材为演员杨紫的一段演讲视频,用例仅为技术交流演示使用,不针对任何指定人。为达到我们AI换脸的目的,我们首先需要将这段视频逐帧提取成照片defvedio_2_pic(self,file,save_path): """ 逐帧取照片 file:视频的位置 save_path:保存路径 """ #读取视频 video=cv2.VideoCapture(file) #获取视频帧率 fps=video.get(cv2.CAP_PROP_FPS) #获取画面大小 width=int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) height=int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) size=(width,height) frame_num=str(video.get(7)) ret,frame=video.read() num=1 whileTrue: ret,frame=video.read() ifret!=True: brea

  • 005.HAProxy+Keepalived高可用负载均衡

    一基础准备1.1部署环境及说明系统OS:CentOS6.864位HAProxy软件:HA-Proxyversion1.5.18Keepalived软件:keepalived-1.3.6.tar.gz官方链接:http://www.haproxy.org/(国内可能无法打开)下载连接:http://pkgs.fedoraproject.org/repo/pkgs/haproxy/部署说明:当用户访问对应的域名时,HAProxy能将请求发送到对应的后端主机上,同时当主HAProxy服务器发生故障后,能立刻将负载均衡服务切换到备用HAProxy服务器上。主机名主机IP地址集群角色虚机IP/域名master172.24.8.10主HAProxy服务器172.24.8.100backup172.24.8.11备HAProxy服务器webapp1172.24.8.30后端web服务器www.lz.comwebapp2172.24.8.31static.lz.comwebapp3172.24.8.32video.lz.com1.2架构规划二后端httpd集群部署2.1部署httpd集群1[root@

  • Java中堆(heap)和栈(stack)的区别

      简单的说:Java把内存划分成两种:一种是栈内存,一种是堆内存。  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。   在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。3.Java中的数据类型有两种。一种是基本类型(primitivetypes),共有8种,即int,short,

  • [5] - 类和对象之进阶(一)

    继承只能有一个父类与其他支持面向对象的语言一样,Scala也支持继承,并且子类只能有一个父类,不能继承于多个父类,如果希望实现类似继承多个父类的功能,应该考虑引入trait。虽然只支持一个父类,但是父类还可以有父类,也就是爷爷类,对于类继承的层数是没有具体要求的,这几点在下面这个例子中都有体现:scala>classA{ |} definedclassA scala>classB{ |} definedclassB scala>classAAextendsA{ |} definedclassAA scala>classABextendsAwithB{ |} <console>:9:error:classBneedstobeatraittobemixedin classABextendsAwithB{ ^ scala>classAAAextendsAA{ |} definedclassAAA scala>classAAAAextendsAAA{ |} definedclassAAAA复制都继承了什么子类继承父类时都会继承些什么呢,

  • 【绝对干货】数据分析扮演的三种角色

    原INSEAD教授曾鸣在公司的内部交流中说到,公司发展都会经历三个阶段,第一个阶段是认清自己的方向,但是不完全知道路怎么走;第二个阶段是知道路上有些步子是对的,有些步子是错的,渐渐去掉错误的,集中精力坚持做正确的;第三个阶段是全力争取高速增长。世上没有一家永远高速增长的公司,一个生命长的公司是在这三阶段里不断轮回。其实,电子商务公司能顺利走完三阶段,就有些成绩出来了。如何让公司顺利走完这三个阶段?曾教授悟出了一些“道”:在第一个阶段,公司发展的动力是由下而上的发展的,这个阶段鼓励员工大胆创新大胆去做;第二个阶段,公司发展的动力是上下互动的,总结出大量的“错”和大量的“对”;第三个阶段,公司管理层知道哪些是对哪些是错,公司是由上而下推动发展,公司的KPI考核最适合在这个阶段给出。他的这番话让我思考,其实公司处在不同的发展阶段,其数据的运营策略也是不同的,这是之前我没有完全领略到的。第一个阶段:有多少数据就收集多少数据,数据只从点上指导运营,但并不指导战略和方向。前几天派代年会上,陈年回答亿邦动力网的记者说,当初凡客发展的时候,他自己也不知道会发展成什么样子,到今天凡客得如此结果也不是陈年

  • 如何在朋友圈刷出宝马广告-互联网推荐系统

    近期发布了两篇推荐系统的文章:从0开始做互联网推荐-以58转转为例从0开始做垂直O2O个性化推荐-以58到家美甲为例简单介绍了协同过滤推荐、分类预测推荐之外,今天重发一篇原来的旧文,简单介绍一下“基于内容的个性化推荐”。互联网推荐系统-如何在自己朋友圈刷出宝马广告 2015年初,微信朋友圈首批广告上线:1)宝马中国2)vivo智能手机3)可口可乐这三则广告出现在每个人的朋友圈信息流里,但是每个用户只能看到其中一个。瞬间,全体微信用户被贴上了三个标签:宝马潜在用户,vivo潜在用户,可口可乐潜在用户。楼主刷了半天,发现是个可口可乐广告,感觉瞬间就不好了。为了增强大伙的体验,本文将从推荐技术的角度分析,为什么不同的人会出不同的微信朋友圈广告,并给出一些TIPS以增加大伙出“宝马广告”,打上高富帅标签的概率。一、推荐算法之内容推荐 内容推荐:content-basedRecommendation 原理:抽取用户历史行为信息的共有属性,比较这些共有属性与广告属性的相似度,推送最相似的广告 步骤: 1)收集用户历史行为 2)找到行为相关共有属性 3)计算共有属性与所有广告属性相似度(例如画像标签

  • 一篇很好的关于mysqld_safe脚本源码解读的文章,收藏了!!

    #!/bin/sh #一些状态变量的定义 KILL_MYSQLD=1;#试图kill多余的mysqld_safe程序,1表示需要kill MYSQLD=#mysqld二进制可执行文件的名称 niceness=0#进程的调度优先级标识 #下面的变量主要用于标识不使用错误日志和syslog logging=init#日志记录状态,init代表初始化 want_syslog=0#标识是否要使用syslog syslog_tag= user='mysql'#--user选项值 pid_file=#pid文件的路径 err_log=#错误日志的路径 #这两个都是定义的syslog中标志位,在后面需要写入日志到syslog中时使用 syslog_tag_mysqld=mysqld syslog_tag_mysqld_safe=mysqld_safe trap''12315#不允许程序在终端上被人打断(包括挂起,中断,退出,系统终止的情形) umask007#默认权限770,其他组用户对该程序创建的文件没有任何权限 #defaults变量记载使用的配置文件的信息 defaults= ca

  • Mybatis的基本要素--核心对象

      大家好啊,今天呢来说下Mybatis的核心对象,也就是说基本三要素.     》核心接口和类。     》Mybatis核心配置文件(mybatis-config.xml)     》SQL映射文件  一、下面首先介绍Mybatis的核心接口和类。  (1)  每个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心.  (2)  首先获取SqlSessionFactoryBuilder对象,可以根据XML配置文件或者Configuration类的实例构建该对象。  (3)  然后获取SqlSessionFactory对象,该对象实例可以通过SqlSessionFactoryBuilder对象来获取得。  (4)  有了SqlSessionFactory对象之后,就可以进而获取SqlSess

  • Spring中的八大设计模式

    一、简单工厂模式   又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。   简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。   spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。   二、工厂方法模式   通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。   一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。   三、单例模式   保证一个类仅有一个实例,并提供一个访问它的全局访问点。   spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。   四、适配器模式   在Sprin

  • 大数据学习节点

    那大数据处理技术怎么学习呢?首先我们要学习Java语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Java:大家都知道Java的方向有JavaSE、JavaEE、JavaME,学习大数据要学习那个方向呢?只需要学习Java的标准版JavaSE就可以了,像Servlet、JSP、Tomcat、Struts、Spring、Hibernate,Mybatis都是JavaEE方向的技术在大数据技术里用到的并不多,只需要了解就可以了,当然Java怎么连接数据库还是要知道的,像JDBC一定要掌握一下,有同学说Hibernate或Mybites也能连接数据库啊,为什么不学习一下,我这里不是说学这些不好,而是说学这些可能会用你很多时间,到最后工作中也不常用,我还没看到谁做大数据处理用到这两个东西的,当然你的精力很充足的话,可以学学Hibernate或Mybites的原理,不要只学API,这样可以增加你对Java操作数据库的理解,因为这两个技术的核心就是Java的反射加上JDBC的各种使用。 Linux:因为大数据相关软件都是在Linux上运行的,所以Linux要学习的扎实一些

  • 数列极限与实数系基本定理

    数列极限的定义与性质 如果\(\existsA\in\R\),\(\forall\varepsilon>0\),\(\existsN\)使得\(\foralln>N\)成立\(|a_n-A|<\varepsilon\),则称数列\(a_n\)的极限是\(A\),或\(a_n\)收敛于\(A\)。否则,称\(a_n\)发散。发散不同于极限趋向无穷,趋向无穷要求能使得\(\foralln>N\)成立\(|a_n|\)大于任意给定的\(G\)。 根据定义可以证明收敛数列极限是唯一的,收敛数列是有界的。数列极限有保号性,满足四则运算法则,满足夹逼性。收敛数列的每个子列都收敛,且收敛于同一极限。我们可以用定义判定数列收敛还是发散。 收敛数列的前缀和不一定收敛,调和级数就是反例。 实数系的基本定理 确界存在定理 任何一个有界数集都能找到实数作为它的上下确界,这是实数系的一个基本特点。有上界的数集有上确界:逐位考察十进制小数的每一位,每一次找出最大的那一个(从0到9枚举,肯定有一个最大的),最后我们就构造出了这个确界。下确界同理。 单调有界数列必收敛。 根据确界的定义,我们可

  • opnet

      一、修改默认的文件管理 1、以管理员身份运行opnet14.5 2、 3、初始默认是c盘下的op_madels 4、修改你默认的文件夹     二、 1、创建一个空场景 包含Manet模型 2、 出错   二、可参考计算机网络仿真指南 1、添加拓扑 2、设置属性 3、设置仿真参数 4、运行仿真 5、结果 三、添加新场景 1、 2、  

  • 老徐和阿珍的故事:CAP是什么?超级爱放P吗?

    人物背景: 老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。 阿珍,女,本名陈家珍,刚刚入职不久的实习生,虽然是职场菜鸟但聪明好学。据说是学校的四大校花之一,追求她的人从旺角排到了铜锣湾,不过至今还单身。 微信扫描二维码关注后回复「电子书」,获取12本Java必读技术书籍。 阿珍吃完饭刚刚回来,看到老徐正在吃方便面,说:“老徐,不至于吧。你为了还债,中午就吃这个呀?” 老徐不慌不忙地嚼着方便面,说:“这可是白象的方便面,国货之光,超级难买,我好不容易才买到的。” 阿珍坐了下来,说:“闻着还挺香,我也买点尝尝。对了,老徐,上午开会的时候,听你们总说CAP、CAP的,CAP是什么意思?超级爱放P吗?” 老徐嘴里方便面差点喷了出来,笑着说:“第一次听你这么解释的,来!我给你科普一下。” CAP是加州大学伯克利分校(UniversityofCaliforniaatBerkeley)的计算机教授 埃里克·布鲁尔(EricA.Brewer)在2000年的分布式计算原理研讨会(

  • Manacher算法

    #include<bits/stdc++.h> usingnamespacestd; constintN=1e4+10; intp[N]; voidmanacher(strings,int&st,int&x) { memset(p,0,sizeof(p)); stringfn; fn+='$'; intlen=s.length(); for(inti=0;i<len;i++) { fn+='#'; fn+=s[i]; } fn+='#'; cout<<s<<endl<<fn<<endl; intid=0,mx=0; len=fn.length(); for(inti=1;i<len;i++) { if(i<mx)p[i]=min(mx-i,p[2*id-i]); elsep[i]=1; while(i+p[i]<len&&fn[i-p[i]]==fn[i+p[i]])p[i]++; if(mx<p[

  • python3_String复习

    """ Time="2021-08-10" Author="Yblackd" Desc="python_String常用方法练习" """ (1)字符中大小写转换 S.lower():字母大写转换成小写。 S.upperO:字母小写转换成大写。 S.swapcase():字母大写转换小写,小写转换成大写。 S.title():将首字母大写。 (2)字符串搜索、替换 S.find(substr,[start,[end]]):返回S中出现substr的第一个字母的下下标,如果S中没有substr则返回-1,start和end作用就相当于在S[start:end]中按索。 S.count(subetr,[start,[end]]):计算substr在S中出现的次数。 S.replace(oldstr,newstr,[count]):把S中的oldstar替换为newstr,count为替换次数, S.strip([chars]):把S左右两端chars中有的字符全部去掉,一般用于去除空格。 S.lstrip([chars]):把S左端chars中所有的字符全部去掉。·S.strip(

  • 打印机服务器搭建 -cups

    系统:ubuntu14.04 http://foo2zjs.rkkda.com/INSTALL 安装cups sudoapt-getinstallcups 安装完成后,把打印机的数据线与服务器进行连接,并打开打印机的电源。然后在firefox浏览器中输入:         localhost:631 在cups管理界面中的“Administration”下的“Printers”下点击“AddPrinter”,按提示操作即完成配置。  完成配置后,要打印一份测试页,确保配置是正确的,再进行下一步,打印的测试页 .在cups服务器中,进入/etc/cups目录下,可以看到如图4所示的cupsd.conf和cupsd.conf.default两个文件cupsd.conf和cupsd.conf.default的内容其实是一样的,我把cupsd.conf.default文件理解为cupsd.conf文件的备份。 在上述代码中: a.把"Listenlocalhost:631"前加"#"注释

  • java.util.ConcurrentModificationException异常原因和解决方法

    问题:  在对集合迭代的时候,如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常,问题重现:      原因分析: 进入报错信息,定位LinkedHashMap719行,modCount!=expectedModCount 抛异常。 modCount是HashMap类中的一个成员变量,表示对Map的修改次数,每次调用put()方法或者remove()方法就会对modCount进行加1操作; expectedModCount:表示对Map修改次数的期望值,它的初始值为modCount。   对图一中的processes进行遍历时,modCount== expectedModCount; 1.循环开始,由于modCount和expectedModCount相等,第一次循环获取了对象Entry         2.进入循环体后,processes.remove(pid)方法实际上调用了父类HashMap的rem

  • C语言刷二叉树(三)提高部分

    236.二叉树的最近公共祖先 /* *1.后序遍历 *2.左子树和右子树每颗树都完整的遍历1遍 *3.回溯,利用左子树和右子树的返回值,来判断最近公共祖先 */ structTreeNode*lowestCommonAncestor(structTreeNode*root,structTreeNode*p,structTreeNode*q) { if(root==p||root==q||root==NULL)returnroot; structTreeNode*left=lowestCommonAncestor(root->left,p,q); structTreeNode*right=lowestCommonAncestor(root->right,p,q); if(left!=NULL&&right!=NULL)returnroot; if(left==NULL&&right!=NULL)returnright; returnleft; }复制   归纳如下三点: 求最小公共祖先,需要从底向上遍历,那么二叉树,只能通

  • bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型。于是就二分吧。令 \[\begin{align*}\frac{y_i+q_j}{x_i+p_j}&\geqmid\\y_i+q_j&\geqmid(x_i+p_j)\\(y_i-mid\cdotx_i)+(q_j-mid\cdotp_j)&\geq0\end{align*} \]这样\(x,y\)和\(p,q\)两组量就毫不相关了。下面就以\(x,y\)这一组量为例。 现在的问题是求出树上\(A\)到\(B\)的路径上的\(y_i-mid\cdotx_i\)的最大值。 容易发现,如果我们令\(y_i-mid\cdotx_i\)是关于\(mid\)的一次函数,在坐标系上可以表示一条以\(mid\)为\(x\)轴的直线。如果我们可以得到从\(A\)到\(B\)的路径上的每一个点的\(x\)和\(y\),那么可以得到很多的直线。我们需要的是很多条直线在\(mid\)处的最大值。 考虑只保留对于任意一个\(mid\)时取最大值

相关推荐

推荐阅读