【问题标题】:How can I create a new file every time I run the program using Java每次使用 Java 运行程序时如何创建一个新文件
【发布时间】:2017-09-02 09:53:25
【问题描述】:

以下是我编写的代码,它基本上遍历文件夹并从 xml 文件中提取数据并将数据输出到 CSV 文件中。所有这些都有效。但我想在每次运行程序时创建新的输出 csv 文件。如果你们能提供一些示例或修改我处理过的代码,我将不胜感激。请我从几个小时以来一直试图找出解决方案。

public class MergeCode1 {

    public void walk(String path,Boolean is_parent) throws Exception {
        File filePath = new File ("C:/Users/Vishvesh Savant/Desktop/Mirriad/");
        System.out.println(filePath);


        File root = new File(path); //Input File Path
        File[] list = root.listFiles();

        while(is_parent == false);
        {
            Random rand = new Random();
            int value;
            value=rand.nextInt(50)+1;
            filePath = new File (("C:/Users/Vishvesh Savant/Desktop/Mirriad/"+"new_one"+value+".csv"));
        }
        try{
            if (list == null) return;
            System.out.println("2");

            for (File f : list ) {
                DocumentBuilderFactory dbfactory = null;
                DocumentBuilder dbuilder = null;
                Document doc = null;

                if (f.isDirectory()) {
                    walk(f.getPath(),false);
                    System.out.println( "Dir:" + f.getAbsolutePath());
                }
                else {
                    System.out.println( "File:" + f.getAbsolutePath());
                    dbfactory = DocumentBuilderFactory.newInstance();
                    dbuilder = dbfactory.newDocumentBuilder();
                    doc =  dbuilder.parse(f.getAbsolutePath());
                    doc.getDocumentElement().normalize();

                    NodeList list1 = doc.getElementsByTagName("product");                   
                    FileWriter fileWriter = new FileWriter(filePath, true);

//                  String Fileheader="uid,title";
//                  fileWriter.append(Fileheader.toString());
//                  fileWriter.append("\n");

                    for(int i=0; i<list1.getLength();i++){
                        Node node = list1.item(i);
                        if(node.getNodeType() == Node.ELEMENT_NODE){
                            Element element = (Element) node;
                            fileWriter.append(element.getAttribute("uid"));
                            System.out.println(element.getAttribute("uid"));
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("title").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("actor").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("actor").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("director").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("director").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("country").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("country").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("format").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("format").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("bitrate").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("bitrate").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("fps").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("fps").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("aspect").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("aspect").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append( element.getElementsByTagName("width").item(0).getTextContent());
                            System.out.println(element.getElementsByTagName("width").item(0).getTextContent());
                            fileWriter.append(",");
                            fileWriter.append(element.getBaseURI());
                            fileWriter.append(element.getAttribute("uid"));
                            fileWriter.append(element.getElementsByTagName("format").item(0).getTextContent());

                            fileWriter.append("\n");

                            //fileWriter.flush();
                            fileWriter.close();
                        }
                    }
                }
            }
        }
        catch (Exception e) {
            System.out.println("Error!!!");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {

        MergeCode1 fw = new MergeCode1();
        fw.walk("C:/Users/Vishvesh Savant/Desktop/Mirriad/Test",true);  
    }
}

【问题讨论】:

  • 什么是is_parent?您当前的代码以何种方式不满足要求?您是否意识到您的 while 循环中有错误的 ;
  • 是的,我在最近的努力中删除了 while 循环。 “is_parent”基本上是我的“public void walk”,子方法是“walk(f.getPath(),false)”。我创建了一个标志来检查何时进行父调用以及何时进行子调用。因此,当程序第一次运行时,将调用“父级”,在这种情况下,将创建一个新的 csv 文件。问题:我无法在每次运行程序时创建一个新的 csv,在我进行新的更改后,会为程序从位于不同文件夹中的 xml 文件中检索的每条记录创建一个新的 csv。这是不正确的。
  • 如果你想为你最近的工作找到一个解决方案,你必须发布你的最新工作。这肯定很明显吗?

标签: java xml csv


【解决方案1】:

代替这一行:

filePath = new File (("C:/Users/Vishvesh Savant/Desktop/Mirriad/"+"new_one"+value+".csv"));

你可以使用:

File filePath = File.createTempFile("out_", ".csv", new File("C:/Users/Vishvesh Savant/Desktop/Mirriad/"));

这将在给定目录中生成唯一的文件名,前缀为“out_”,后缀为“.csv”。

【讨论】:

    【解决方案2】:

    我理解你的方式,你想把一个调用的所有记录从 main 放到同一个文件中;执行此操作的方法是在 walk 方法之外创建 CSV 的 filePath(在您的情况下为 main),并将方法签名更改为:

    public void walk(String path,Boolean is_parent, String filePath) throws Exception {
    

    那么你的所有调用都有相同的文件名 - 也适用于你的子目录......假设你也将它传递给反射调用(我相信这是你的意图 - 对吗?)

    【讨论】:

    • 您的回答让我想到了更改代码。进行了一些更改并添加了一些功能,现在程序在每次手动执行程序后都会创建新的 csv 文件。
    【解决方案3】:

    使用System.currentTimeMillis()

    long value;
    value = System.currentTimeMillis();
    

    【讨论】:

    • 这只是给我时间,我认为不会解决问题
    • 因为每次调用它都会返回不同的值,所以你会有不同的文件名。如果您更改系统时间或运行程序的多个实例,您可能很少有重复的文件名。在这种情况下,您需要在创建文件之前检查文件是否存在。
    • 如果你想100%确定文件不存在你应该使用File类的exists方法。
    • 谢谢..在我的最终程序中使用了你提供的代码。
    【解决方案4】:

    使用“创建”函数存储值,然后将该值附加到 Main 方法中。每次程序在那里运行时都会调用 Create,方法是使用记录创建一个新的 csv 文件。

    public void clean(FileWriter fileWriter) throws IOException{
            fileWriter.append("\n");
            fileWriter.flush();
            fileWriter.close();
        }
    
    public static long create(){
            long value;
            value = System.currentTimeMillis();
            return value;
        }
    
        public static void main(String[] args) throws Exception {
            long value = create();
            File filePath = new File ("G:/Mirriad/test_"+value+".csv");
            String Fileheader="UID,TITLE,ACTOR,DIRECTOR,COUNTRY,FORMAT,BITRATE,FRAMES_PER_SHIFT,ASPECT,WIDTH,PATH";
            FileWriter fileWriter = new FileWriter(filePath, true);
            fileWriter.append(Fileheader.toString());
    
            MergeCode1 fw = new MergeCode1();
            String path = "G:/Mirriad/ScriptTest";
    
            fw.create();
            System.out.println(fw.create());
            fw.walk(path, filePath, fileWriter);
            fw.clean(fileWriter);   
        }
    

    【讨论】:

      最近更新 更多