[Java] كيفية قراءة ملف نصي كبير سطر عن طريق استخدام جافا؟


Answers

انظر إلى هذا بلوق:

قد يتم تحديد حجم المخزن المؤقت أو قد يتم استخدام الحجم الافتراضي. الافتراضي هو كبير بما فيه الكفاية لمعظم الأغراض.

// 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
br.close();
Question

أنا بحاجة لقراءة ملف نصي كبير من حوالي 5-6 GB خط عن طريق استخدام جافا.

كيف يمكنني القيام بذلك بسرعة؟




يمكنك استخدام البث لإجراء ذلك بشكل أكثر دقة:

Files.lines(Paths.get("input.txt")).forEach(s -> stringBuffer.append(s);



فيما يلي نموذج مع معالجة الأخطاء الكاملة ودعم مواصفات charset لـ pre-Java 7. باستخدام Java 7 يمكنك استخدام بنية try-with-resources ، مما يجعل نظافة الشفرة.

إذا كنت ترغب فقط في الحرف الافتراضي ، يمكنك تخطي InputStream واستخدام FileReader.

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) { /* ensure close happens */ } }
    if (r != null) { try { r.close(); } catch(Throwable t) { /* ensure close happens */ } }
    if (ins != null) { try { ins.close(); } catch(Throwable t) { /* ensure close happens */ } }
}

في ما يلي إصدار Groovy ، مع معالجة الأخطاء الكاملة:

File f = new File("textfile.txt");
f.withReader("UTF-8") { br ->
    br.eachLine { line ->
        println line;
    }
}



الطريقة الواضحة لتحقيق ذلك ،

فمثلا:

إذا كان لديك dataFile.txt على الدليل الحالي

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();
    }
}

الإخراج مثل على النحو التالي ،




في Java 7:

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);
}



لقراءة الملف مع جافا 8

  package com.java.java8;

    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.stream.Stream;

    /**
     * The Class ReadLargeFile.
     *
     * @author Ankit Sood Apr 20, 2017
     */
    public class ReadLargeFile {

        /**
         * The main method.
         *
         * @param args
         *            the arguments
         */
        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();
        }
        }
    }



عادة ما أقوم بروتين القراءة بشكل مباشر:

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) {
        }
    }
}



ما يمكنك القيام به هو مسح النص بأكمله باستخدام الماسح الضوئي والانتقال من خلال النص بخط. بالطبع يجب عليك استيراد ما يلي:

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
    }
}

تفحص الماسح الضوئي كل النص بشكل أساسي. يتم استخدام حلقة while لاجتياز النص بأكمله.

.hasNextLine() هي قيمة منطقية ترجع true إذا كان لا يزال هناك المزيد من الأسطر في النص. تمنحك الدالة .nextLine() خطًا كاملاً كسلسلة يمكنك بعد ذلك استخدام الطريقة التي تريدها. جرب System.out.println(line) لطباعة النص.

ملاحظة جانبية: .txt هو نص نوع الملف.




يمكنك أيضًا استخدام 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();
}



في Java 8 ، يوجد أيضًا بديل لاستخدام Files.lines() . إذا كان مصدر الإدخال الخاص بك ليس ملفًا ، ولكنه شيء أكثر تجريدًا مثل Reader أو InputStream ، فيمكنك دفق الخطوط عبر طريقة الأسطر BufferedReader s lines() .

فمثلا:

try( BufferedReader reader = new BufferedReader( ... ) ) {
  reader.lines().foreach( line -> processLine( line ) );
}

سيتم استدعاء processLine() لكل سطر الإدخال للقراءة بواسطة BufferedReader .