2016-07-26 18 views
1

ディレクトリ名がファイル名と共に引かれているJavaコードに問題があります。私は次のコードを変更して、指定されたディレクトリからサブディレクトリではなくファイルのみを取り出したいと思っています。私はJavaの初心者ですので、誰かが修正されたコードで答えることができれば大いに感謝します。私は過去のスタックオーバーフローの答えから多くのことを試して、コンパイルすることができませんでした。ここでJava - ディレクトリからファイル名を取得する

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "DirectoryList" as import java.io.*; 
import java.sql.*; 

public class DirectoryList 
{ 
    public static void getList(String directory) throws SQLException 
    { 
     File path = new File(directory); 
     String[] list = path.list(); 
     String element; 

     for(int i = 0; i < list.length; i++) 
     { 
      element = list[i]; 
      #sql { 
       call Load_File_List_p(:element, :directory) 
      }; 
     } 
    } 
} 
/

は、私はすでに試したものです:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "DirectoryList" as import java.io.*; 
import java.sql.*; 

public class DirectoryList 
{ 
    public static void getList(File directory) throws SQLException 
    { 
     File path = new File(directory); 
     File[] listOfFiles = path.listFiles(); 

     for (File file : listOfFiles) 
     { 
      if (file.isFile()) 
      { 
      for(int i = 0; i < listOfFiles.length; i++) 
      { 
       file = listOfFiles[i]; 
       #sql { 
         call Load_File_List_p(:file, :directory) 
        }; 
      } 
      } 
     } 
    } 
} 
/

ありがとう!

答えて

1

コードに問題があるのは、余分なforループの繰り返しの位置だけです。コードの下を見てください:

import java.io.*; 
    import java.sql.*; 
    public class DirectoryList 
    { 
    public static void getList(File directory) throws SQLException { 
     File path = new File(directory); 
     File[] listOfFiles = path.listFiles(); 
     for (File file : listOfFiles) 
     { 
      if (file.isFile()) 
      { 
      #sql { 
         call Load_File_List_p(:file, :directory) 
        }; 
      } 
     } 
    } 
    } 
0

のJava 8ソリューションカレントディレクトリから取得するすべてのファイル

File path = new File(directory); 
File[] list = path.listFiles(); 
List<File> files = Arrays.stream(list).filter(t->t.isFile()).collect(Collectors.toList()); 

G らサブフォルダを含むすべてのファイル:あなたが持っている

public static List<File> getList(File directory) 
    { 
     File[] list = directory.listFiles(); 
     final List<File> files = Arrays.stream(list).filter(t->t.isFile()).collect(Collectors.toList()); 
     List<File> directories = Arrays.stream(list).filter(t->!t.isFile()).collect(Collectors.toList()); 
     directories.stream().forEach(t->files.addAll(getList(t))); 
     return files; 
    } 
+0

を、私は同じことを思ったが、私は彼がOracleの組み込みJavaの – kervin

+0

http://stackoverflow.com/a/1846349/16549を探していると思う - だけでなく – kervin

+0

@kervinを働くだろう私が考えることができる最初の事を書いた:) –

0

そこでは、SQLではなく、ファイルリストに関する問題として削除したSQLのものがいくつかあります。あなたはかなり近くにいた。あなたの内側のforループがあなたを動かし、投げられる必要があった、それはそれについてだった。各ファイルに対してループした後、各ファイルに対してループを繰り返し、各ファイルが複数回処理されるようにしました。

私が使用した呼び出しには2つの例外があります。そのため、それらをメソッドのシグネチャに入れます。

public void getList() throws SecurityException, NullPointerException 
    { 
     File path = new File("DirectoryName"); 
     File[] listOfFiles = path.listFiles(); 

     if (listOfFiles == null) { 
      System.out.println("There was an error."); 
     } 

     for (File file : listOfFiles) 
     { 
      if (file.isFile()) 
      { 
       System.out.println(file.getName()); 
      } 
     } 
    } 
0

listFiles()方法は、ユーザーの便宜のためFileFilterを受け取るオーバーロードがあります。ラムダと組み合わせることで、我々は持っている:

File [] files = path.listFiles(File::isFile); 
if (files != null) { 
    // listFiles may return null if path is not a directory or there's an IO issue. 
    for (File f : files) { 
     // do sth 
    } 
} 
関連する問題