2014-11-14 76 views
0

我有一个程序用于读取我的文件夹中的所有文件,并将这些文件合并到文件中并将它们放到一个新文件夹中。一些文件没有被拉入,我不知道为什么。为什么我的程序没有从文件夹中提取文件

文件名是wonder1.txt,wonder2.txt,wonder3.txt和wonder4.txt,文件夹名称是Alice,但只有少数文件实际位于新文件夹中。

import java.io.*; 
import java.util.Scanner; 
import java.util.*; 
import java.lang.*; 
import java.io.PrintWriter; 



public class alice { 

    public static void main(String[] args) throws FileNotFoundException, IOException { 
     File folder = new File("/Users/DAndre/Desktop/Alice"); 

     //Reads in all the files in that folder 

     for (final File fileEntry : folder.listFiles()) { 
      String fileName = fileEntry.getAbsolutePath(); 
      BufferedReader br = new BufferedReader(new FileReader(fileName)); 
      try { 
       StringBuilder stringBuilder = new StringBuilder(); 
       String line = br.readLine(); 

       while (line != null) { 
        stringBuilder.append(line); 
        stringBuilder.append("\n"); 
        line = br.readLine(); 
       } 


       /** 
       * Pass original file content as string to another method which 
       * creates new file with same content. 
       */ 

       newFile(stringBuilder.toString()); 

      } finally { 
       br.close(); 
      } 
     } 

    } 

    public static void newFile(String fileContent) { 
    try { 
     String newFileLocation = "/Users/DAndre/Desktop/final/final_copy.txt"; 
     PrintWriter writer = new PrintWriter(newFileLocation); 
     writer.write(fileContent);//Writes original file content into new file 
     writer.close(); 
     System.out.println("File Created"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

让我猜测,只有一个文件在'final_copy.txt'中?也许是因为新的PrintWriter(newFileLocation);会截断给定文件的内容,如果它已经存在了,你可以在[JavaDoc](https://docs.oracle.com/javase/7/文档/ API/JAVA/IO/PrintWriter.html#的PrintWriter%28java.lang.String%29)。 – Tom 2014-11-14 19:32:14

+0

另外,你在说“'文件夹= ....'”。我认为你需要一些有Folder对象的东西,而不是File对象。因为你正在做'新的文件(/用户/ DAndre /桌面/爱丽丝)',但在我看来,给出的路径是一个文件夹,而不是文件。 – ha9u63ar 2014-11-14 19:33:01

+0

@hagubear我的朋友可能不是真的。它说:文件和目录路径名的抽象表示:Doc:https://docs.oracle.com/javase/7/docs/api/java/io/File.html – guness 2014-11-14 19:33:52

回答

1

解决方案的问题在于,您尚未以附加模式初始化PrintWriter,因此新文件会被写入的最后一个文件的内容覆盖。

public static void newFile(String fileContent) { 
try { 
    String newFileLocation = "C:\\Users\\Shayan\\Desktop\\files2\\final_copy.txt"; 
    PrintWriter writer = new PrintWriter(new FileOutputStream(new File(newFileLocation), true /* append = true */)); 
    writer.write(fileContent);//Writes original file content into new file 
    writer.close(); 
    System.out.println("File Created"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

}

在FileOututStream的构造函数的最后一个参数被设置为true,表明它应该在追加模式打开。

+0

对不起,我改变了我的电脑的文件夹路径,但我希望你明白了:) – 2014-11-14 19:45:19

+0

它的工作原理,但我怎么才能让他们像文件是故事的一部分,所以它的wonder1.txt,wonder2 .text等 – unlimited4311 2014-11-14 19:50:51

+0

如果您在编译时知道文件的顺序,那么您可以做的一件事是首先读取并保存ArrayList中的所有文件,然后按照您希望的顺序在这些文件上调用newFile方法 – 2014-11-14 19:54:35

0

您需要更改

PrintWriter writer = new PrintWriter(newFileLocation); 

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(newFileLocation, true))) 

一点解释:追加意味着它相加写,反之写入覆盖现有文件。在你的代码中,你正在创建一个新文件,包括你的奇迹之一,但是在下一次迭代时,文件被重新创建。所以前一个奇迹的内容已经消失了。

随着PrintWriter对象的更改不会重新创建文件,而是将内容写入BufferedWriter,该BufferedWriter也将流传输到可追加的FileWriter对象。

小提示:不要在每次迭代中创建一个PrintWriter对象。

第二点小建议:你不需要PrintWriter。就我所见,BufferedWriter本身就足够好了。

+0

我认为你应该添加一点解释,为什么'write'是错误的,'append'是正确的。 – AdamMc331 2014-11-14 19:37:53

+0

'append'不正确。如果你重新编写作者,它并没有太大的改变。 – Tom 2014-11-14 19:38:27

+0

@你说得对,我的项目通常不需要PrintWriter。现在修复它。 – guness 2014-11-14 19:49:53

相关问题