2017-02-16 114 views
0

您好,我有一個讀取文件的問題。用metod 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; 
    } 

請問你有些IDE如何解決問題?但如果我設置了500000行,它會超過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()數()得到總行文件。

P.S:我用這個方法超過2GB的處理文件,我希望答案是有用的)

+0

,以及如何獲得STARTLINE串? – user7575308

+1

正如你所看到的_lines_變量是流數據類型,所以你可以使用lambda(Java8)循環流。 'lines.forEach(l - > { //這裏是你的邏輯來處理每一行...... });' ** l **是startline,它已經是循環中的字符串了 –

+1

@ user7575308更新了答案希望現在更清楚。 –