2012-04-30 1 views
1

Я преподаю себе NIO2 и делаю некоторые практические реализации для тестирования теорий. В настоящее время я выполнил реализацию FileVisitor, который компилирует и запускает и делает то, что я ожидаю в fileVisit, но не в postFileVisit. Это то, что он подсчитывает строки таблицы в файлах .xml и .xhtml и создает текстовый файл с результатами, но не добавляет общее количество строк таблицы для данного каталога. PostFileVisit делает некоторые вещи, однако, в том случае, если в каталоге не было файлов .xml или .xhtml, все еще создается файл журнала и отметка времени, но строки кода с 97 по 101, похоже, не влияют. Итак, я считаю, что это что-то с BufferedWriter, что я запутался. Благодарим за помощь:NIO2 n00b, FileVisitor/BufferedWriter

package com.purposeful_play.BasicIO; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.nio.file.*; 
import java.io.IOException; 
import java.nio.charset.Charset; 
import java.nio.file.attribute.BasicFileAttributes; 
import java.nio.file.attribute.BasicFileAttributeView; 
import java.nio.file.attribute.FileTime; 

/** 
* 
* @author Michael-Mosher 
*/ 

public class CharacterCounter<T> implements FileVisitor<T> { 
    static int count = 0; 

    public static void main (String[] args){ 
     Path path = FileSystems.getDefault().getPath(args[0]); 

     try { 
Files.walkFileTree(path, new CharacterCounter<Path>()); 
     } 
     catch (IOException x) { System.err.format("Unable to read file: %s%n", x); } 

    } 

    @Override 
    public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException { 
     return FileVisitResult.CONTINUE; 
    } 

    @Override 
    public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException { 
     Path fname = (Path)file; 
     if((fname.getFileName().toString().contains(".xhtml"))||(fname.getFileName().toString().contains(".xml"))){ 
     boolean withindiv = false; 
     int fcount = 0; 
     StringBuilder div = new StringBuilder("<div ID=center"); 
     StringBuilder notdiv = new StringBuilder("</div"); 
     StringBuilder table = new StringBuilder("<tr"); 
     Charset cs = Charset.forName("UTF-8"); 
     try (BufferedReader input = Files.newBufferedReader((Path)file, cs)){ 
     while(input.ready()){ 
      String line = input.readLine(); 
      withindiv = line.contains(div) ? line.contains(div) : withindiv; 
      if(withindiv){ 
       withindiv = !(line.contains(notdiv)); 
       if(!withindiv){ 
        line = line.split("</div")[0]; 
       } 
       fcount = line.split("<tr", 0).length-1; 
       count += fcount; 
      } 
     } 

      } 
     Path path = (Path)file; 
     String ss = path.toString(); 
     path = path.getParent().resolve("logfile.txt"); 
     boolean newfile = Files.exists(path); 
     try (BufferedWriter output = Files.newBufferedWriter(
       path, cs, StandardOpenOption.CREATE, 
       StandardOpenOption.APPEND)){ 
     output.write(ss); 
     output.newLine(); 
     ss = new Integer(fcount).toString(); 
     output.write(ss); 
     output.newLine(); 
     long currentTime = System.currentTimeMillis(); 
     FileTime ft = FileTime.fromMillis(currentTime); 
     if(!newfile) 
      Files.getFileAttributeView(path, BasicFileAttributeView.class).setTimes(ft, null, ft); 
     else 
      Files.getFileAttributeView(path, BasicFileAttributeView.class).setTimes(ft, null, null); 
     } 
    } // End if(...xhtml || ...xml) 
     return FileVisitResult.CONTINUE; 
    } 

    @Override 
    public FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException { 
     System.err.printf("visitFileFailed error: %s%n", exc); 
     return FileVisitResult.CONTINUE; 
    } 

    @Override 
    public FileVisitResult postVisitDirectory(Object dir, IOException exc) throws IOException { 
     Path path = (Path)dir; 
     path = path.resolve("logfile.txt"); 
     Charset cs = Charset.forName("UTF-8"); 
     BufferedWriter output = Files.newBufferedWriter(path, cs, 
       StandardOpenOption.CREATE, StandardOpenOption.SYNC, StandardOpenOption.WRITE, StandardOpenOption.APPEND); 
     String ss = "Total occurences: "; 
     output.write(ss); 
     output.newLine(); 
     ss = new Integer(count).toString(); 
     output.write(ss); 
     output.newLine(); 
     count = 0; 
     long time = System.currentTimeMillis(); 
     FileTime ft = FileTime.fromMillis(time); 
     Files.setLastModifiedTime(path, ft); 
     return FileVisitResult.CONTINUE; 
    } 
    } 

ответ

2

Вы никогда не закрываете свой BufferedWriter. Таким образом, ваш вывод буферизирован и никогда не очищается до основного файла.

Поскольку вы экспериментируете с новыми API-интерфейсами Java 7, вы должны использовать новый try-with-resources, который автоматически закрывал бы автора и избегал таких ошибок. (BTW, вы используете его для чтения, но не для записи. Всегда используйте его или всегда закрывайте потоки, читатели и писатели в конечном блоке)

+0

Спасибо, @JB Nizet. –

 Смежные вопросы

  • Нет связанных вопросов^_^