Почему мой вывод из System.out.println отличается от буферизированного писателя?

Я пытаюсь захватить список каталогов, включая подкаталоги и файлы. Я хотел бы выписать содержимое в текстовый файл. У меня проблема с разным выводом из System.out.println() и bufferedwriter().

Мой код здесь


public class testDir2 {

    static int spc_count = -1;
    static void getDirectoryList(File aFile) {
        try {
            File file = new File("D:/Documents/Code - NetBeans/web1/web/Includes/ProdSpecs.txt");
            String content = "xxx";
            // if file exists, Delete and recreate
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
            // Define the writer
            FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);
            BufferedWriter bw = new BufferedWriter(fw);            
            spc_count++;
            String spcs = "";
            for (int i = 0; i < spc_count; i++) {
                spcs += " ";
            }
            if (aFile.isFile()) {
                System.out.println(spcs + "[FILE] " + aFile.getName());
                bw.write(spcs + "[FILE] " + aFile.getName());
                bw.newLine();
            } else if (aFile.isDirectory()) {
                bw.write(spcs + "[DIR] " + aFile.getName());
                bw.newLine();
                System.out.println(spcs + "[DIR] " + aFile.getName());
                File[] listOfFiles = aFile.listFiles();
                if (listOfFiles != null) {
                    for (int i = 0; i < listOfFiles.length; i++) {
                        getDirectoryList(listOfFiles[i]);
                    }
                } else {
                    System.out.println(spcs + " [ACCESS DENIED]");
                }
            }
            spc_count--;
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String nam = "Web/Documents/Product Specs/";
        File aFile = new File(nam);
        getDirectoryList(aFile);
    }
}

Вывод из System.out.println() корректен следующим образом:


*run:
[DIR] Product Specs
 [DIR] Year 2013
  [DIR] CC & CNC
   [FILE] CNC-1.txt
   [FILE] CNC-2.txt
   [FILE] CNC-3.txt
  [DIR] DCN
   [FILE] DCN-1.txt
   [FILE] DCN-2.txt
   [FILE] DCN-3.txt
   [FILE] DCN-4.txt
  [DIR] TST
   [FILE] TST-1.txt
   [FILE] TST-2.txt
   [FILE] TST-3.txt
BUILD SUCCESSFUL (total time: 0 seconds)*

Неверный вывод в текстовый файл, каталог указан внизу


   [FILE] CNC-1.txt
   [FILE] CNC-2.txt
   [FILE] CNC-3.txt
  [DIR] CC & CNC
   [FILE] DCN-1.txt
   [FILE] DCN-2.txt
   [FILE] DCN-3.txt
   [FILE] DCN-4.txt
  [DIR] DCN
   [FILE] TST-1.txt
   [FILE] TST-2.txt
   [FILE] TST-3.txt
  [DIR] TST
 [DIR] Year 2013
[DIR] Product Specs

Любая помощь будет принята с благодарностью. Я был в этом в течение нескольких дней и не могу понять это. Спасибо!

1 ответ

Вы создаете новый BufferedWriter каждый раз, когда вы вызываете метод рекурсивно. Я удивлен, что это работает вообще, но это, конечно, затрудняет определение того, какой результат может быть.

Я предлагаю вам изменить код, чтобы иметь "внешний" метод, который создает писателя, а затем вызывает "внутренний" метод, передавая писателю. Когда внутренний метод возвращается, он должен передать того же автора. Так:

// Generally better to let the exception bubble up than just catch it...
// Adjust according to taste, of course.
static void getDirectoryList(File aFile) throws IOException {
    File file = new File(...);
    try (BufferedWriter writer =
             Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8)) {
        getDirectoryList(aFile, writer);
    }
}

private static void getDirectoryList(File aFile, BufferedWriter writer) {
    // Use the writer here, and when you recurse, pass the same one on:
    ...
    getDirectoryList(someOtherFile, writer);
    ...
}
Другие вопросы по тегам