Java istifadə edərək xəttinə görə böyük bir mətn faylı xəttini oxumaq necə?

Java istifadə edərək hər satırda təxminən 5-6 GB böyük bir mətn faylı oxumaq lazımdır.

Bunu tez bir şəkildə necə edə bilərəm?

736
03 мая '11 в 13:53 2011-05-03 13:53 Manoj Singh 03 May '13 'də saat 13:53' də təyin olundu
ответ 21 cavab

Ortaq bir nümunədir

 try (BufferedReader br = new BufferedReader(new FileReader(file))) { String line; while ((line = br.readLine()) != null) { // process the line. } } 

Karakter kodlamasının eksik olduğunu varsayarsanız, məlumatları daha sürətli oxuya bilərsiniz. məsələn, ASCII-7, lakin çox əhəmiyyətli deyil. Çox ehtimal ki, data ilə etdiyiniz işlər çox daha uzun sürəcək.

EDIT: line sızıntısını aradan qaldırmaq üçün daha az ümumi bir model.

 try(BufferedReader br = new BufferedReader(new FileReader(file))) { for(String line; (line = br.readLine()) != null; ) { // process the line. } // line is not visible here. } 

ƏLAVƏ OLUNUB: java 8-də edə bilərsiniz

 try (Stream<String> stream = Files.lines(Paths.get(fileName))) { stream.forEach(System.out::println); } 

Qeyd. Stream-in -resource blokuna yerləşdirməlisiniz, çünki #close metodu bunun üçün çağırılır, əks halda əsas fayl identifikatoru GC daha sonra bunu etməyincə heç vaxt bağlanmaz.

932
03 мая '11 в 14:07 2011-05-03 14:07 Cavab Peter Lawrey tərəfindən mayın 03 '11 'də 14:07' də verildi. 2011-05-03 14:07

Bu bloga bir göz atın:

border=0

Bufer ölçüsü müəyyən edilə bilər və ya u mənim ölçüsü istifadə edilə bilər. Varsayılan dəyər ən məqsədlər üçün kifayət qədər böyükdür.

 // Open the file FileInputStream fstream = new FileInputStream("textfile.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); String strLine; //Read File Line By Line while ((strLine = br.readLine()) != null) { // Print the content on the console System.out.println (strLine); } //Close the input stream fstream.close(); 
127
03 мая '11 в 13:57 2011-05-03 13:57 cavab 03 May '11 'də 13:57' də verildi 2011-05-03 13:57

eksik olduğundan (2014-cü il mart) axınlardan istifadə edə bilərsiniz:

 try (Stream<String> lines = Files.lines(Paths.get(filename), Charset.defaultCharset())) { lines.forEachOrdered(line -> process(line)); } 

Fayldakı bütün xətləri yazdırın:

 try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) { lines.forEachOrdered(System.out::println); } 
81
25 июля '13 в 21:58 2013-07-25 21:58 cavab msayag 25 iyul 2013, saat 21:58 da verilir

Java-əvvəlcədən Java üçün kodlama dəqiqləşdirilməsi üçün tam səhvlərin idarə edilməsi və dəstəyi ilə nümunə. 7-ci sinifdə, kodu təmizləyici edən qaynaq-sintaksisi ilə istifadə edə bilərsiniz.

Yalnız standart kodlaşdırma istifadə etmək istəyirsinizsə, InputStream keçmək və FileReader istifadə edə bilərsiniz.

 InputStream ins = null; // raw byte-stream Reader r = null; // cooked reader BufferedReader br = null; // buffered for readLine() try { String s; ins = new FileInputStream("textfile.txt"); r = new InputStreamReader(ins, "UTF-8"); // leave charset out for default br = new BufferedReader(r); while ((s = br.readLine()) != null) { System.out.println(s); } } catch (Exception e) { System.err.println(e.getMessage()); // handle exception } finally { if (br != null) { try { br.close(); } catch(Throwable t) {  } } if (r != null) { try { r.close(); } catch(Throwable t) {  } } if (ins != null) { try { ins.close(); } catch(Throwable t) {  } } } 

Tam səhv idarə ilə Groovy versiyası:

 File f = new File("textfile.txt"); f.withReader("UTF-8") { br -> br.eachLine { line -> println line; } } 
35
27 марта '13 в 7:24 2013-03-27 07:24 Cavab DarkStar tərəfindən 27 Mart 2013 tarixində 7 : 24- də verilir. 2013-03-27 07:24

Java 8-də bunu edə bilərsiniz:

 try (Stream<String> lines = Files.lines (file, StandardCharsets.UTF_8)) { for (String line : (Iterable<String>) lines::iterator) { ; } } 

Bəzi qeydlər: Files.lines (ən iş parçacığından fərqli olaraq) tərəfindən qaytarılan axının bağlanması lazımdır. Burada verilən səbəblərdən forEach() istifadə etməyin. Qəribə kod (Iterable<String>) lines::iterator bir dartı Yeterli'ye keçir.

21
15 дек. Aleksandr Dubinsky tərəfindən verilmiş cavab 15 Dekabr. 2013-12-15 12:38 '13 at 12:38 2013-12-15 12:38

Nə edə bilərsənsə, bütün mətni bir skaner ilə tarayın və mətnə ​​görə sat. Əlbəttə, aşağıdakıları idxal etməlisiniz:

 import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public static void readText throws FileNotFoundException { Scanner scan = new Scanner(new File("samplefilename.txt")); while(scan.hasNextLine()){ String line = scan.nextLine(); //Here you can manipulate the string the way you want } } 

Tarayıcı əsasən bütün mətni tarar. Mətnlə hərəkət etmək üçün isə loop istifadə olunur.

.hasNextLine() funksiyası, mətndə daha çox xətlər olduqda, həqiqəti qaytaran məntiqi bir vasitədir. .nextLine() funksiyası sizə istənilən şəkildə istifadə edə biləcək bir simli olaraq bütün xətti verir. Mətni çap System.out.println(line) .

Yan Qeyd: .txt faylın növüdür.

19
12 сент. cavab iskandarchacra 12 sep verilir . 2015-09-12 21:43 '15 at 21:43 2015-09-12 21:43

FileReader, bir karakter kodlamasını belirlemenize izin InputStreamReader ; belirtmeniz InputStreamReader istifadə edin:

 try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "Cp1252")); String line; while ((line = br.readLine()) != null) { // process the line. } br.close(); } catch (IOException e) { e.printStackTrace(); } 

Bu dosyayı Windows'dan idxal etsəniz, ANSI kodlaması (Cp1252) ola bilər, belə ki kodlamanı göstərməlisiniz.

17
26 янв. cavab 26 yaşa canlı sevgi verilir . 2015-01-26 23:43 '15 at 23:43 2015-01-26 23:43

Java 7-də:

 String folderPath = "C:/folderOfMyFile"; Path path = Paths.get(folderPath, "myFileName.csv"); //or any text file eg.: txt, bat, etc Charset charset = Charset.forName("UTF-8"); try (BufferedReader reader = Files.newBufferedReader(path , charset)) { while ((line = reader.readLine()) != null ) { //separate all csv fields into string array String[] lineVariables = line.split(","); } } catch (IOException e) { System.err.println(e); } 
15
09 апр. Diego Duarte tərəfindən verilmiş cavab 09 Apr 2014-04-09 03:52 '14 da 3:52 2014-04-09 03:52

Java'da faylları oxumaq üçün 10 fərqli şəkildə sənədləşdirdilər və test etdilər , sonra bir-biri ilə müqayisə etdilər və test fayllarında 1 KB-dən 1 GB-a qədər test faylları oxumağa səbəb oldular. 1 GB'lik bir test faylı oxumaq üçün ən sürətli 3 fayl oxuma metodu.

Qeyd edək ki, performans testlərini yerinə yetirərkən konsolda heç bir şey çıxarmamışdım, çünki bu testləri həqiqətən yavaşlatırdı. Yalnız oxuma sürətini yoxlamaq istəmişdim.

1) java.nio.file.Files.readAllBytes ()

Java 7, 8, 9-da test edilmişdir. Ümumiyyətlə, ən sürətli metod idi. 1 GB faylın oxunması həmişə 1 saniyədən az olmuşdur.

 import java.io..File; import java.io.IOException; import java.nio.file.Files; public class ReadFile_Files_ReadAllBytes { public static void main(String [] pArgs) throws IOException { String fileName = "c:\\temp\\sample-1GB.txt"; File file = new File(fileName); byte [] fileBytes = Files.readAllBytes(file.toPath()); char singleChar; for(byte b : fileBytes) { singleChar = (char) b; System.out.print(singleChar); } } } 

2) java.nio.file.Files.lines ()

Java 8 və 9-da uğurla sınaqdan keçirildi, lakin lambda ifadələrinə dəstək olmaması səbəbindən Java 7-də işləməyəcək. 1 GB faylını oxumaq təxminən 3,5 saniyə çəkdi və böyük faylları oxuduqdan sonra ikinci yerə qoydu.

 import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.stream.Stream; public class ReadFile_Files_Lines { public static void main(String[] pArgs) throws IOException { String fileName = "c:\\temp\\sample-1GB.txt"; File file = new File(fileName); try (Stream linesStream = Files.lines(file.toPath())) { linesStream.forEach(line -> { System.out.println(line); }); } } } 

3) BufferedReader

Java 7, 8, 9-da işləmək üçün sınaqdan keçirildi. 1 GB test faylı oxumaq üçün təxminən 4,5 saniyə çəkdi.

 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFile_BufferedReader_ReadLine { public static void main(String [] args) throws IOException { String fileName = "c:\\temp\\sample-1GB.txt"; FileReader fileReader = new FileReader(fileName); try (BufferedReader bufferedReader = new BufferedReader(fileReader)) { String line; while((line = bufferedReader.readLine()) != null) { System.out.println(line); } } } 

Bütün 10 faylı oxu metodunun tam reytinqini burada tapa bilərsiniz .

10
08 апр. cavab gomisha 08 apr tərəfindən verilir . 2018-04-08 03:10 '18 'də 3:10' də 2018-04-08 03:10 'də

Tarayıcı sinifindən istifadə edə bilərsiniz

 Scanner sc=new Scanner(file); sc.nextLine(); 
9
03 мая '11 в 14:00 2011-05-03 14:00 Cavab 03 may 11-də saat 14: 00- da Abhilaş tərəfindən verilir .

Java 8 istifadə edərək bir fayl oxumaq

  package com.java.java8; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream;  public class ReadLargeFile {  public static void main(String[] args) { try { Stream<String> stream = Files.lines(Paths.get("C:\\Users\\System\\Desktop\\demoData.txt")); stream.forEach(System.out::println); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 
9
20 апр. Cavab Ankit Sood tərəfindən verilir 20 Aprel. 2017-04-20 12:45 '17 saat 12:45 'də 2017-04-20 12:45' də

Java Files.lines() istifadə etmək üçün alternativ də var. Giriş qaynağınız bir fayl deyilsə, ancaq bir şey daha mücərrəddir, məsələn, ReaderInputStream , InputStream lines() metodunu istifadə edərək xətləri ötürə bilərsiniz.

Məsələn:

8
07 июля '15 в 13:13 2015-07-07 13:13 Rüdiger Herrmann tərəfindən 07.07.2014 tarixində saat 13:13 radələrində cavab verilib

readLine() metodundan istifadə readLine() . Bu sinifdən yeni bir obyekt yaradın və bu üsulu ona tətbiq edin və onu simli bir şəkildə saxlaya bilərsiniz.

BufferReader Javadoc

7
03 мая '11 в 14:00 2011-05-03 14:00 Cavab Master C 03 May '11 saat 14:00 'da verilir. 2011-05-03 14:00

Java 9:

 try (Stream<String> stream = Files.lines(Paths.get(fileName))) { stream.forEach(System.out::println); } 
6
20 мая '14 в 15:24 2014-05-20 15:24 Cavab Abdennour TOUMI tərəfindən verilir May 20, '14 saat 15:24 2014-05-20 15:24

Buna nail olmaq üçün aydın bir yol,

Məsələn:

Mövcud kataloqunuzda dataFile.txt varsa

 import java.io.*; import java.util.Scanner; import java.io.FileNotFoundException; public class readByLine { public readByLine() throws FileNotFoundException { Scanner linReader = new Scanner(new File("dataFile.txt")); while (linReader.hasNext()) { String line = linReader.nextLine(); System.out.println(line); } linReader.close(); } public static void main(String args[]) throws FileNotFoundException { new readByLine(); } } 

Aşağıdakı kimi çıxın 2019

20 авг. Rajamohan S tərəfindən verilmiş cavab 20 Avqust. 2016-08-20 18:33 '16 at 18:33 2016-08-20 18:33
 BufferedReader br; FileInputStream fin; try { fin = new FileInputStream(fileName); br = new BufferedReader(new InputStreamReader(fin));  String line = br.readLine(); while (line != null) { String[] attributes = line.split(","); Movie movie = createMovie(attributes); movies.add(movie); line = br.readLine(); } fin.close(); br.close(); } catch (FileNotFoundException e) { System.out.println("Your Message"); } catch (IOException e) { System.out.println("Your Message"); } 

Mənim üçün işləyir. Bu da çox kömək edir.

3
17 сент. Cavab Dipendra Ghatal 17 sep tərəfindən verilir . 2017-09-17 13:07 '17 saat 13:07 'da 2017-09-17 13:07

Adətən mən adətən oxu prosedurunu yerinə yetirirəm:

 void readResource(InputStream source) throws IOException { BufferedReader stream = null; try { stream = new BufferedReader(new InputStreamReader(source)); while (true) { String line = stream.readLine(); if(line == null) { break; } //process line System.out.println(line) } } finally { closeQuiet(stream); } } static void closeQuiet(Closeable closeable) { if (closeable != null) { try { closeable.close(); } catch (IOException ignore) { } } } 
2
22 мая '15 в 11:08 2015-05-22 11:08 Cavab Binkan Salaryman tərəfindən 22 May '15 'də 11:08' də verilir 2015-05-22 11:08

Bunu daha dəqiq etmək üçün mövzuları istifadə edə bilərsiniz:

 Files.lines(Paths.get("input.txt")).forEach(s -> stringBuffer.append(s); 
0
22 сент. cavab Sep 22 verildi 2017-09-22 14:28 '17 də 2:28 pm 2017-09-22 14:28

apache commons io istifadə edə bilərsiniz apache commons io :

 File file = new File("/home/user/file.txt"); try { List<String> lines = FileUtils.readLines(file); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 
0
22 апр. Cavab 22 aprel tarixində Kra'ya verilir 2015-04-22 11:51 '15 at 11:51 am 2015-04-22 11:51

Bu kodu istifadə edə bilərsiniz:

 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class ReadTextFile { public static void main(String[] args) throws IOException { try { File f = new File("src/com/data.txt"); BufferedReader b = new BufferedReader(new FileReader(f)); String readLine = ""; System.out.println("Reading file using Buffered Reader"); while ((readLine = b.readLine()) != null) { System.out.println(readLine); } } catch (IOException e) { e.printStackTrace(); } } } 
0
26 окт. Cavab Usman Yaqoob tərəfindən 26 oct. 2017-10-26 22:42 '17 saat 10:42 'da 2017-10-26 22:42

Org.apache.commons.io paketini istifadə edərək, xüsusən Java 6 və daha aşağı istifadə edən köhnə kodda yüksək performans təmin etmişdir.
Java 7 üçün daha az istisna işlədilməsi və tam metodlardan daha tam istifadə edilməsi ilə daha yaxşı bir API var.

 LineIterator lineIterator =null; try{ lineIterator = FileUtils.lineIterator(new File("/home/username/m.log"), "windows-1256");//second parameter is optionanl while (lineIterator.hasNext()){ String currentLine = lineIterator.next(); //some operation } }finally { LineIterator.closeQuietly(lineIterator); } 

bir mütəxəssis

 <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> 
0
19 янв. Cavab mohsen.nour Jan 19 verilir 2019-01-19 11:19 '19 saat 11:19 'da

bağlı digər suallar, etiketləri və ya bir sual verin