题目要求:
- 完成以下操作,模拟用户上传文件。接收用户输入的文件路径,进行以下功能:
- 如果文件不存在,提示错误信息。
- 如果用户输入的不是文件,是目录需要提示错误信息。
- 如果文件存在,则自动将文件保存到预先设置的目录中,如:d:/user_images。
- 需要为上传到服务器中的文件重命名,文件名的格式:yyyyMMddHHmmss+6位随机数(必须为20位).扩展名。如:20230802153621021456.mp4
- 上传文件的扩展名必须与上传文件的扩展名保持一致。
- 上传成功后,显示共用秒数。
- 上传失败时,显示错误信息。
代码实现
package com.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;
/**
* 1.完成以下操作,模拟用户上传文件。接收用户输入的文件路径,进行以下功能:
* a) 如果文件不存在,提示错误信息。
* b) 如果用户输入的不是文件,是目录需要提示错误信息。
* c) 如果文件存在,则自动将文件保存到预先设置的目录中,如:d:/user_images。
* d) 需要为上传到服务器中的文件重命名,文件名的格式:yyyyMMddHHmmss+6位随机数(必须为20位).扩展名。
* 如:20230802153621021456.mp4
* e) 上传文件的扩展名必须与上传文件的扩展名保持一致。
* f) 上传成功后,显示共用秒数。
* g) 上传失败时,显示错误信息。
*/
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入想要复制的文件的整体路径:");
String fileName = sc.nextLine();
// 根据用户输入的路径,创建文件对象
File file = new File(fileName);
// 判断文件或目录是否存在
if (file.exists()) {
// 判断是否是目录(无法复制目录)
if (file.isDirectory()) {
System.out.println("不能复制目录!");
return;
}
// 复制文件 D:\VSCode-win32-x64-1.80.0.zip
// 文件上传目录
String path = "D:/tests/";
// 文件上传的名字
String name1 = createFileName();
// 获得用户输入复制文件中 点 最后一次出现的位置,如果没找到返回-1
int index = fileName.lastIndexOf('.');
if (index == -1) {
System.out.println("没有找到文件拓展名!");
sc.close();
return;
}
// 上传文件的拓展名
String name2 = fileName.substring(index);
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
input = new BufferedInputStream(new FileInputStream(file));
output = new BufferedOutputStream(new FileOutputStream(path + name1 + name2));
byte[] array = new byte[255];
Date start = new Date();
System.out.println("复制开始……");
int count = input.read(array, 0, array.length);
while (count != -1) {
output.write(array, 0, count);
count = input.read(array, 0, array.length);
}
output.flush();
Date end = new Date();
System.out.println("复制完毕!");
System.out.println("用时:" + (end.getTime() - start.getTime()) / 1000.0);
} catch (FileNotFoundException e) {
System.out.println("文件找不到!");
e.printStackTrace();
} catch (IOException e) {
System.out.println("复制失败!");
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (output != null) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
System.out.println("文件不存在!");
}
}
/**
* 返回指定格式的字符串,格式yyyyMMddHHmmSS+6位随机数
*/
private static String createFileName() {
LocalDateTime dateTime = LocalDateTime.now();
StringBuilder s = new StringBuilder();
s.append(dateTime.getYear());
s.append(String.format("%02d", dateTime.getMonthValue()));
s.append(String.format("%02d", dateTime.getDayOfMonth()));
s.append(String.format("%02d", dateTime.getHour()));
s.append(String.format("%02d", dateTime.getMinute()));
s.append(String.format("%02d", dateTime.getSecond()));
// 生成6位随机数
Random r = new Random();
s.append(r.nextInt(100000, 1000000));
return s.toString();
}
}
运行结果: