使用扫描仪从不同目录中读取多个文本文件

时间:2014-01-20 11:21:14

标签: java file java.util.scanner

我正在尝试从文件夹中读取多个文本文件,但我得到一个奇怪的结果,也许你可以帮我理解它。所以

File folder;
int result;

            JFileChooser chooser = new JFileChooser();
            chooser.setCurrentDirectory(new java.io.File("."));
            chooser.setDialogTitle("choosertitle");
            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            //
            // disable the "All files" option.
            //
            chooser.setAcceptAllFileFilterUsed(false);
            //
            if (chooser.showOpenDialog(chooser) == JFileChooser.APPROVE_OPTION) {
                System.out.println("getSelectedFile() : "
                        + chooser.getSelectedFile());
                folder = chooser.getSelectedFile();
                Scanner in = null;
                for (File fileEntry : folder.listFiles()) {
                    try {

                        in = new Scanner(new File(fileEntry.getName()));

                    } catch (FileNotFoundException e1) {

                    }
                    String CompositionName = in.next();
                    String Composer = in.next();
                    in.next();
                    String Duration = in.next();

                    parent.model.addRow(new Object[] { "", Composer,
                            CompositionName, TrackNumber, Duration });

                    in = null;

                }
            }

使用这个方法,我只读取文件夹的第一个文件。我在String CompositionName = in.next()上得到一个NullPointerException;在第二个循环中,即使文件名是正确的。这种方式有效,但我听说这不是好习惯。

File folder;
int result;

            JFileChooser chooser = new JFileChooser();
            chooser.setCurrentDirectory(new java.io.File("."));
            chooser.setDialogTitle("choosertitle");
            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            //
            // disable the "All files" option.
            //
            chooser.setAcceptAllFileFilterUsed(false);
            //
            if (chooser.showOpenDialog(chooser) == JFileChooser.APPROVE_OPTION) {
                System.out.println("getSelectedFile() : "
                        + chooser.getSelectedFile());
                folder = chooser.getSelectedFile();
                Scanner in = null;
                for (File fileEntry : folder.listFiles()) {


                    try {
                        System.out.println(fileEntry.getName());
                        in=null;

                        in = new Scanner(new File(folder.getAbsolutePath()+"\\"+fileEntry.getName()));


                    } catch (FileNotFoundException e1) {

                    }
                    String CompositionName = in.next();
                    String Composer = in.next();
                    in.next();
                    String Duration = in.next();

                    parent.model.addRow(new Object[] { "", Composer,
                            CompositionName, TrackNumber, Duration });

                }
            }

谢谢。

2 个答案:

答案 0 :(得分:0)

你试过这个:

in = new Scanner(fileEntry);

答案 1 :(得分:0)

您尝试使用文件名实例化文件。除非您设置文件的环境,否则这将失败(因为文件实例需要有效的引用)。

来自 - http://docs.oracle.com/javase/7/docs/api/java/io/File.html#File%28java.io.File,%20java.lang.String%29

它期望父目录的文件(在您的情况下为folder)和子名称的字符串(fileEntry.getName()

正如另一个答案所说,

new Scanner(fileEntry)

将起作用,

new Scanner(new File(fileEntry.getAbsolutePath())

最后

new Scanner(new File(folder, fileEntry.getName())

也可以。