0715_3.第三版提升上传文件到ftp服务器
作者:互联网
有关缓冲区摘抄如下:
什么是缓冲区
缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:
使用缓冲区有这么两个好处:
1、减少实际的物理读写次数
2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数
举个简单的例子,比如A地有1w块砖要搬到B地
由于没有工具(缓冲区),我们一次只能搬一本,那么就要搬1w次(实际读写次数)
如果A,B两地距离很远的话(IO性能消耗),那么性能消耗将会很大
但是要是此时我们有辆大卡车(缓冲区),一次可运5000本,那么2次就够了
相比之前,性能肯定是大大提高了。
而且一般在实际过程中,我们一般是先将文件读入内存,再从内存写出到别的地方
这样在输入输出过程中我们都可以用缓存来提升IO性能。
疑问
一般的输入输出流数据的方向都是:内存 <---->硬盘,为什么用缓冲流就快?
因为你调用OS接口读硬盘是一块一块读的 读一个字节和8K个字节实际上花的时间是一样的 buffer就是封装了一个内存页面大小的字节数组 把一次读的所有字节都缓存起来 下次要访问就直接从内存里已经缓存好的读 自然比直接从硬盘里读要快
比起一次读取一个字节其他的舍弃,利用缓冲区将部分数据缓存到内存中,远比一次次硬盘读取速度要快的多!!
-------------------------------------------------------------------------------
实现向ftp上传图片的代码如下:
/**
* Description: 向FTP服务器上传文件
* @param ftpPath FTP服务器文件存放路径
* @param multipartFile 上传到FTP服务器上的文件
* @return 成功返回文件名,比如 uuid.jpg,失败返回null
*/
public String uploadFileToFtpService(String ftpPath, MultipartFile multipartFile) {
//截取文件格式后缀
String fileSuffix = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1);
//uuid.格式 是文件名
String fileName = UUID.randomUUID() + "."+fileSuffix;
FTPClient ftpClient=null;
try {
//连接ftp
ftpClient = getFTPConnection();
if(ftpClient==null){
logger.error("ftp服务器连接失败");
return null;
}
/*该部分为逐级创建,并切换到工作目录*/
String[] split = ftpPath.split("/");
for (String str : split) {
if(StringUtils.isBlank(str)) {
continue;
}
if (!ftpClient.changeWorkingDirectory(str)) {//注意这步必须加上进入目录,否则当目录不存在时候只创建目录不进入则文件写入有问题
//防止中文编码导致目录找不到
String directory = new String(str.getBytes("UTF-8"),"iso-8859-1");
//目录不存在则创建目录
ftpClient.makeDirectory(directory);
//更换目录到当前目录,否则目录不存在时只是创建目录而不能写入文件到该目录
ftpClient.changeWorkingDirectory(directory);
}
}
ftpClient.enterLocalPassiveMode();//工作模式被动
//文件以流方式读取,采用二进制流传输,设置缓冲区,速度快
InputStream input = multipartFile.getInputStream();
OutputStream out = ftpClient.storeFileStream(fileName);//远程文件名
byte[] byteArray = new byte[4096];
int read = 0;
while ((read = input.read(byteArray)) != -1) {
out.write(byteArray, 0, read);
}
out.close();
ftpClient.logout();
} catch (IOException e) {
logger.error(e.getMessage());
return null;
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return fileName;
}
/**
* 连接FTP服务器
* @return
*/
private FTPClient getFTPConnection(){
try {
//创建ftp客户端
FTPClient ftpClient = new FTPClient();
//FTP服务器端口,默认21,使用默认端口可以不写
ftpClient.connect(ftpHost,Integer.parseInt(ftpPort));// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftpClient.login(ftpUsername, ftpPassword);// 登录
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.info("登录成功");
ftpClient.setControlEncoding(LOCAL_CHARSET);
ftpClient.enterLocalPassiveMode();//设置被动模式
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//设置传输模式,一定要设置二进制传输格式
return ftpClient;
}else{
//登录失败返回Null
ftpClient.disconnect();
return null;
}
} catch (IOException e) {
return null;
}
}
标签:ftp,return,String,FTP,第三版,内存,缓冲区,0715,ftpClient 来源: https://www.cnblogs.com/shaowangwu/p/16481023.html