Java не преминава през всички файлове в голяма директория

Правя извличане на данни за първи път, използвайки набора от имейли на enron. Опитвам се да премина през всеки файл в директория и да анализирам в csv файл датата, часа и адреса на всеки файл.

Проблемът е, че java не изглежда да итерира през всички тях, поради което моят csv файл е около 1000 реда твърде кратък. Как мога да разреша това?

Моят код:

public class FileReader {


    public static void main(String[] args) throws FileNotFoundException{
    FileReader fileReader = new FileReader();

    //fileReader.mainFunction("maildir/skilling-j/_sent_mail");
    fileReader.mainFunction("maildir/skilling-j/inbox");
    /*fileReader.mainFunction("maildir/skilling-j/sent");
    fileReader.mainFunction("maildir/lay-k/inbox");
    fileReader.mainFunction("maildir/lay-k/_sent");
    fileReader.mainFunction("maildir/lay-k/sent");*/
    System.out.println("done!");

    }
    public void mainFunction(String fileName) throws FileNotFoundException{
    File maindir = new File(fileName);
    PrintWriter pw = new PrintWriter(new File("Analysis.csv"));
    StringBuilder sb = new StringBuilder();
    StringBuilder sbpre = new StringBuilder();

    Scanner scanner;
    sbpre.append("Date");
    sbpre.append(',');
    sbpre.append("Time");
    sbpre.append(",");
    sbpre.append("From");
    sbpre.append('\n');
    int endcounter = 0;
    pw.write(sbpre.toString());
    File [] files = maindir.listFiles();
        for(int i = 0; i < files.length; i++){
            scanner = new Scanner(files[i]);
            System.out.println(files[i].getPath());
            while (scanner.hasNextLine()) {
                String lineFromFile = scanner.nextLine();
                String month = "Jun";
                String year = "2000";
                String time = "00:00:00";
                if(lineFromFile.contains("Date:") & (lineFromFile.length()== 43 | lineFromFile.length()== 42 )){
                    if(lineFromFile.length()==43){
                        sb.append(lineFromFile.substring(11,13));
                        month = lineFromFile.substring(14, 17); 
                        year = lineFromFile.substring(18,22);
                        time = lineFromFile.substring(23,30);
                    }else{
                        sb.append("0");
                        sb.append(lineFromFile.substring(11,12)); 
                        month = lineFromFile.substring(13, 16);
                        year = lineFromFile.substring(17,21);   
                        time = lineFromFile.substring(22,29);
                                            }                   
                    sb.append(".");

                    switch(month){
                    case "Jan":sb.append("01"); sb.append(".");break;
                    case "Feb":sb.append("02"); sb.append(".");break;
                    case "Mar":sb.append("03"); sb.append(".");break;
                    case "Apr":sb.append("04"); sb.append(".");break;
                    case "May":sb.append("05"); sb.append(".");break;
                    case "Jun":sb.append("06"); sb.append(".");break;
                    case "Jul":sb.append("07"); sb.append(".");break;
                    case "Aug":sb.append("08"); sb.append(".");break;
                    case "Sep":sb.append("09"); sb.append(".");break;
                    case "Oct":sb.append("10"); sb.append(".");break;
                    case "Nov":sb.append("11"); sb.append(".");break;
                    case "Dec":sb.append("12"); sb.append(".");break;
                    }
                    sb.append(year);
                    sb.append(",");
                    sb.append(time);
                    sb.append(",");


            }

                if(lineFromFile.contains("X-From:")) {
                        lineFromFile = lineFromFile.replace(",", " ");
                        sb.append(lineFromFile.substring(8));

                    }

            pw.write(sb.toString());
            sb.setLength(0);
        }
            sb.append('\n');
            endcounter = i;
    }
        pw.close();
        System.out.println(endcounter);
    }
}

Последните редове на регистрационния файл на конзолата:

maildir\skilling-j\inbox\997_
maildir\skilling-j\inbox\998_
maildir\skilling-j\inbox\999_
maildir\skilling-j\inbox\99_
maildir\skilling-j\inbox\9_
1251
done!

Всъщност трябва да е около 2500 реда.

Също така би било хубаво да знам как мога да преминавам през директория с директории (напр. "maildir/skilling-j") вместо една директория с файлове.

И знам, че кодът е малко раздут, но това е резултат от некомпетентен кодер (аз).


person Daniel    schedule 31.05.2017    source източник
comment
Бих предложил да го разбиете за отстраняване на грешки. Има много проверки. Първо се уверете, че получавате очаквания брой файлове от maindir.listFiles(); Какво показва за размер? Освен това има по-нови/по-добри опции за преминаване в дърво на директории.   -  person KevinO    schedule 01.06.2017
comment
listFiles не включва файлове в подпапки.   -  person Has QUIT--Anony-Mousse    schedule 01.06.2017


Отговори (1)


методът listFiles() връща списък с файлове и директории. Можете да използвате методите isFile(), isDirectory(), за да идентифицирате типа на файла. Опитайте този прост код, за да проверите файловете във вашата папка:

    File[] files = maindir.listFiles();
    System.out.println("Files count: " + files.length);
    for (int i = 0; i < files.length; i++) {
        System.out.print(files[i].getAbsolutePath());
        if (files[i].isDirectory()) {
            System.out.println(" dir");
        } else if (files[i].isFile()) {
            System.out.println(" file");
        }
    }

Можете да използвате метода isDirectory(), за да филтрирате само директории и да ги итерирате.

person Alexander Kirakozov    schedule 31.05.2017