java createNewFile创建文件失败 系统找不到指定的路径

文章讨论了两个Java方法用于创建并写入TXT文件,区别在于文件目录的创建时机。先执行方法1(创建目录后再创建文件)没有问题,而先执行方法2(直接创建文件)可能导致路径找不到的问题。问题源于createNewFile()方法在文件不存在时才会创建,不保证目录存在。

一、代码

package com.task.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class T5 {

    public static void main(String[] args) throws IOException {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        T5.generateText2("E:/1/2/3/4/5/file2.txt",list);
        T5.generateText1("E:/1/2/3/4/5/file1.txt",list);

    }

    public static void generateText1(String fileName,List<String> list) throws IOException{

        /* 写入Txt文件 */
        File writename = new File(fileName);
        if(!writename.isFile() && !writename.exists()){ //判断文件是否存在){}
            String  path = fileName.substring(0,fileName.lastIndexOf("/"));
            new File(path).mkdirs();
            String name = fileName.substring(fileName.lastIndexOf("/"));
            new File(name).createNewFile();
        }
        BufferedWriter out = new BufferedWriter(new FileWriter(writename,true));
        if (list.size()>0) {
            for (int i = 0; i <list.size(); i++) {
                out.write(list.get(i));
            }
        }
        out.flush(); // 把缓存区内容压入文件
        out.close(); // 最后记得关闭文件
        System.out.println("1文件创建成功 = " + fileName);
    }

    /* 写入Txt文件 */
    public static void generateText2(String fileName,List<String> list) throws IOException{
        File writename = new File(fileName);
        //判断文件是否存在
        if(!writename.isFile() && !writename.exists()){
            // 创建新文件
            writename.createNewFile();
        }
        BufferedWriter out = new BufferedWriter(new FileWriter(writename,true));
        if (list.size()>0) {
            for (int i = 0; i <list.size(); i++) {
                out.write(list.get(i));
            }
        }
        out.flush(); // 把缓存区内容压入文件
        out.close(); // 最后记得关闭文件
        System.out.println("2文件创建成功 = " + fileName);
    }
}

 二、测试结果比较

当先执行方法1,再执行方法2,就没问题 

 创建文件如图所示

 

 先执行方法2,再执行方法1,就会出现路径找不到

 三、代码分析

        在两个方法中,后半段的“向文件中填充数据”都是相同的,不同的是,前者先创建了文件目录 new File(path).mkdirs(); ,后创建了文件 new File(name).createNewFile();  而后者直接创建文件。

        查看createNewFile源码:

        Atomically创建一个新的空文件,该文件由该抽象路径名命名,当且仅当具有该名称的文件还不存在时。对于可能影响文件的所有其他文件系统活动,检查文件是否存在以及如果文件不存在则创建文件是一个原子操作。
        注意:此方法不应用于文件锁定,因为无法使生成的协议可靠地工作。应该使用FileLock功能。
        返回:如果命名文件不存在并且已成功创建,则为true;如果命名文件已存在,则为false 

 

        表示平台本地文件系统的FileSystem对象。

        此抽象路径名的规范化路径名字符串。规范化路径名字符串使用默认的名称分隔符,并且不包含任何重复或冗余的分隔符。 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值