перебирать каталог, читать файлы и распечатывать их в файл html

Я пытаюсь выбрать каталог из JfileChooser, а затем перебирать этот каталог, читая все файлы и записывая их все в один большой файл HTML для удобного просмотра. Вот фрагмент кода, который должен выполнить это:

else if(arg0.getSource()==generate){
        //Create HTML report in same directory that file(s) came from
        try{

            fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            int returnval = fileChooser.showSaveDialog(this);
            if(returnval == JFileChooser.APPROVE_OPTION){
                File fileName = new File( "./report.html" );
                BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
                bw.write("<html>");
                bw.write("<body>");
                bw.write("<h1>Graded Assignment</h1>");
                bw.write("<p>");
                //for loop here that appends all the files in a directory
                File directory = new File(fileChooser.getSelectedFile().getAbsolutePath());
                for( File f : directory.listFiles() ){
                    FileInputStream fstream = new FileInputStream(f);
                    DataInputStream in = new DataInputStream(fstream);
                    BufferedReader br = new BufferedReader(new InputStreamReader(in));
                    bw.write(br.readLine() + "\n");
                }
                bw.write("</p>");
                bw.write("</body>");
                bw.write("</html>");

                bw.close();
                Desktop.getDesktop().browse(fileName.toURI());
            }
        }
        catch(FileNotFoundException fnf){
            fnf.printStackTrace();
        }
        catch(IOException io){
            io.printStackTrace();
        }

Он попадет в цикл for и не будет прочитан в первом файле. Я получаю какую-то ошибку AWT-EventQueue. Может ли кто-нибудь воссоздать это и сказать мне, в чем может быть проблема? Спасибо.


person ridecontrol53    schedule 10.07.2012    source источник
comment
Вы должны проверить, действительно ли файл, который вы читаете из каталога, является файлом: это может быть другой каталог, и в этом случае FileInputStream не удастся   -  person Attila    schedule 10.07.2012
comment
Какой код вызывает исключение? Во-вторых, вы можете получить описательное сообщение об ошибке из Exception.   -  person The Original Android    schedule 11.07.2012
comment
Я получаю какую-то ошибку AWT-EventQueue. Это та часть, над которой вам следует остановиться подробнее! -Спасибо   -  person mtk    schedule 11.07.2012
comment
Я снова запустил его в режиме отладки, и он доходит до этой строки: File directory = new File(fileChooser.getSelectedFile().getAbsolutePath()); и выдает AWT-EventQueue-0 (Suspended (exception NullPointerException), поэтому я не думаю, что он на самом деле захватывает каталог. Я не знаю, почему, потому что .getAbsolutePath() должен возвращать путь в виде строки, и все должно быть в порядке. Но, видимо, ничего не цепляет.   -  person ridecontrol53    schedule 11.07.2012


Ответы (1)


Как и в комментарии, вы должны проверить, является ли это каталогом или нет, и действовать соответствующим образом:

File directory = new File(fileChooser.getSelectedFile().getAbsolutePath());
  getFiles(directory);//calls method to get all the files in the directory
  ...
  void getFiles(File directory) {
            for( File f : directory.listFiles() ){
                if(!f.isDirectory()) {//is a file lets read it
                    FileInputStream fstream = new FileInputStream(f);
                    DataInputStream in = new DataInputStream(fstream);
                    BufferedReader br = new BufferedReader(new InputStreamReader(in));
                    bw.write(br.readLine() + "\n");
               }else {//wil make it a recursive search
                   getFiles(f);
               }
          }
    }

не берите, хотя метод, который я дал, также выполняет рекурсивный поиск файлов, если в данном каталоге есть каталог, он будет проходить через все его каталоги, получая все файлы

Дополнение:

вы должны использовать: chooser.showOpenDialog(), а не chooser.showSaveDialog() см. здесь, например:

   JFileChooser chooser = new JFileChooser();
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int returnVal = chooser.showOpenDialog(parent);//this must be changed
    if(returnVal == JFileChooser.APPROVE_OPTION) {
       System.out.println("You chose to open this file: " +
            chooser.getAbsolutePath());
    }

Ссылки:

person David Kroukamp    schedule 10.07.2012
comment
Это определенно полезно, но, как я уже говорил mtk выше вашего ответа, программа не пройдет дальше File directory = new File(fileChooser.getSelectedFile().getAbsolutePath());, потому что на самом деле она не захватывает каталог. Может быть, вы могли бы пролить свет на то, почему .getAbsolutePath() ничего не возвращает. Кроме того, он даже не откроет окно JFileChooser, когда доберется до этой строки. - person ridecontrol53; 11.07.2012