2

我需要制作一个列出目录中 .txt 文件的菜单。例如,如果我在目录中有 jonsmith12.txt 、 lenovo123.txt 、 dell123.txt ,我将如何制作以下数组列表菜单:

请选择以下选项之一:

  1. 乔恩史密斯12
  2. 联想123
  3. 戴尔123

请输入您的选择:

我需要一个 arraylist 菜单是因为我不知道在任何给定时间目录中有多少 .txt 文件。

import java.io.File;

public class ListFiles 
{

    public static void listRecord() {

  // Directory path here
  String path = "."; 

  String files;
  File folder = new File(path);
  File[] listOfFiles = folder.listFiles(); 

  for (int i = 0; i < listOfFiles.length; i++) 
  {

   if (listOfFiles[i].isFile()) 
   {
   files = listOfFiles[i].getName();
       if (files.endsWith(".txt") || files.endsWith(".TXT"))
       {
          System.out.println(files);
        }
     }
  }
}
}

这是将 .txt 文件中的信息显示到控制台的类。它仍然需要一些修改,但我可能会弄清楚。

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * This program reads a text file line by line and print to the console. It uses
 * FileOutputStream to read the file.
 * 
 */
public class DisplayRec {

    public static void displayRecord() throws IOException {

    File file = new File("williamguo5.txt");
    FileInputStream fis = null;
    BufferedInputStream bis = null;
    DataInputStream dis = null;

    try {
      fis = new FileInputStream(file);

      // Here BufferedInputStream is added for fast reading.
      bis = new BufferedInputStream(fis);
      dis = new DataInputStream(bis);

      // dis.available() returns 0 if the file does not have more lines.
      while (dis.available() != 0) {

      // this statement reads the line from the file and print it to
        // the console.
        System.out.println(dis.readLine());
      }

      // dispose all the resources after using them.
      fis.close();
      bis.close();
      dis.close();

    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

所以问题是:如何在我的类中实现一个ArrayList菜单ListFiles,以便它显示.txt文件。

4

2 回答 2

1

您可以使用File.listFiles(FilenameFilter filter)的替代方法签名来简化代码:

File[] files = dir.listFiles(new FilenameFilter() {

    @Override
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
});

除非您真的喜欢编写循环,否则您甚至不需要手动循环数组以将其转换为 a List

List<File> lstRecords = Arrays.asList(files);

您的displayRecord方法非常接近;您只需要将文件作为参数传递并使用它而不是硬编码的文件名,并且您需要初始化dis.

把它们放在一起:

package com.example.file;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class FileExample {

    public static List<File> listRecords(File dir) {
        File[] files = dir.listFiles(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".txt");
            }
        });

        return Arrays.asList(files);
    }

    public static void displayRecord(File file) {
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        DataInputStream dis = null;

        try {
            fis = new FileInputStream(file);

            // Here BufferedInputStream is added for fast reading.
            bis = new BufferedInputStream(fis);
            dis = new DataInputStream(bis);

            String line = dis.readLine();
            while (line != null) {

                // this statement reads the line from the file and print it to
                // the console.
                System.out.println(line);
                line = dis.readLine();
            }

            // dispose all the resources after using them.
            fis.close();
            bis.close();
            dis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        List<File> lstRecords = listRecords(new File("."));
        for (File record : lstRecords) {
            displayRecord(record);
        }
    }

}

如果您正在处理文本文件,最好使用 Reader/Writer 而不是 InputStream/OutputStream,并且您应该关闭finally块中的文件以避免潜在的资源泄漏。

您还会注意到我没有明确使用ArrayList. 在大多数情况下,最好尽可能针对接口(在这种情况下List为 )进行编程,并且仅在需要使用仅对该类可用的方法时才使用实现类声明变量。

于 2012-05-14T23:45:05.937 回答
0

看起来你上面的症结是数组。如果您只需要遍历目录中的文件,那么像下面这样简单的事情就可以解决问题。

import java.io.File;


public class TxtEnumerator {
    public static void main(String[] args) {
        TxtEnumerator te = new TxtEnumerator();
        te.listFiles();
    }

    public void listFiles() {
        String filepath = "." + File.separator + "textDirectory";
        File file = new File(filepath);
        if (file.isDirectory()) {
            for (File f : file.listFiles()) {
                if (f.getName().endsWith(".txt")) {
                    System.out.println(f.getName());
                }
            }
        }
    }
}
于 2012-05-14T20:25:44.780 回答