package test;
import sun.reflect.misc.FieldUtil;
import java.io.*;
import java.nio.file.Files;
/**
* 文件操作 文件复制 文件上传的后端操作本质是文件夹复制IO流操作
* 那么javaweb项目文件上传是怎么操作的呢?
* 1前端使用multipart上传文件,后端获取文件的绝对路径建立file
* 2后端新建文件的保存目录路径 从而建立保存的新文件的file对象
* 3使用io流进行复制操作 或者使用java自带的文件复制工具的copy方法复制从而达到文件上传效果
*/
public class FileTest {
public static void main(String[] args) {
FileTest fileTest=new FileTest();
try {
//fileTest.byFile();//测试创建文件
//fileTest.testCopy();//测试字符流文件copy
//fileTest.byFileCopy();//调用java自带的文件复制方法
fileTest.byFileOutput();//字节流复制文件
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* File.separator 是\文件路径符会自动适应操作系统路径的写法比如windows下是\ linux下是/
* delete()需要注意的是,若此File对象所表示的是一个目录时,在删除时需要保证此为空目录才可以成功删除(目录中不能含有任何子项)
* 在创建文件时应该先创建文件目录的路径 当路径存在时才能创建文件
*/
public File byFile(String fileName) throws IOException {
//定义文件名
//String fileName = "Hello.txt";
//定义文件路径 D:\IdeaProject\demo1\src\test
String path="D:"+File.separator+"IdeaProject"+File.separator+"demo1"+File.separator+"src"+File.separator+"test";
File testFile = new File(path+File.separator+fileName);//创建文件虚拟路径
File fileParent = testFile.getParentFile();//返回的是File类型,可以调用exsit()等方法
//String fileParentPath = testFile.getParent();//返回的是String类型
//System.out.println("fileParent:" + fileParent);//D:\IdeaProject\demo1\src\test
//System.out.println("fileParentPath:" + fileParentPath);//D:\IdeaProject\demo1\src\test
/**fileParent是testFile的父级 而在这里testFile是Hello.txt它的父级指的虚拟路径
* 就是它所在的目录树 当路径和文件都还未创建时它仅是虚拟的路径,因此下面调用它的mkdir和createNewFile
* 方法才是真正在电脑硬盘上创建文件
*/
if (!fileParent.exists()) {//D:\IdeaProject\demo1\src\test 如果目录不存在就创建
fileParent.mkdirs();// 能创建多级目录
}
if (!testFile.exists()){//判断文件是否存在 不存在创建
testFile.createNewFile();//有路径才能创建文件
}
System.out.println(testFile);
String path1 = testFile.getPath();
String absolutePath = testFile.getAbsolutePath();//得到文件/文件夹的绝对路径
String getFileName = testFile.getName();//得到文件/文件夹的名字
System.out.println("path1:"+path1);//path1:D:\IdeaProject\demo1\src\test\Hello.txt
System.out.println("absolutePath:"+absolutePath);//absolutePath:D:\IdeaProject\demo1\src\test\Hello.txt
System.out.println("getFileName:"+getFileName);//Hello.txt
return testFile;
}
/**
* 注 文件件复制采用字符流时对于原文件有图片等信息时会存在问题,因些使用字节流复制更为妥当
* 文件的复制操作过程
* 1获得原文件 需要保证原文件存在
* 2创建新文件及路径
* 3通过io流 字节流或字符流 读取原文件
* 4写入新文件
*/
public void testCopy() throws IOException {
File sourceFile=new File("D:\\IdeaProject\\demo1\\test.txt");
//新创建文件采用上面的文件创建方法返回
File file=byFile("hello.txt");
//以下是原始的io流 字符流创建
//从原文件读取
FileInputStream fis=new FileInputStream(sourceFile);
InputStreamReader reader=new InputStreamReader(fis,"UTF-8");
BufferedReader br=new BufferedReader(reader);
//写入新文件file
FileOutputStream fos=new FileOutputStream(file);
OutputStreamWriter writer=new OutputStreamWriter(fos,"UTF-8");
PrintWriter pw=new PrintWriter(writer,true);
//实际读写
String valueString;
while ((valueString = br.readLine()) != null) {
pw.println(valueString);
}
//关闭流
br.close();
reader.close();
fis.close();
pw.close();
writer.close();
fos.close();
}
/**
* 采用字节流复制文件
*/
public void byFileOutput() throws IOException {
File sourcefile=new File("D:\\IdeaProject\\demo1\\src\\JavaSE-日期操作、集合框架3.pptx");
File file=new File("D:\\IdeaProject\\demo1\\src\\test\\hello2.pptx");
//字符输入流
FileInputStream fis=new FileInputStream(sourcefile);
FileOutputStream fos=new FileOutputStream(file);
int len =-1;
byte[] buf = new byte[1024];
while((len=fis.read(buf))!=-1){
fos.write(buf,0,len);
}
System.out.println("复制完毕");
fis.close();
fos.close();
}
/**
* 采用java自带的文件复制工具方法复制
*/
public void byFileCopy() throws IOException {
File sourcefile=new File("D:\\IdeaProject\\demo1\\src\\JavaSE-日期操作、集合框架3.pptx");
//注 java自带的copy的第二个路径是虚拟路径,不需要创建好文件 前提得创建好目录
File file=new File("D:\\IdeaProject\\demo1\\src\\test\\hello1.pptx");
Files.copy(sourcefile.toPath(),file.toPath());
}
}
05-09
214
09-19
5351