文件的简单操作 : 读、写(覆盖写、追加写)、复制、剪切、新增、删除

package javaFileStudy;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;

/**
 * 文件的简单操作 : 读、写(覆盖写、追加写)、复制、剪切、新增、删除
 * 特别提示:文件输入输出原则,有汉子尽量使用字符流,音频图片尽量使用字节流。
 *
 * @author xubo
 *
 */
public class File1 {

    /**
     * 步骤请一步步的调试,记得刷新项目
     *
     * @param args
     * @throws Exception
     */

    public static void main(String args[]) throws Exception {
        // String abnormalFilepath = ":tools_file1"; //异常路径
        String normalFilepath = "first/firstFile.txt"; // 相对路径
        String nextFilepath = "second/second/File.txt";
        System.out.println(System.getProperty("user.dir"));
        // File abnormalFile = new File(abnormalFilepath); abnormalFile.getParentFile()会抛出java.lang.NullPointedException

        // 测试新建文件 , 刷新项目,看项目文件夹下面是否有新文件生成
        File firstFile = File1.createNewFile(normalFilepath);

        // 从内存中向新建的文件写入数据
        // File1.writeFileFromMemory("许博将来会成功吗?", firstFile, false);

        // 从内存向新建的文件尾部追加内容
        // File1.writeFileFromMemory("\r\n必须的啊 !", firstFile, true); // 文件换行 \r\n 回车换行符

        // 测试复制文件
        // File nextFile = File1.copyFile(firstFile, nextFilepath);

        // 测试删除文件
        // File1.deleteFile(nextFile);

        // 测试剪切文件
        File secondFile = File1.cutFile(firstFile, nextFilepath);

        // 测试文件的基本信息方法
        System.out.println("文件名称\t" + firstFile.getName());
        System.out.println("文件路径\t" + firstFile.getPath());
        System.out.println("文件绝对路径\t" + firstFile.getAbsolutePath());
        System.out.println("文件大小\t" + firstFile.length());
    }

    /**
     * 根据指定目录创建文件
     * 只要文件不要目录(java file类包含目录)
     * filepath,如果使用的没有"D:/"等表示绝对路径,就会采用相对路径。以System.getProperty("user.dir")为参照
     * 考虑点 :1、是否已经存在 2、路径是否合法 3、是否是目录路径
     *
     * @param filepath
     * @return
     * @throws Exception
     */
    static File createNewFile(String filepath) throws Exception {
        File myFile = new File(filepath);
        if (myFile.exists() && !myFile.isFile()) { // 合法文件但是一个目录
            throw new RuntimeException("this is an already existed directory path ,not a filepath .");
        }
        if (!myFile.exists()) { // 如果文件不存在
            if (!myFile.getParentFile().exists()) { // 检查目录是否存在,不存在就创建,如果filepath为非法根目录(":tools_file1"),则抛nullPointed
                if (!myFile.getParentFile().mkdirs()) {// 创建指定目录,多级创建,非合法路径返回false;
                    throw new RuntimeException("this is not a normal filepath .");
                }
            }
            myFile.createNewFile();
            if (myFile.isDirectory()) { // 是个目录而不是一个文件 TODO 创建的文件夹是否要删除?
                // myFile.delete(); 当然还可以循环至上删除所有空文件夹,但没必要了
                throw new RuntimeException("this is a directory path ,not a filepath .");
            }
        }
        return myFile;
    }

    /**
     * 删除文件
     * 只有是文件或者空目录才可以删除
     */
    static boolean deleteFile(File file) {
        return file.delete();
    }

    /**
     * 向文件中写入String值
     * 使用字符流,特别是String中有汉子的时候,字节只能表示ASCII码的0~255,汉子不在此列,使用字节流会乱码的。
     *
     * @param isAddwrite
     *            : false 覆盖写入 ,true 追加写入
     */
    static void writeFileFromMemory(String content, File myfile, boolean isAddwrite) throws Exception {
        if (!myfile.exists()) { // 文件不存在 则跑出异常
            throw new RuntimeException("file is not exist");
        }
        if (content == null || content.equals("")) { // 内容为空 不用写
            return;
        }
        // 构建文件输入流,content不可能太大,不需要用缓冲流
        FileWriter fileWrite = new FileWriter(myfile, isAddwrite); // 字符流文件写入,flag为true则追加写入
        fileWrite.write(content);
        fileWrite.flush();
        fileWrite.close(); // 流使用完了要关闭
    }

    /**
     * 从一个文件读取数据,然后写入到另外一个文件
     * 从文件到文件,一般使用字节流,汉子也不会乱码
     */
    static void writeFileFromFile(File fromFile, File toFile, boolean isAddwrite) throws Exception {
        if (!fromFile.exists() || !toFile.exists()) {
            throw new RuntimeException("one or two files not exist ! ");
        }
        // 构建缓冲输入字节流 (相对于内存,从哪里输入)
        BufferedInputStream bif = new BufferedInputStream(new FileInputStream(fromFile));
        // 构建缓冲输出字节流 (相对于内存,输出到哪里去)
        BufferedOutputStream bof = new BufferedOutputStream(new FileOutputStream(toFile, isAddwrite));

        byte[] b = new byte[2000];
        int tmp = 0;
        while ((tmp = bif.read(b)) != -1) {
            bof.write(b, 0, tmp);
        }
        bof.flush(); // 刷新输出流,使得写入数据得以保存。新人可以试试不加看看文件内容有不
        bof.close(); // 输出流的资源远大于输入流,先关输出流!
        bif.close();
    }

    /**
     * 文件复制
     * 1、根据提供的filepath新建一个文件
     * 2、把当前文件的内容写入到新文件中。
     * 如果1操作完成,后续操作失败就删除新建的文件
     *
     * @throws Exception
     */
    static File copyFile(File oldFile, String newFilePath) throws Exception {
        File newFile = File1.createNewFile(newFilePath);
        try {
            File1.writeFileFromFile(oldFile, newFile, true);
        } catch (Exception e) {
            File1.deleteFile(newFile);
            throw e;
        }
        return newFile;
    }

    /**
     * 文件剪切
     * 1、文件复制
     * 2、删除老文件
     * 注意:如果新文件创建后,后续操作抛出异常就删除新创建的文件(copyFile已经完成这步骤)
     */
    static File cutFile(File oldFile, String newFilePath) throws Exception {
        File newFile = File1.copyFile(oldFile, newFilePath);
        File1.deleteFile(oldFile);
        return newFile;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值