私は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;
}
}
ありがとう、@JB Nizet。 –