扫描程序构造失败,因为 FileNotFoundException

Scanner construction fails because FileNotFoundException

提问人:Kralkaz -.- 提问时间:6/13/2023 最后编辑:Kralkaz -.- 更新时间:6/14/2023 访问量:38

问:

下面的代码 gts 一个目录,如果其中有一个文件,称为“Tabelle.csv”,则应创建扫描程序并显示其内容。

if (folder.isDirectory()){
            File[] files = folder.listFiles();
            
            String ta = "Tabelle.csv";
            
            for (File file: files){
                if (file.exists()){
                    if (file.getName().equals(ta)){

                        System.out.println("PATH: " + file);
                        //*
                        Scanner sc = new Scanner (file);
                        sc.useDelimiter(";");
                        while(sc.hasNext()){
                            System.out.println(sc.next());
                        }
                        sc.close();//*/

                    }
                } 
            }
        }

然而,这抛出了一个 FileNotFoundExcepion,这让我感到困惑,因为我用两个 if 加倍检查它的存在。

请帮助我提供尽可能易于理解的解决方案,因为我仍在学习。 提前致谢:D

ChatGPT 告诉 be 这样做:

FileInputStream fis = new FileInputStream(file);
Scanner sc = new Scanner(fis);

这也导致了同样的错误,但在 FIS 结构中。

我也不想要一个trycatch,因为这需要工作,我不在乎控制台告诉我:“文件不存在”或其他东西

编辑:

我从“Scanner sc = new Scanner(THEACTUALPATH)”开始,但这给了我错误,所以我从那里开始向后工程。这也是外如果的原因。我知道这毫无意义,但它是一种健全性检查,文件在那里......我不知道为什么会出现错误,以及如何避免它

异常 java.util.scanner

评论

0赞 g00se 6/14/2023
外部是没有意义的,应该删除。如果发生迭代,它将为该文件夹中的每个文件返回 true。您的代码假定您搜索的文件应该位于该目录中,而不是子目录中。搜索似乎很奇怪,但要完成,您需要递归。使用起来更方便ifFiles.find
1赞 Gyro Gearless 6/14/2023
或者只是new File(folder, "Tabelle.csv").isFile()
0赞 Reilas 6/14/2023
我无法重现该问题。请确保您运行的是此代码,而不是其他代码。

答:

0赞 RyuunAkasaka 6/14/2023 #1

检查您在此处指定的文件夹路径...

如果 (folder.isDirectory()){ }

您是否使用转义序列正确地将路径放入 File 构造函数中? 喜欢这个。。。

文件夹=new File(“C:\\父文件夹\\子文件夹”);

如果您使用的是 Windows,请使用双斜杠 \\ 分隔文件夹或文件。

看看就知道了。

将扫描程序创建放入 try catch 块以处理错误。

并清除 if (file.exists()){ 块,因为 listfiles 已经为您提供了存在的文件和目录列表,如果您正在寻找一种仅过滤掉文件的简单方法,只需使用 if(!file.isDirectory()) 尽管有 file.exists(),这将为您提供一个条件,仅使用您也可以使用的文件运行代码 if(!file.isDirectory() && file.getName().equals(ta)) 一石二鸟......首先,代码将检查您的文件是否为文件,然后检查名称是否匹配的事实......

希望它对朋友有所帮助。

您的新代码应如下所示。

   if (folder.isDirectory()){
                File[] files = folder.listFiles();
                
                String ta = "Tabelle.csv";
                
                for (File file: files){

                    if (file.isDirectory() && file.getName().equals(ta)){
                           
                            System.out.println("PATH: " + file);
                            //*

                          try{

                            Scanner sc = new Scanner (file);
                            sc.useDelimiter(";");

                            while(sc.hasNext()){
                                System.out.println(sc.next());
                            }
                            sc.close();//*/

                            }catch(Exception error){

                            System.out.println("Error occurred! Reason>>>"+error);
                               }
       
                              }
         
                          }
             
                        
                    } 
               

评论

1赞 g00se 6/14/2023
如果您在 Windows 中,请使用双斜杠 // 分隔文件夹或文件。对于任何操作系统来说,一个正斜杠就足够了
0赞 Stephen P 6/14/2023
“使用转义序列进入文件构造函数?”— 转义字符是斜杠 ('\'),而不是(正斜杠) ()。在窗口中使用反斜杠是需要加倍的时候,因为您需要转义转义字符这个关于正则表达式的答案很好地解释了这一点。/
0赞 RyuunAkasaka 6/14/2023
嘿,斯蒂芬,谢谢你提到那个朋友。我做了更正。之所以犯这个错误,是因为我真的太专注于计算机上的输出路径地址了。
0赞 RyuunAkasaka 6/14/2023
嘿@g00se感谢您的更好建议。两者都有效。我只是建议采用传统方式。