【问题标题】:Reading multiple files to multiple arraylists将多个文件读取到多个数组列表
【发布时间】:2018-01-02 12:43:50
【问题描述】:

我有 5 个文本文件,我试图将它们中的每一个读入一个数组列表,因此 5 个文件需要存储 5 个数组列表。

我编写了一个代码,成功地将所有五个文本文件存储到一个数组列表中。 我发现 while 循环在第一种情况下只执行一次,所以问题出在 while 循环以及它是如何执行的,但不幸的是我无法准确找出问题所在。 我的代码在这里访问我的文件所在的目录,然后我列出这些文件并将它们存储到文件数组中。 在第一个 for 循环中,我将目录路径与文件名连接起来 在第二个循环中,我正在读取文件的内容。

正如我之前提到的,整个问题都与 while 循环有关,这就是我想出来的。

这是我的代码:

public ArrayList<ArrayList<String>> readFromFile() throws IOException
    {
        ArrayList<ArrayList<String>>data = new ArrayList<ArrayList<String>>();
        String s =null; 
        File file = new File("/home/abed/Downloads/practical_database_java-StudentVers/practical_database_java/Database/Oracle") ;
        String []files = file.list();
        String [] filestoberead = new String[files.length];

        for(int i = 0 ;i<files.length;i++)
        {
            filestoberead[i] = file+"/"+files[i] ;
            System.out.println(filestoberead[i]);
        }

        for(int j =0;j<filestoberead.length;j++)
        {
            try(BufferedReader reader= new BufferedReader(new FileReader(filestoberead[j])))
            {
                reader.readLine();
                while((s=reader.readLine())!=null)
                {

                    data.get(j).add(s);
                }
            }
        }




        return data  ; 
    }

【问题讨论】:

标签: java io


【解决方案1】:

在使用之前尝试创建列表:

data.add(new ArrayList<String>());
try(BufferedReader reader= new BufferedReader(new FileReader(filestoberead[j])))
{
    reader.readLine();
    while((s=reader.readLine())!=null)
    {
        data.get(j).add(s);
    }
}

更新:

而且,顺便说一句,您可以简化 filestoberead 的创建:

    File dir = new File("/home/abed/Downloads/practical_database_java-StudentVers/practical_database_java/Database/Oracle") ;
    File[] filestoberead = dir.listFiles();

【讨论】:

  • 这个需要一个消费者,实际上我更喜欢使用 NIO.2 API,但让我使用 File 的原因是我不能只列出没有目录的常规文件名
【解决方案2】:

事实上,你的 while 有一个错误,你有一个额外的 reader.readLine();

试试这个:

 try(BufferedReader reader= new BufferedReader(new FileReader(filestoberead[j])))
            {
                ArrayList<String> tmp = new ArrayList<>();
                while((s=reader.readLine())!=null)
                {
                    tmp.add(s);
                }
                data.add(tmp)

            }

【讨论】:

    【解决方案3】:

    蔚来也可以这样做

            try {
                List<List<String>> contents = new ArrayList<>();
                Iterator<Path> it = Files.newDirectoryStream(Paths.get("."), "*.*").iterator();
                while(it.hasNext()){
                   contents.add(Files.readAllLines(it.next()));
                }
    
            } catch (IOException e) {
                  e.printStackTrace();
            }
    

    【讨论】:

    • 您的代码与原始代码不同。它将所有文件变成一个单一的String。这一点都不好。
    • 仍然不正确。来吧,有几十种方法可以做到这一点,而且没有一种非常难。
    • 只需使用Files.readLines()(并记住使用正确的字符集)。它返回一个List&lt;String&gt;。你试图做很多不必要和错误的事情。没有称为readAllLines 的方法,暗示它们都已被读取。
    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2019-12-02
    • 2023-03-27
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多