这里给大家分享一个java操作ftp的demo样例:
package com.dragonsoft.service;
import com.dragonsoft.service.SaveFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
/**
*
* 2022-07-08 17:47:50
* 2022-07-08 17:47:50.334 INFO 21172 --- [ main] com.dragonsoft.FtpDataApplication : Started FtpDataApplication in 3.024 seconds (JVM running for 6.929)
* 总文件数:26
*******************上传FTP********************
2022-07-08 17:50:12
没有可上传文件...D:\360\xxx
*******************上传FTP********************
2022-07-08 17:50:12
没有可上传文件...D:\360\xxx
*******************上传FTP********************
2022-07-08 17:50:50
没有可上传文件...D:\360\xxx
*
*/
@Configuration
@EnableScheduling
public class SaveFile
{
//FTP的IP
private String ip = "x.x.x.x";
//FTP的端口
private int port = 2122;
//FTP的账号
private String username = "ftp账号";
//FTP的密码
private String password = "ftp密码";
//待上传文件路径-会上传该文件夹下所有文件 包括子文件夹 各个文件夹中不要有同名文件
private String path = "D:\\360\\xxx";
private String localCharset = "GBK";
private String serverCharset = "ISO-8859-1";
//每隔一分钟
@Scheduled(fixedRate = 60000L)
public void save() {
System.out.println("*******************上传FTP********************");
Date totay = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dayStr = sdf.format(totay);
System.out.println(dayStr);
FTPClient ftpClient = null;
try {
ftpClient = new FTPClient();
ftpClient.connect(this.ip,this.port);
ftpClient.setFileType(2);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(2);
ftpClient.setFileTransferMode(10);
ftpClient.login(this.username, this.password);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
ftpClient.disconnect();
System.out.println("FTP连接失败");
}
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
this.localCharset = "UTF-8";
}
List<File> allFile = getAllFile(new File(this.path));
if (allFile == null) {
System.out.println("没有可上传文件..." + this.path);
}
if (allFile != null && allFile.size() > 0) {
System.out.println("总文件数:" + allFile.size());
AtomicInteger successCount = new AtomicInteger();
FTPClient finalFtpClient = ftpClient;
allFile.forEach(file -> {
System.out.println("正在上传---> " + file.getName());
if (uploadFile(file, finalFtpClient)) {
System.out.println("上传成功---> " + file.getName());
file.delete();
System.out.println("本地文件:" + file.getName() + "已删除");
successCount.getAndIncrement();
} else {
System.out.println("上传失败--> " + file.getName());
}
});
System.out.println("本次上传成功数:" + successCount);
System.out.println("**********************************");
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public boolean uploadFile(File localFile, FTPClient ftpClient) {
FileInputStream fis = null;
try {
fis = new FileInputStream(localFile);
String fileName = localFile.getName();
System.out.println("文件大小" + localFile.length());
System.out.println(ftpClient.printWorkingDirectory());
boolean b = ftpClient.storeFile(new String(fileName.getBytes(this.localCharset), this.serverCharset), fis);
System.out.println(b);
return b;
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
public List<File> getAllFile(File dirFile) {
if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()) {
return null;
}
File[] childrenFiles = dirFile.listFiles();
if (Objects.isNull(childrenFiles) || childrenFiles.length == 0) {
return null;
}
List<File> files = new ArrayList<File>();
for (File childFile : childrenFiles) {
if (childFile.isFile()) {
files.add(childFile);
} else {
List<File> cFiles = getAllFile(childFile);
if (!Objects.isNull(cFiles) && !cFiles.isEmpty()) {
files.addAll(cFiles);
}
}
}
return files;
}
}
为什么用 @Scheduled(fixedRate = 60000L)
取1分钟间隔 放置超过一分钟的上传内容:
F:\2020\java\jdk1.8\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:52311,suspend=y,server=n -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:C:\Users\zhaoxinglu\AppData\Local\JetBrains\IntelliJIdea2020.2\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "F:\2020\java\jdk1.8\jre\lib\charsets.jar;F:\2020\java\jdk1.8\jre\lib\deploy.jar;F:\2020\java\jdk1.8\jre\lib\ext\access-bridge-64.jar;F:\2020\java\jdk1.8\jre\lib\ext\cldrdata.jar;F:\2020\java\jdk1.8\jre\lib\ext\dnsns.jar;F:\2020\java\jdk1.8\jre\lib\ext\jaccess.jar;F:\2020\java\jdk1.8\jre\lib\ext\jfxrt.jar;F:\2020\java\jdk1.8\jre\lib\ext\localedata.jar;F:\2020\java\jdk1.8\jre\lib\ext\nashorn.jar;F:\2020\java\jdk1.8\jre\lib\ext\sunec.jar;F:\2020\java\jdk1.8\jre\lib\ext\sunjce_provider.jar;F:\2020\java\jdk1.8\jre\lib\ext\sunmscapi.jar;F:\2020\java\jdk1.8\jre\lib\ext\sunpkcs11.jar;F:\2020\java\jdk1.8\jre\lib\ext\zipfs.jar;F:\2020\java\jdk1.8\jre\lib\javaws.jar;F:\2020\java\jdk1.8\jre\lib\jce.jar;F:\2020\java\jdk1.8\jre\lib\jfr.jar;F:\2020\java\jdk1.8\jre\lib\jfxswt.jar;F:\2020\java\jdk1.8\jre\lib\jsse.jar;F:\2020\java\jdk1.8\jre\lib\management-agent.jar;F:\2020\java\jdk1.8\jre\lib\plugin.jar;F:\2020\java\jdk1.8\jre\lib\resources.jar;F:\2020\java\jdk1.8\jre\lib\rt.jar;F:\2022\sanleiqu\esint\gaplatform\ftpdata\target\classes;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\commons-net\commons-net\3.5\commons-net-3.5.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\boot\spring-boot-starter-web\2.3.1.RELEASE\spring-boot-starter-web-2.3.1.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\boot\spring-boot-starter\2.3.1.RELEASE\spring-boot-starter-2.3.1.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\boot\spring-boot\2.3.1.RELEASE\spring-boot-2.3.1.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\boot\spring-boot-autoconfigure\2.3.1.RELEASE\spring-boot-autoconfigure-2.3.1.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\boot\spring-boot-starter-logging\2.3.1.RELEASE\spring-boot-starter-logging-2.3.1.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\boot\spring-boot-starter-json\2.3.1.RELEASE\spring-boot-starter-json-2.3.1.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\com\fasterxml\jackson\core\jackson-databind\2.11.0\jackson-databind-2.11.0.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\com\fasterxml\jackson\core\jackson-annotations\2.11.0\jackson-annotations-2.11.0.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\com\fasterxml\jackson\core\jackson-core\2.11.0\jackson-core-2.11.0.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.0\jackson-datatype-jdk8-2.11.0.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.0\jackson-datatype-jsr310-2.11.0.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.0\jackson-module-parameter-names-2.11.0.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\boot\spring-boot-starter-tomcat\2.3.1.RELEASE\spring-boot-starter-tomcat-2.3.1.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\apache\tomcat\embed\tomcat-embed-core\9.0.36\tomcat-embed-core-9.0.36.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.36\tomcat-embed-websocket-9.0.36.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\spring-web\5.2.7.RELEASE\spring-web-5.2.7.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\spring-beans\5.2.7.RELEASE\spring-beans-5.2.7.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\spring-webmvc\5.2.7.RELEASE\spring-webmvc-5.2.7.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\spring-aop\5.2.7.RELEASE\spring-aop-5.2.7.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\spring-context\5.2.7.RELEASE\spring-context-5.2.7.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\spring-expression\5.2.7.RELEASE\spring-expression-5.2.7.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\projectlombok\lombok\1.18.12\lombok-1.18.12.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\spring-core\5.2.7.RELEASE\spring-core-5.2.7.RELEASE.jar;F:\2020\java\apache-maven-3.3.9-bin\apache-maven-MyRepository\org\springframework\spring-jcl\5.2.7.RELEASE\spring-jcl-5.2.7.RELEASE.jar;D:\IntelliJ IDEA 2020.2.4\lib\idea_rt.jar" com.dragonsoft.FtpDataApplication
Connected to the target VM, address: '127.0.0.1:52311', transport: 'socket'
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.1.RELEASE)
2022-07-08 17:47:48.075 INFO 21172 --- [ main] com.dragonsoft.FtpDataApplication : Starting FtpDataApplication on DESKTOP-VAGKI21 with PID 21172 (F:\2022\sanleiqu\esint\gaplatform\ftpdata\target\classes started by zhaoxinglu in F:\2022\sanleiqu\esint\gaplatform\ftpdata)
2022-07-08 17:47:48.080 INFO 21172 --- [ main] com.dragonsoft.FtpDataApplication : No active profile set, falling back to default profiles: default
2022-07-08 17:47:49.755 INFO 21172 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-07-08 17:47:49.778 INFO 21172 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-07-08 17:47:49.778 INFO 21172 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.36]
2022-07-08 17:47:49.896 INFO 21172 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-07-08 17:47:49.897 INFO 21172 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1716 ms
2022-07-08 17:47:50.111 INFO 21172 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2022-07-08 17:47:50.275 INFO 21172 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2022-07-08 17:47:50.319 INFO 21172 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
*******************上传FTP********************
2022-07-08 17:47:50
2022-07-08 17:47:50.334 INFO 21172 --- [ main] com.dragonsoft.FtpDataApplication : Started FtpDataApplication in 3.024 seconds (JVM running for 6.929)
总文件数:26
正在上传---> Postman-win64-7.9.0-Setup - 副本 (2) - 副本 - 副本.exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 (2) - 副本 - 副本.exe
本地文件:Postman-win64-7.9.0-Setup - 副本 (2) - 副本 - 副本.exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 (2) - 副本.exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 (2) - 副本.exe
本地文件:Postman-win64-7.9.0-Setup - 副本 (2) - 副本.exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 (2).exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 (2).exe
本地文件:Postman-win64-7.9.0-Setup - 副本 (2).exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 (3) - 副本.exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 (3) - 副本.exe
本地文件:Postman-win64-7.9.0-Setup - 副本 (3) - 副本.exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 (3).exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 (3).exe
本地文件:Postman-win64-7.9.0-Setup - 副本 (3).exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 (4) - 副本.exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 (4) - 副本.exe
本地文件:Postman-win64-7.9.0-Setup - 副本 (4) - 副本.exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 (4).exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 (4).exe
本地文件:Postman-win64-7.9.0-Setup - 副本 (4).exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 - 副本 (2).exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 - 副本 (2).exe
本地文件:Postman-win64-7.9.0-Setup - 副本 - 副本 (2).exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 - 副本 - 副本.exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 - 副本 - 副本.exe
本地文件:Postman-win64-7.9.0-Setup - 副本 - 副本 - 副本.exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本 - 副本.exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本 - 副本.exe
本地文件:Postman-win64-7.9.0-Setup - 副本 - 副本.exe已删除
正在上传---> Postman-win64-7.9.0-Setup - 副本.exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup - 副本.exe
本地文件:Postman-win64-7.9.0-Setup - 副本.exe已删除
正在上传---> Postman-win64-7.9.0-Setup.exe
文件大小78096480
/
true
上传成功---> Postman-win64-7.9.0-Setup.exe
本地文件:Postman-win64-7.9.0-Setup.exe已删除
正在上传---> signDoctor2022-01-17.tar.gz
文件大小1883786168
/
true
上传成功---> signDoctor2022-01-17.tar.gz
本地文件:signDoctor2022-01-17.tar.gz已删除
正在上传---> signDoctor2022-02-11.tar.gz
文件大小1888569347
/
true
上传成功---> signDoctor2022-02-11.tar.gz
本地文件:signDoctor2022-02-11.tar.gz已删除
正在上传---> xshell - 副本 (2) - 副本 - 副本.zip
文件大小29073459
/
true
上传成功---> xshell - 副本 (2) - 副本 - 副本.zip
本地文件:xshell - 副本 (2) - 副本 - 副本.zip已删除
正在上传---> xshell - 副本 (2) - 副本.zip
文件大小29073459
/
true
上传成功---> xshell - 副本 (2) - 副本.zip
本地文件:xshell - 副本 (2) - 副本.zip已删除
正在上传---> xshell - 副本 (2).zip
文件大小29073459
/
true
上传成功---> xshell - 副本 (2).zip
本地文件:xshell - 副本 (2).zip已删除
正在上传---> xshell - 副本 (3) - 副本.zip
文件大小29073459
/
true
上传成功---> xshell - 副本 (3) - 副本.zip
本地文件:xshell - 副本 (3) - 副本.zip已删除
正在上传---> xshell - 副本 (3).zip
文件大小29073459
/
true
上传成功---> xshell - 副本 (3).zip
本地文件:xshell - 副本 (3).zip已删除
正在上传---> xshell - 副本 (4) - 副本.zip
文件大小29073459
/
true
上传成功---> xshell - 副本 (4) - 副本.zip
本地文件:xshell - 副本 (4) - 副本.zip已删除
正在上传---> xshell - 副本 (4).zip
文件大小29073459
/
true
上传成功---> xshell - 副本 (4).zip
本地文件:xshell - 副本 (4).zip已删除
正在上传---> xshell - 副本 - 副本 (2).zip
文件大小29073459
/
true
上传成功---> xshell - 副本 - 副本 (2).zip
本地文件:xshell - 副本 - 副本 (2).zip已删除
正在上传---> xshell - 副本 - 副本 - 副本.zip
文件大小29073459
/
true
上传成功---> xshell - 副本 - 副本 - 副本.zip
本地文件:xshell - 副本 - 副本 - 副本.zip已删除
正在上传---> xshell - 副本 - 副本.zip
文件大小29073459
/
true
上传成功---> xshell - 副本 - 副本.zip
本地文件:xshell - 副本 - 副本.zip已删除
正在上传---> xshell - 副本.zip
文件大小29073459
/
true
上传成功---> xshell - 副本.zip
本地文件:xshell - 副本.zip已删除
正在上传---> xshell.zip
文件大小29073459
/
true
上传成功---> xshell.zip
本地文件:xshell.zip已删除
本次上传成功数:26
**********************************
*******************上传FTP********************
2022-07-08 17:50:12
没有可上传文件...D:\360\xxx
*******************上传FTP********************
2022-07-08 17:50:12
没有可上传文件...D:\360\xxx
*******************上传FTP********************
2022-07-08 17:50:50
没有可上传文件...D:\360\xxx
*******************上传FTP********************
2022-07-08 17:51:50
没有可上传文件...D:\360\xxx
*******************上传FTP********************
2022-07-08 17:52:50
没有可上传文件...D:\360\xxx
字典
Dictionary 字典
列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合。
键(key)必须使用不可变类型。
在同一个字典中,键(key)必须是唯一的。
dic = {} dic["name"] = "wangergou"; dic["age"] = 18; dic["sex"] = "nan"; print(dic) print(dic.keys()) print(dic.values())
{'name': 'wangergou', 'age': 18, 'sex': 'nan'} dict_keys(['name', 'age', 'sex']) dict_values(['wangergou', 18, 'nan'])
dict() 构造方法
dic1 = dict([("name","wanger"),("age",18),("sex","nv")]) dic2 = dict(name ="lisi",age=18,sex=24) print(dic1) print(dic2) dic1.clear() print(dic1)
{'name': 'wanger', 'age': 18, 'sex': 'nv'} {'name': 'lisi', 'age': 18, 'sex': 24} {}
- 1、字典是一种映射类型,它的元素是键值对。
- 2、字典的关键字必须为不可变类型,且不能重复。
- 3、创建空字典使用 { }。