Java-读取文件夹中的所有.txt文件

Java-读取文件夹中的所有.txt文件,java,bufferedreader,Java,Bufferedreader,比如说,我有一个名为maps的文件夹,在maps中我有map1.txt、map2.txt、和map3.txt。如何使用Java和BufferReader读取文件夹maps中的所有.txt文件(如果可能的话)?下面的内容应该可以帮助您,请注意,为了简单起见,我使用apache commons FileUtils而不是混用缓冲区和流 File folder = new File("/path/to/files"); File[] listOfFiles = folder.listFiles();

比如说,我有一个名为
maps
的文件夹,在
maps
中我有
map1.txt
map2.txt、
map3.txt
。如何使用Java和
BufferReader
读取文件夹
maps
中的所有
.txt
文件(如果可能的话)?

下面的内容应该可以帮助您,请注意,为了简单起见,我使用apache commons FileUtils而不是混用缓冲区和流

File folder = new File("/path/to/files");
File[] listOfFiles = folder.listFiles();

for (int i = 0; i < listOfFiles.length; i++) {
  File file = listOfFiles[i];
  if (file.isFile() && file.getName().endsWith(".txt")) {
    String content = FileUtils.readFileToString(file);
    /* do somthing with content */
  } 
}
File folder=新文件(“/path/to/files”);
File[]listOfFiles=folder.listFiles();
for(int i=0;i
我会将@Andrew White answer(+1 BTW)更进一步,并建议您使用FileNameFilter仅列出相关文件:

FilenameFilter filter = new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.endsWith(".txt");
    }
};

File folder = new File("/path/to/files");
File[] listOfFiles = folder.listFiles(filter);

for (int i = 0; i < listOfFiles.length; i++) {
    File file = listOfFiles[i];
    String content = FileUtils.readFileToString(file);
    // do something with the file
}
FilenameFilter=newfilenamefilter(){
公共布尔接受(文件目录,字符串名称){
返回名称.endsWith(“.txt”);
}
};
文件夹=新文件(“/path/to/files”);
File[]listOfFiles=folder.listFiles(过滤器);
for(int i=0;i
我认为这是从地图和子文件夹中读取所有.txt文件的好方法

 private static void addfiles (File input,ArrayList<File> files)
{
    if(input.isDirectory())
    {
        ArrayList <File> path = new ArrayList<File>(Arrays.asList(input.listFiles()));
        for(int i=0 ; i<path.size();++i)
        {
            if(path.get(i).isDirectory())
            {
                addfiles(path.get(i),files);
            }
            if(path.get(i).isFile())
            {
                String name=(path.get(i)).getName();
                if(name.lastIndexOf('.')>0)
                {
                    int lastIndex = name.lastIndexOf('.');
                    String str = name.substring(lastIndex);
                    if(str.equals(".txt"))
                    {
                        files.add(path.get(i));
                    }
                }
            }
        }
    }
    if(input.isFile())
    {
        String name=(input.getName());
        if(name.lastIndexOf('.')>0)
        {
            int lastIndex = name.lastIndexOf('.');
            String str = name.substring(lastIndex);
            if(str.equals(".txt"))
            {
                files.add(input);
            }
        }
    }

}
私有静态void addfiles(文件输入、ArrayList文件)
{
if(input.isDirectory())
{
ArrayList path=newArrayList(Arrays.asList(input.listFiles());
对于(int i=0;i0)
{
int lastIndex=name.lastIndexOf('.');
String str=name.substring(lastIndex);
如果(str.equals(“.txt”))
{
add(path.get(i));
}
}
}
}
}
if(input.isFile())
{
字符串名称=(input.getName());
如果(name.lastIndexOf('.')>0)
{
int lastIndex=name.lastIndexOf('.');
String str=name.substring(lastIndex);
如果(str.equals(“.txt”))
{
文件。添加(输入);
}
}
}
}

如果您想使用新的java.nio api实现这一点,那么这就是从

路径目录=。。。; try(DirectoryStream)= Files.newDirectoryStream(dir,“*.txt”)){ for(路径条目:流){ System.out.println(entry.getFileName()); } }捕获(IOX异常){ //IOException永远不能由迭代引发。 //在这个代码段中,它只能//由newDirectoryStream抛出。 系统错误println(x); }
如果所有文件都在一个目录中,则仅使用JDK:

File dir = new File("path/to/files/");

for (File file : dir.listFiles()) {
    Scanner s = new Scanner(file);
    // do something with file
    s.close();
}

要排除文件,可以使用
listFiles(FileFilter)
NIO
执行以下操作:

Files.walk(Paths.get("/path/to/files"))
          .filter(Files::isRegularFile)
          .filter(path -> path.getFileName().toString().endsWith(".txt"))
          .map(FileUtils::readFileToString)
          // do something

要读取文件内容,可以使用
Files#readString
,但通常需要在lambda表达式中处理
IOException

Ah。谢谢但需要注意的是:如果所有文件都命名为mapNUMBER.txt,是否会更易于管理?与map3.txt、map4.txt等中的代码一样,此代码不会按原样工作,因为第6行中没有使用变量“file”的声明。不知道为什么要这样写,也许它应该是更伪代码的样式,但是file应该被listOfFiles[i]替换,或者如果要使用file变量,就应该声明file变量。请注意,
for(file-file:folder.listFiles())
的长度要短得多,效果也更好@Dolda2000同意了,我真的不知道为什么我会这样回答。也许我拉了一个现有的例子。@Shahryar这不是一个多余的答案,这是一个不同的、有效的答案。@KennyCason,在我看来,这和前面的答案一样!使用FileNameFilter有什么好处?@Shahryar是的,这在我看来是一个同等的、可能更干净的例子。了解
其他
解决方案的存在也很好。您将看到,对于一个问题,有许多相似但不同的解决方案。@KennyCason“知道其他解决方案的存在也很好”好话:-)这比其他答案有任何改进吗?或者for each只是一个语法首选项?它的作用是相同的,唯一的区别是它是干净的,代码更少。try/catch与try/catch可能重复?
File dir = new File("path/to/files/");

for (File file : dir.listFiles()) {
    Scanner s = new Scanner(file);
    // do something with file
    s.close();
}
Files.walk(Paths.get("/path/to/files"))
          .filter(Files::isRegularFile)
          .filter(path -> path.getFileName().toString().endsWith(".txt"))
          .map(FileUtils::readFileToString)
          // do something