6

パス全体とそのサブディレクトリの単一レイヤーをステップスルーしようとしています。ファイルごとに、5つのデータフィールドを読み取り、区切られたテキストファイルに出力する必要があります。単一のテキストファイルから読み取り、画面上の出力を検証することができます。その後、私は立ち往生しています。FileVisitの適切なパラメータが見つからないようです。いくつかの具体的な質問は、以下に投稿された私のコードのコメントです。そして、私はそれほど遠くはありませんが、出力ファイルに書き込むためのアイデア、つまり、配置したい場所が最も論理的な場所であるかどうかを知りたいと思います。

https://stackoverflow.com/questions/9913/java-file-io-compendiumおよびファイルビジター
http://docs.oracle.com/javase/7/docs/api/に関するJavaDocsの情報を確認しました。 index.html?java / nio / file/FileVisitor.html。ただし、FileVisitorを正しく機能させることはできません。

@Bohemianは、私が行ったことに変更interfaceすることを提案しました。class

 import java.nio.files.*;
 public class FileVisitor<T> 
 {
      Path startPath = Paths.get("\\CallGuidesTXT\\");
      Files.walkFileTree(startPath, new SimpleFileVisitor(startPath))
      \\             ^^^^^^    
      \\ errors out, <identifier expected>          
          { 
          @Override
          public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
              throws IOException
          {
              Files.list(file);
              return FileVisitResult.CONTINUE;
          }
        // do my file manipulations here, then write the delimited line 
        // of text to a CSV fle...is this the most appropriate place for that 
        // operation in this sample? 
      }  
 }

以下のSSCCE...しかし、上記のバージョンのコメントは、私が持っている特定の質問を示しています。

 import java.nio.*;
 import java.util.*;
 public class FileVisitor<T>
 {
    Path startPath = Paths.get("\\CallGuidesTXT\\");
 }
 Files.walkFileTree(startPath, new SimpleFileVisitor(startPath)  {
      @Override
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
          throws IOException {
          Files.list(file);
          return FileVisitResult.CONTINUE;
      } 
 });
4

3 に答える 3

9

私はJavaで少し錆びていますが、これがあなたがどこに向かっていると思うかについての大まかな考えです:

import java.nio.files.*;
public class MyDirectoryInspector extends Object 
{
    public static void main(String[] args) {
        Path startPath = Paths.get("\\CallGuidesTXT\\");
        Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() { 
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                throws IOException
            {
                String firstLine = Files.newBufferedReader(file, Charset.defaultCharset()).readLine();
                System.out.println(firstLine);
                return FileVisitResult.CONTINUE;
            }
        }); // <- you were missing a terminating ");"
    }
}

これで、ディレクトリをウォークスルーし、各ファイルの最初の行を出力して標準化する必要があります。1.6以降Javaに触れていないので、JDK7のものも少し新しいです。クラスとは何か、インターフェースとは何かについて混乱していると思います。私の例では、混乱を避けるためにMyDirectoryInspectorという基本クラスから始めます。検査を開始する主な方法であるプログラムエントリポイントを提供するだけで十分です。Files.walkFileTreeの呼び出しには、開始パスと、インライン化したファイルビジターの2つのパラメーターが必要です。(このスタイルに慣れていない場合、インライン化は混乱を招く可能性があると思います。)これは、実際のクラスを使用したい場所で定義する方法です。SimpleFileVisitorを個別に定義し、次のように呼び出し用にインスタンス化することもできます。

import java.nio.files.*;
public class MyDirectoryInspector extends Object 
{
    public static void main(String[] args) {
        Path startPath = Paths.get("\\CallGuidesTXT\\");
        Files.walkFileTree(startPath, new SimpleFileVisitor<Path>());
    }
}

public class SimpleFileVisitor<Path>()) { 
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                throws IOException
            {
                String firstLine = Files.newBufferedReader(file, Charset.defaultCharset()).readLine();
                System.out.println(firstLine);
                return FileVisitResult.CONTINUE;
            }
        }

始めたばかりの場合は、すべてを分離しておく方が理にかなっているかもしれません。インライン化せずにクラスを定義し、一度に1ステップずつ実行して、各部分を個別に理解するようにします。2番目の例では、訪問する各ファイルの1行目を印刷するために使用できるカスタムファイルビジターと、それをJDKFilesクラスで使用するプログラムの2つの個別のピースを示しています。次に、構文を省略した別のアプローチを見てみましょう。

import java.nio.files.*;
public class MyDirectoryInspector extends Object 
{
    public static void main(String[] args) {
        Path startPath = Paths.get("\\CallGuidesTXT\\");
        Files.walkFileTree(startPath, new SimpleFileVisitor());
    }
}

public class SimpleFileVisitor()) { 
            @Override
            public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)
                throws IOException
            {
                String firstLine = Files.newBufferedReader((Path)file, Charset.defaultCharset()).readLine();
                System.out.println(firstLine);
                return FileVisitResult.CONTINUE;
            }
        }

ジェネリックを省略した状態で、ファイルパラメータをオブジェクトタイプとして宣言し、後で使用することを選択したときにキャストする必要があります。一般に、インターフェイス定義をクラス定義に置き換えたり、まったく異なる目的で使用されるため、2つを混同したりすることは望ましくありません。

于 2012-04-04T16:41:35.457 に答える
6

Javaは実装(つまりコード)を持つことはinterfaceできません-メソッドシグネチャのみ。

次のように変更interfaceしてみてくださいclass

public class FileVisitor<T> {
    ...
于 2012-04-04T15:55:11.493 に答える
2

今あなたの改訂された投稿に答えるために...

間違った場所にブラケットがあります:

Files.walkFileTree(startPath, new SimpleFileVisitor(startPath) { 
      @Override
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
          throws IOException {
          Files.list(file);
          return FileVisitResult.CONTINUE;
      }
  });

new SimpleFileVisitor(startPath)メソッドを囲むためにブラケットを移動しましたvisitFile。ここにあるのは匿名クラスです。ここで「オンザフライ」で実装を提供します。

于 2012-04-04T16:11:42.577 に答える