前言
博主github
博主个人博客http://blog.healerjean.com
习惯了使用OSS傻瓜式上传,是不是都快忘记写原生的上传了,今天小米的项目中需要用一下,所以之类简单总结下 吧
1、File
1.1、创建文件
- 1、路径不存在,fileNameTxt.createNewFile() 会抛出异常
- 2、只有路径,不会创建出文件,也不会报错,无法创建,但是不会报错
- 3、路径存在,文件不存在,创建成功
- 4、没有路径,只有文件文件名,和则创建的文件和src一个级别,创建成功
/**
* 1、路径不存在,fileNameTxt.createNewFile() 会抛出异常
* 2、只有路径,不会创建出文件,也不会报错,无法创建,但是不会报错
* 3、路径存在,文件不存在,创建成功
* 4、没有路径,只有文件文件名,和则创建的文件和src一个级别,创建成功
*/
@Test
public void createFile() throws IOException {
String filePath = "newFile.txt";
File fileNameTxt = new File(filePath);
if (!fileNameTxt.exists()) {
fileNameTxt.createNewFile();
}
log.info("创建成功");
}
1.2、具备目录,创建文件
/**
* 2、创建有目录的文件
* 通过父的目录引入文件 directoryName 是父类
*/
@Test
public void createHavaDirectoryFile() throws IOException {
String directoryName = "D:/test/file/d02_createHavaDirectoryFile";
String fileName = "directoryName.txt";
File directoryNameTxt = new File(directoryName, fileName);
if (!directoryNameTxt.exists()) {
directoryNameTxt.createNewFile();
}
log.info("创建有目录的文件成功");
}
1.3、判断文件、目录
/**
* 3、 判断文件、目录
*/
@Test
public void judgeFileOrDirectory() {
File file = new File("D:/test/file/d02_createHavaDirectoryFile");
log.info("测试开始");
if (file.isFile()) {
log.info(file.getPath() + "是一个文件");
} else if (file.isDirectory()) {
log.info(file.getPath() + "是一个目录");
} else {
log.info(file.getPath() + "不是文件也不是目录");
}
}
1.4、创建目录
- 创建目录,即使路径不存在,也会创建相关路径,因为是mkdirs
/**
* 3、创建目录
* 判断是不是目录
* 创建目录,即使路径不存在,也会创建相关路径,因为是mkdirs
*/
@Test
public void createDirectory() {
//引入目录
File directoryName = new File("D:/test/healerjean/file");
if (!directoryName.exists()) {
directoryName.mkdirs();
log.info(directoryName.getPath() + "创建目录成功");
}
}
1.5、普通复制文件
- 第一个文件以及路径必须存在, 否则fileInputStream会报错
- 第二个文件可以不存在,但是路径必须存在,如果路径不存在则
new FileOutputStream
会报错
/**
* 5、复制文件
* Input第一个文件以及路径必须存在, 否则 FileOutputStream out = new FileOutputStream(outFilePath); FileNotFoundException 异常
* Output第二个文件可以不存在,但是路径必须存在,如果路径不存在则FileOutSteam会报错
*/
public void copyFile() throws IOException {
String inFilePath = "D:/test/file/d03_copyFile/exist/file.txt";
String outFilePath = "D:/test/file/d03_copyFile/no_exist/newfile.txt";
FileInputStream ins = new FileInputStream(inFilePath);
FileOutputStream out = new FileOutputStream(outFilePath);
byte[] b = new byte[1024];
int n = 0;
while ((n = ins.read(b)) != -1) {
out.write(b, 0, n);
}
ins.close();
out.close();
log.info("复制文件成功");
}
1.6.1、递归整个目录
file.listFiles()
是获取file这个对象也就是file这个目录下面的文件和文件夹的集合
/**
* 6、递归遍历整个目录的文件
* file.listFiles()是获取file这个对象也就是file这个目录下面的文件和文件夹的集合
*/
public void cycleFiles(File file) {
File[] files = file.listFiles();
for (File sonFile : files) {
if (sonFile.isDirectory()) {
cycleFiles(sonFile);
} else {
log.info(sonFile.getAbsolutePath());
}
}
log.info(file.getAbsolutePath());
}
@Test
public void testCycleFiles() {
File file = new File("D:/test");
cycleFiles(file);
}
1.6.2、 递归递归整个目录,并读取文件内容进行匹配
/**
* 6.2 、递归目录,读取文件内容进行匹配
* size :用于保留统计记录的个数
*/
private static int size = 1;
public void cycleFileContent(File file, String content) throws Exception {
File[] files = file.listFiles();
for (File f : files) {
if (f.isDirectory()) {
cycleFileContent(f, content);
} else {
String path = f.getPath();
FileInputStream fileInputStream = new FileInputStream(f);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
String str = new String(outStream.toByteArray(), "utf-8");
if (str.contains(content)) {
log.info("第【{}】个文件匹配到内容,路径为:{}", size, f.getPath());
size++;
}
}
}
}
@Test
public void testCycleFileContent() throws Exception {
File file = new File("D:/test");
String content = "co";
cycleFileContent(file, content);
}
1.7.1、读取文件内容
1.7.2、读取整个文件内容,转化为ByteArrayOutputStream读取
/**
* 7.1、读取文件内容:转化为ByteArrayOutputStream读取
*/
@Test
public void readFileContent() throws Exception {
File file = new File("D:\\test\\file\\file.txt");
FileInputStream fileInputStream = new FileInputStream(file);
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = fileInputStream.read(buffer)) != -1) {
byteOutputStream.write(buffer, 0, len);
}
String txtValue = new String(byteOutputStream.toByteArray(), "utf-8");
log.info(txtValue);
}
1.7.2、一行一行读取文件内容
- new BufferedReader(new InputStreamReader(new ByteArrayInputStream(txtByteArray), “utf-8”));
/**
* 7.读取文件内容
* 7.2、按照行,一行一行读取txt内容
*/
@Test
public void readFileLineContent() throws Exception {
File file = new File("D:\\test\\file\\file.txt");
FileInputStream fileInputStream = new FileInputStream(file);
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = fileInputStream.read(buffer)) != -1) {
byteOutputStream.write(buffer, 0, len);
}
byte[] txtByteArray = (byteOutputStream.toByteArray());
BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(txtByteArray), "utf-8"));
String lineContent = null;
int line = 0;
while ((lineContent = reader.readLine()) != null) {
line++;
log.info("第【{}】行的内容为:{}", line, lineContent);
}
}
1.8、根据字符串生成内容
/**
* 8、根据内容生成文件
*/
@Test
public void contentToFile() throws Exception {
String content = "我是大好人";
String fileName = UUID.randomUUID().toString().replace("-", "") + ".txt";
FileOutputStream outputStream = new FileOutputStream("D:/test/" + fileName);
byte[] buffer = content.getBytes("utf-8");
outputStream.write(buffer);
log.info("文件【{}】创建成功", fileName);
outputStream.close();
}
1.9、局域网文件调用
File file = new File("//192.168.31.1/file");
2、上传下载
2.1、上传
@ApiOperation(
value = "文件上传",
notes = "文件上传",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
response = String.class)
@PostMapping(value = "upload", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String upload(MultipartFile file) {
log.info("文件管理--------文件上传--------请求参数{}", file);
//1、确定文件存储目录
String javaIoTmpdir = System.getProperty("java.io.tmpdir");
File tempFile = new File(javaIoTmpdir);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
// 2、文件上传
String fileName = file.getOriginalFilename();
File outFile = new File(tempFile, fileName);
// InputStream inputStream = null;
// FileOutputStream fileOutputStream = null;
try {
// 1、inputstream -> 本地文件
FileUtils.copyInputStreamToFile(file.getInputStream(), outFile);
// 2、MultipartFile文件 -> 本地文件
// file.transferTo(outFile);
// 3、MultipartFile 文件获取字节 -> OutputStream
// byte[] bytes = file.getBytes();
// fileOutputStream = (new FileOutputStream(outFile));
// fileOutputStream.write(bytes);
// 4、InputStream -> OutputStream
// inputStream = file.getInputStream();
// fileOutputStream = (new FileOutputStream(outFile));
// IOUtils.copy(inputStream, fileOutputStream);
log.info("文件管理--------文件上传成功--------上传文件名{}", file.getOriginalFilename());
} catch (IOException e) {
log.info("文件上传失败");
throw new RuntimeException("文件上传失败", e);
} finally {
log.info("准备开始关闭流");
// try {
// if (fileOutputStream != null) {
// fileOutputStream.close();
// }
// } catch (IOException e) {
// log.error("流关闭失败", e);
// }
// try {
// if (inputStream != null) {
// inputStream.close();
// }
// } catch (IOException e) {
// log.error("流关闭失败", e);
// }
}
return fileName;
}
2.2、下载
@ApiOperation(
value = "文件下载",
notes = "文件下载",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
response = String.class)
@GetMapping(value = "download/{fileName}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public void downLoad(HttpServletResponse response, @PathVariable String fileName, Boolean preview) {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
log.info("文件管理--------文件下载--------请求参数{}", fileName);
String javaIoTmpdir <