2012-04-30 21 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を閉じることはありません。したがって、あなたの出力はバッファされ、決して下層のファイルに流されません。

Java 7の新しいAPIを試しているので、新しいtry-with-resourcesを使用すると、自動的に作者が閉じられ、このようなバグが回避されます。いつもそれを使用するか、最終的にブロック内のストリーム、リーダー、ライターを閉じてください)

+0

ありがとう、@JB Nizet。 –

関連する問題