2017-02-16 31 views
0

Здравствуйте, у меня есть проблема с файлом чтения.Прочтите BIG txt-файл с помощью метода JAVA

У меня есть BIG .txt файл (500MB)

И я хочу прочитать строку с методом я начинаю метод medhor rsault это первая линия. Я начинаю метод второй и возвращаю вторую строку

У меня этот код. Я сохраняю последнюю строку чтения и читаю строку + 1, но программа останавливается в каждой строке < последней прочитанной строки. и если я прочитаю 100 000 строк <, это слишком долго.

public static Boolean Jedno(){ 
     int poradievtahu=0; 
     int[] tah=new int[7]; 
     String subor= "C:/Users/Paradox/workspace/Citaj_po_Riadku/all6.txt"; 
     Scanner sc; 
     try { 
      sc = new Scanner(new File(subor)); 
      int lineIndex = 0; 
    cit: while(sc.hasNextLine()) { 
      String line = sc.nextLine(); 
      if(lineIndex++ >= pocetC+1) { 
       System.out.print("Zvacsujem "+ (pocetC+1) + " " + line); 
       // do something 
       poradievtahu=-1; 
       Scanner scanner=new Scanner(line); 
         while(scanner.hasNextInt()){ 
          int pom= scanner.nextInt(); 

          tah[++poradievtahu]=pom; 
          if (poradievtahu==5){ 
           poradievtahu=-1; 
           pocetC++; 

           if ((pocetC%(55935)==0)&&(pocetC!=0)){ 
            Calendar cal = Calendar.getInstance(); 
           PrintWriter writer4 = new PrintWriter(new BufferedWriter(new FileWriter("nove.txt", true))); 
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 
            writer4.println("Ďalšia 1/1470 in " + sdf.format(cal.getTime())); 
            writer4.println(Arrays.toString(tah)); 
            writer4.close(); 
           } 
           if (pocetC>=13983816){ 
            //berem=false;         
            PrintWriter writer4 = new PrintWriter(new BufferedWriter(new FileWriter("mozne.txt", true))); 
            Calendar cal = Calendar.getInstance(); 
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 
            writer4.println("End file in " + sdf.format(cal.getTime()));          
            writer4.close();  

            return true; 
           } 

           Pocty.hladam=tah; 
          } 
         } 
       break cit; 
      } 
     } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return false; 
    } 

Пожалуйста, у вас есть какие-то способы решения проблемы? НО, если я установил линию 500 000, это более 1 с. но файл имеет 19 000 000 строк.

ответ

3

Я не уверен, получил ли я вашу идею, но если вы хотите обработать некоторые строки в файле, начиная с строки X до строки Y, я бы рекомендовал использовать File.lines() метод:

public static void processLinesFromPoint(int startLine, int numberOfLinesToProcess) throws IOException { 
    //assume startLine = 5000 
    //  numberOfLinesToProcess = 500 
    Stream<String> lines = Files.lines(Paths.get(pathToYourFile)).skip(startLine).limit(numberOfLinesToProcess); 
    //lines.forEach method to loop through lines 5000 to 5500 (startLine+numberOfLinesToProcess) 
    //and printing each line 
    lines.forEach(currentLine->{ 
     //here goes your logic to process each line... 
     System.out.println(currentLine) 
    }); 
} 

Files.lines имеет функции, так что вы можете получить необходимое количество линий и использовать Files.lines() COUNT(), чтобы получить общее количество строк в файле..

P.S: Я использую этот метод для обработки файлов по 2Gb, я надеюсь, что ответ будет полезен)

+0

и как получить StartLine в строку? – user7575308

+1

Как вы можете видеть переменную _lines_ является тип данных Stream , поэтому вы можете циклически перебирать поток, используя lambda (Java8). 'lines.forEach (l -> { // здесь идет ваша логика для обработки каждой строки ... });' } ** l ** - начальная линия, и она уже находится в цикле –

+1

@ user7575308 Обновлен ответ , надеюсь, теперь это становится яснее. –