2016-07-26 184 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

只有您的代码问题是循环迭代额外的位置。请看下面的代码:

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()); 

等所有文件,包括子文件夹:

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。你虽然很接近。你的内在循环让你起来,需要被扔掉,就是这样。你为每个文件循环,然后再为每个文件重新打开该文件,这样每个文件都被多次处理。

我使用的调用有两个可能的例外,所以我只是把它们放在方法签名中。

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 
    } 
}