文件操作文件复制

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());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值