Почему мой вывод из 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);
...
}