জাভা ব্যবহার করে আমি কীভাবে একটি বড় পাঠ্য ফাইল লাইন পড়তে পারি?


846

আমার জাভা ব্যবহার করে প্রায় 5-6 জিবি লাইনের একটি বড় টেক্সট ফাইল পড়তে হবে।

আমি কীভাবে এটি দ্রুত করতে পারি?


69
@ কমাসি এট অল। এই প্রশ্নটিকে নকল হিসাবে চিহ্নিত করা উচিত নয়। "দ্রুত শেষ পংক্তিটি পড়ুন" কোনও বিকল্প নয় এবং এটি "পাঠ্য-ফাইল লাইনের মাধ্যমে লাইন পড়ার দ্রুততম উপায়" কিনা তা বিতর্কযোগ্য। কিছু করার দ্রুততম উপায় অগত্যা সাধারণ উপায় নয়। তদতিরিক্ত, নীচের উত্তরগুলিতে কোড অন্তর্ভুক্ত রয়েছে, আপনার তালিকাভুক্ত সর্বাধিক প্রাসঙ্গিক বিকল্পটি নয়। এই প্রশ্ন দরকারী। এটি বর্তমানে "জাভা পঠিত ফাইল লাইনে লাইনে" শীর্ষস্থানীয় গুগল অনুসন্ধান ফলাফল। শেষ অবধি, স্ট্যাকের ওভারফ্লোতে পৌঁছানোর জন্য এটি খুঁজে পাবে এবং প্রতি 2 টি প্রশ্নের মধ্যে 1 টি নিষ্পত্তি করার জন্য চিহ্নিত করা হয়েছে।
প্যাট্রিক কুলেন

5
এখানে ছয়টি সম্ভাব্য বাস্তবায়নের জন্য গতির তুলনা করা হল।
সার্জ এম টেন

4
ইভেন্ট যদিও আমি মন্তব্যগুলি পড়ছি যে এই বিতর্ক করে যে এসও এর ঘনিষ্ঠ নীতিটি সাফল্য পেয়েছে, এসও তাতে অবিচল থাকে। এটি যে কোনও সংকীর্ণ মনের বিকাশকারী দৃষ্টিকোণটি হ'ল বিনা খরচে অযৌক্তিকতা এড়াতে চায়! শুধু হতে দাও! ক্রিমটি শীর্ষে উঠে যাবে এবং sh * টি নীচে ডুবে যাবে কেবল নিজেরাই fine যদিও এর আগে একটি প্রশ্ন জিজ্ঞাসা করা হতে পারে (কোন প্রশ্নটি নয় ??), এর অর্থ এই নয় যে কোনও নতুন প্রশ্ন এর উত্তর দিতে পারে না, ভাল উত্তর পেতে পারে, সার্চ ইঞ্জিনগুলিতে উচ্চতর র‌্যাঙ্কস ইত্যাদি। আকর্ষণীয়ভাবে, এটি প্রশ্নটি এখন 'সুরক্ষিত' ....
স্টিজন ডি উইট

3
কেবল শিরোনাম পড়ে প্রশ্নগুলি কীভাবে সদৃশ হিসাবে চিহ্নিত হয় এটি অবিশ্বাস্য।
লুক 8

উত্তর:


1063

একটি সাধারণ প্যাটার্ন ব্যবহার করা হয়

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

আপনি যদি ধরে নেন কোনও চরিত্রের এনকোডিং নেই তবে আপনি ডেটাটি দ্রুত পড়তে পারেন। উদাহরণস্বরূপ ASCII-7 তবে এতে খুব বেশি পার্থক্য হবে না। এটি অত্যন্ত সম্ভবত যে আপনি ডেটা দিয়ে যা করেন তা অনেক বেশি সময় নেয়।

সম্পাদনা: ব্যবহার করার জন্য একটি কম সাধারণ প্যাটার্ন যা lineফাঁসের সুযোগ এড়ায়।

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

আপডেট: জাভা 8 এ আপনি করতে পারেন

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

দ্রষ্টব্য: আপনি # ক্লোজ পদ্ধতিটি কল করা হয়েছে কিনা তা নিশ্চিত করার জন্য আপনাকে স্ট্রিমটি একটি চেষ্টা করে রিসোর্স ব্লকে স্থাপন করতে হবে, অন্যথায় অন্তর্নিহিত ফাইল হ্যান্ডেলটি কখনই বন্ধ হয় না যতক্ষণ না জিসি এটি পরে না করে।


6
সঠিক ব্যতিক্রম হ্যান্ডলিংয়ের সাথে এই প্যাটার্নটি দেখতে কেমন? আমি নোট করেছি যে br.close () IOException নিক্ষেপ করে, যা আশ্চর্যজনক বলে মনে হয় - যে কোনওভাবে পড়ার জন্য খোলা ফাইলটি বন্ধ করার সাথে কী ঘটতে পারে? ফাইলরেডার এর কনস্ট্রাক্টর একটি ফাইলনটফাউন্ড ব্যতিক্রম নিক্ষেপ করতে পারে।
মাইকবি

3
আমার কাছে যদি 200MB ফাইল থাকে এবং এটি 90MB / s এ পড়তে পারে তবে আমি কি এটি ~ 3s নেওয়ার আশা করব? আমার এই "ধীর" পড়ার পদ্ধতিতে কয়েক মিনিট সময় লাগবে। আমি একটি এসএসডি তে আছি তাই পড়ার গতিতে সমস্যা হওয়া উচিত নয়?
জিউ মেনগ

4
@ জিউমেং এসও আপনি সন্দেহ করছেন যে আপনি যা করছেন তা সময় নিচ্ছে। আপনি কি কেবল ফাইলের লাইনগুলি পড়ার চেষ্টা করতে পারেন এবং কিছুই নয়।
পিটার লরি

44
for(String line = br.readLine(); line != null; line = br.readLine())বিটিডব্লু কেন নয় , জাভা 8-এ আপনি করতে পারেন try( Stream<String> lines = Files.lines(...) ){ for( String line : (Iterable<String>) lines::iterator ) { ... } }যা ঘৃণা করা শক্ত নয়।
আলেকসান্দ্র ডাবিনস্কি

26
@ আলেকসান্ডারডুবিনস্কি জাভা 8-এ বন্ধ হওয়ার সাথে আমার যে সমস্যাটি রয়েছে তা হ'ল এটি খুব সহজেই কোডটি পড়তে আরও জটিল করে তোলে (পাশাপাশি ধীরে ধীরে) আমি প্রচুর বিকাশকারীকে এটি অতিরিক্ত ব্যবহার করতে দেখতে পাচ্ছি কারণ এটি "দুর্দান্ত"।
পিটার লরি

155

এই ব্লগ দেখুন:

বাফার আকার নির্দিষ্ট করা যেতে পারে, বা ডিফল্ট আকার ব্যবহার করা যেতে পারে। বেশিরভাগ উদ্দেশ্যে ডিফল্ট যথেষ্ট বড়।

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

6
আমার ফাইলটি 1.5 গিগ এবং আপনার উত্তরটি ব্যবহার করে ফাইলটি পড়া সম্ভব নয়!
আবুজার রাজাবি

3
@ আবুজাররাজী অবশ্যই এটি সম্ভব। এই কোডটি কোনও পাঠ্য ফাইল পড়তে পারে।
ব্যবহারকারী 207421

10
নিম্ন মানের লিঙ্কের জন্য ডাউনভোটেড। একটি সম্পূর্ণ অর্থহীন DataInputStream, এবং ভুল প্রবাহ বন্ধ আছে। জাভা টিউটোরিয়ালের সাথে কোনওরকম ভুল নেই, এবং এটির মতো নির্বিচারে তৃতীয় পক্ষের ইন্টারনেট আবর্জনা উদ্ধৃত করার প্রয়োজন নেই।
ব্যবহারকারী 207421

1
আমি মন্তব্যগুলি খালি করব, আপনার কাছে 6 লাইনের কোডের জন্য 100% রিডানড্যান্ট মন্তব্যগুলির 4 লাইন রয়েছে।
মহিষ

97

একবার জাভা 8 বের হয়ে গেলে (মার্চ 2014) আপনি স্ট্রিম ব্যবহার করতে সক্ষম হবেন:

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

ফাইলের সমস্ত লাইন মুদ্রণ করা হচ্ছে:

try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) {
  lines.forEachOrdered(System.out::println);
}

1
সংক্ষিপ্ততার জন্য ব্যবহার করুন StandardCharsets.UTF_8, ব্যবহার করুন Stream<String>এবং ব্যবহার এড়িয়ে চলুন forEach()এবং বিশেষত forEachOrdered()যদি কোনও কারণ না থাকে।
আলেকসান্দ্র ডাবিনস্কি

2
কেন এচ () এড়ানো হবে? এটা কি খারাপ?
স্টিভেন্টব্লব

আমি যদি প্রতিটি ফরওয়ার্ডের পরিবর্তে প্রতিটি জন্য থাকি তবে লাইনগুলি শৃঙ্খলাবদ্ধভাবে ছাপানো হতে পারে, তাই না?
মিশায়াগ

2
@steventrouble কটাক্ষপাত: stackoverflow.com/questions/16635398/... এটা খারাপ যদি আপনি চান একটি সংক্ষিপ্ত ফাংশন রেফারেন্স পাস না forEach(this::process), কিন্তু এটা কুশ্রী পায় যদি আপনি ভিতরে lambdas যেমন কোডের ব্লক লিখতে forEach()
আলেকসান্ডার ডাবিনস্কি

2
@ এমায়াগ, আপনি ঠিক বলেছেন, ক্রমটি forEachOrderedকার্যকর করতে আপনার প্রয়োজন । সচেতন থাকুন যে সেক্ষেত্রে আপনি স্ট্রিমটিকে সমান্তরাল করতে পারবেন না, যদিও আমি খুঁজে পেয়েছি যে ফাইলটিতে কয়েক হাজার লাইন না থাকলে সমান্তরালতা চালু হয় না।
আলেকসান্দ্র ডাবিনস্কি

38

প্রাক-জাভা 7. এর জন্য সম্পূর্ণ ত্রুটি পরিচালনা ও সমর্থনকারী চরসেটের বিশদকরণ সহ একটি নমুনা এখানে Java. জাভা With এর সাহায্যে আপনি ট্রান্স-রিসোর্স সিনট্যাক্স ব্যবহার করতে পারেন, যা কোড ক্লিনার করে।

আপনি যদি কেবল ডিফল্ট চরসেটটি চান তবে আপনি ইনপুটস্ট্রিমটি এড়িয়ে যেতে পারেন এবং ফাইলআরডার ব্যবহার করতে পারেন।

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

এখানে পুরো ত্রুটি পরিচালনা সহ গ্রুভি সংস্করণ রয়েছে:

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

1
কী এক করে ByteArrayInputStreamএকটি স্ট্রিং দ্বারা প্রতিপালিত বৃহৎ টেক্সট ফাইল পড়া কি আছে আক্ষরিক?
ব্যবহারকারী 207421

একেবারে অকেজো বন্ধ। প্রতিটি স্ট্রিম বন্ধ করার শূন্য কারণ রয়েছে। আপনি যদি সেগুলির কোনও স্ট্রিম বন্ধ করেন তবে আপনি অন্য সমস্ত স্ট্রিম স্বয়ংক্রিয়ভাবে বন্ধ করে দিন ...
এনারসিসিও

21

জাভা 8 এ, আপনি করতে পারেন:

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

কিছু দ্রষ্টব্য: ফিরে আসা স্ট্রিমটি Files.lines(বেশিরভাগ স্ট্রিমের বিপরীতে) বন্ধ করা দরকার। এখানে উল্লিখিত কারণে আমি ব্যবহার এড়াচ্ছি forEach()। অদ্ভুত কোডটি (Iterable<String>) lines::iteratorএকটি স্ট্রিমকে একটি আইটেবলের পক্ষে ফেলে।


কার্যকর না হলেও Iterableএই কোডটি কার্যকরভাবে নির্ধারণ করা কুৎসিত । এটি (Iterable<String>)কাজ করার জন্য একটি কাস্ট (যেমন ) প্রয়োজন)
স্টিফান

এই পদ্ধতিতে আমি কীভাবে প্রথম লাইনটি এড়িয়ে যেতে পারি?
কিড

2
@ কিয়েডfor(String line : (Iterable<String>) lines.skip(1)::iterator)
আলেকসান্দ্র

1
আপনি আসলে ব্যবহার করতে ইচ্ছুক না থাকেন Stream, বৈশিষ্ট্য ব্যবহার Files.newBufferedReaderপরিবর্তে Files.linesএবং বারবার আহ্বান readLine()পর্যন্ত nullপরিবর্তে নির্মান ব্যবহার করার মত (Iterable<String>) lines::iteratorঅনেক সহজ হবে বলে মনে হয় ...
হোলগার

আপনি কেন :: লাইনগুলিতে :: পুনরুক্তি ব্যবহার করবেন? আমি কেবলমাত্র ব্যবহারের জন্যই জানি: ল্যাম্বদা ফাংশনে প্যাকেজ পদ্ধতির নাম প্যাকেজ করা। লুপ পরামিতি জন্য In পরে: যখন আপনি ব্যবহার কিছু ল্যামডা পদ্ধতি পেতে :: পরিবর্তনশীল হওয়া উচিত
Trismegistos

19

আপনি যা করতে পারেন তা হ'ল স্ক্যানারটি ব্যবহার করে পুরো পাঠ্যটি স্ক্যান করুন এবং পাঠ্য লাইনটি লাইনে যেতে হবে। অবশ্যই আপনার নিম্নলিখিতগুলি আমদানি করা উচিত:

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

স্ক্যানার মূলত সমস্ত পাঠ্য স্ক্যান করে। লুপটি পুরো পাঠ্যের মধ্য দিয়ে যেতে ব্যবহার করা হয়।

.hasNextLine()ফাংশন একটি বুলিয়ান যে সত্য ফেরৎ যদি টেক্সট এখনও আরও লাইন হয়। .nextLine()ফাংশন আপনি একটি স্ট্রিং যা আপনি পরে আপনি যেভাবে চান ব্যবহার করতে পারেন যেমন একটি সম্পূর্ণ লাইন দেয়। System.out.println(line)পাঠ্য মুদ্রণের চেষ্টা করুন ।

পার্শ্ব দ্রষ্টব্য: .txt ফাইল টাইপ পাঠ্য।


এর পরিবর্তে পদ্ধতির ঘোষণাকে দেখে নেওয়া উচিত নয়: ´ গণতান্ত্রিক স্ট্যাটিক শূন্য পাঠের পাঠ্য ফাইলনটফাউন্ডএক্সেপশন () rows ´ পছন্দ: ublicপ্রজাতন্ত্রী স্ট্যাটিক শূন্যপদ পাঠ্য পাঠ্য () ফাইলনটফাউন্ডএক্সেপশন) th
কেটকম্প

এটি তুলনায় যথেষ্ট ধীর BufferedReader.readLine()এবং তিনি সেরা পারফরম্যান্স পদ্ধতিটি চেয়েছিলেন।
ব্যবহারকারী 207421

18

ফাইলরেডার আপনাকে এনকোডিং নির্দিষ্ট করতে দেয় না, তার InputStreamReaderপরিবর্তে যদি আপনাকে এটি নির্দিষ্ট করে প্রয়োজন হয় তা ব্যবহার করুন:

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

আপনি যদি উইন্ডোজ থেকে এই ফাইলটি আমদানি করেন তবে এটিতে এএনএসআই এনকোডিং থাকতে পারে (Cp1252), সুতরাং আপনাকে এনকোডিং নির্দিষ্ট করতে হবে।


17

আমি জাভাতে একটি ফাইল পড়ার জন্য 10 টি বিভিন্ন উপায়ে নথিভুক্ত ও পরীক্ষিত করেছি এবং তারপরে 1KB থেকে 1GB পর্যন্ত টেস্ট ফাইলগুলিতে পড়ার মাধ্যমে একে অপরের বিরুদ্ধে চালিয়েছি। 1GB পরীক্ষার ফাইল পড়ার জন্য এখানে দ্রুত 3 ফাইল পড়ার পদ্ধতি রয়েছে।

নোট করুন যে পারফরম্যান্স টেস্টগুলি চালানোর সময় আমি কনসোলে কিছুই আউটপুট পাইনি যেহেতু সত্যই পরীক্ষাটি ধীর হয়ে যাবে। আমি কেবল কাঁচা পড়ার গতি পরীক্ষা করতে চেয়েছিলাম।

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

জাভা 7, 8, 9. এ পরীক্ষিত এটি সামগ্রিকভাবে দ্রুততম পদ্ধতি ছিল। একটি 1 জিবি ফাইল পড়ার ধারাবাহিকভাবে ঠিক 1 সেকেন্ডের নীচে ছিল।

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

এটি জাভা 8 এবং 9 এ সফলভাবে পরীক্ষা করা হয়েছিল তবে লাম্বদা এক্সপ্রেশনগুলির সমর্থন না থাকার কারণে এটি জাভা 7 তে কাজ করবে না। এটি একটি ১ জিবি ফাইলে পড়তে প্রায় ৩.৫ সেকেন্ড সময় নিয়েছিল যা বড় ফাইলগুলি পড়া পর্যন্ত এটি দ্বিতীয় স্থানে রেখেছিল।

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) বাফারডারিডার

জাভা 7, 8, 9 এ কাজ করার জন্য পরীক্ষিত হয়েছিল 1 জিবি পরীক্ষার ফাইলে পড়তে এটি প্রায় 4.5 সেকেন্ড সময় নিয়েছিল।

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

আপনি এখানে 10 টি ফাইল পঠনের জন্য সম্পূর্ণ র‌্যাঙ্কিং সন্ধান করতে পারেন ।


1
আপনার গাইডটি আশ্চর্যজনক :)
ফয়সাল জুলাইদান

আপনি বেশিরভাগ সময় System.out.print/println()এখানে সময় হয়; আপনি ধরে নিচ্ছেন যে ফাইলটি আপনার প্রথম দুটি ক্ষেত্রে মেমরির সাথে খাপ খায়।
ব্যবহারকারী 207421

যথেষ্ট ফর্সা। আমার উত্তরটিতে এই অনুমানগুলি আরও স্পষ্ট করে তুলতে পারতাম।
gomisha

16

জাভা 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);
}

9
সচেতন থাকা! লাইন.স্প্লিটটি এইভাবে ব্যবহার করা যদি কোনও ক্ষেত্রে কমা থাকে এবং এটি চারপাশে উদ্ধৃতি দ্বারা আবদ্ধ থাকে তবে সঠিকভাবে বিশ্লেষণ করা যাবে না। এই বিভাজনটি এটিকে উপেক্ষা করবে এবং কেবলমাত্র অভ্যন্তরীণ কমা ব্যবহার করে ক্ষেত্রটিকে খণ্ডগুলিতে পৃথক করবে। এইচটিএইচ, মার্সেলো
মার্সেলো ফিঙ্কি

সিএসভি: কমা পৃথকীকরণকৃত মান ফাইল, সুতরাং আপনার কোনও CSV ক্ষেত্রে কমা ব্যবহার করা উচিত নয়, যদি না আপনি অন্য ক্ষেত্র যুক্ত করতে চান। সুতরাং, কোনও সিএসভি ফাইল পার্স করার সময় জাভাতে কমা টোকেনের জন্য বিভক্ত ব্যবহার করুন পুরোপুরি সূক্ষ্ম এবং সঠিক
ডিয়েগো ডুয়ার্টে

7
দিয়েগো, এটি সঠিক নয়। একমাত্র সিএসভি স্ট্যান্ডার্ড (আরএফসি 4180) সুনির্দিষ্টভাবে বলেছে "লাইনের ব্রেক (সিআরএলএফ), ডাবল কোট এবং কমাগুলি ডাবল-কোটে আবদ্ধ থাকতে হবে।"
serg.nechaev

2
StandardCharsets.UTF_8চেক করা ব্যতিক্রম এড়ানোর জন্য ব্যবহার করুনCharset.forName("UTF-8")
আলেকজান্ডার ডাবিনস্কি

2
আপনার মন্তব্যের জন্য আপনাকে "ডিয়েগো ডুয়ার্টে" ধন্যবাদ; আমাকে অবশ্যই বলতে হবে যে আমি "সার্জ.নেকাভ" জবাব দিয়েছি তার সাথে আমি একমত। আমি সিএসভি ফাইলগুলিতে 'সর্বদা' এম্বেড কমা দেখতে পাচ্ছি। লোকেরা আশা করে যে এটি গৃহীত হবে। সম্পূর্ণ সম্মানের সাথে. "সার্জ.নেচেভ" কেও ধন্যবাদ জানাই। আইএমএইচও আপনি ঠিক বলেছেন। সবাইকে চিয়ার্স করুন
মার্সেলো ফিঙ্কি

13

জাভা 8-তে, ব্যবহারের বিকল্পও রয়েছে Files.lines()। যদি আপনার ইনপুট উত্সটি কোনও ফাইল না হয় তবে একটি Readerবা এর মতো আরও বিমূর্ত কিছু হয় তবে InputStreamআপনি এস পদ্ধতির মাধ্যমে লাইনগুলি প্রবাহিত করতে পারেন ।BufferedReaderlines()

উদাহরণ স্বরূপ:

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

processLine()দ্বারা পড়া প্রতিটি ইনপুট লাইনের জন্য কল করবে BufferedReader


10

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

9

আপনি স্ক্যানার ক্লাস ব্যবহার করতে পারেন

Scanner sc=new Scanner(file);
sc.nextLine();

2
@ টিম 'মারাত্মকভাবে বোমা' শব্দটি সিএসে আমি স্বীকৃত একটি শব্দ নয়। আপনি ঠিক কি বোঝাতে চেয়েছেন?
ব্যবহারকারী 207421

বোগ ডাউন, খুব ধীরে ধীরে কার্যকর করুন, সম্ভবত ক্রাশ। আমার সম্ভবত এই সাইটে আইডিয়মগুলি এড়ানো উচিত;)
টিম

4
@ টিম কেন এটি করবে?
xehpuk

2
ব্যবহার Scannerকরা ভাল, তবে এই উত্তরটিতে এটি সঠিকভাবে ব্যবহারের জন্য সম্পূর্ণ কোড অন্তর্ভুক্ত নয়।
আলেকজান্ডার ডাবিনস্কি

5
@ টিম এই কোডটি 'ভয়ঙ্করভাবে বোমা ফেলবে' বা 'বগ ডাউন' করবে না বা 'খুব ধীরে ধীরে কার্যকর করবে না' বা সম্ভবত সম্ভবত ক্রাশ হবে না। লিখিত হিসাবে বাস্তবে এটি কেবল একটি লাইন পড়বে, প্রায় তাত্ক্ষণিকভাবে। আপনি প্রতি সেকেন্ডে এইভাবে মেগাবাইট পড়তে পারেন, যদিও BufferedReader.readLine()এটি বেশ কয়েকগুণ দ্রুত। আপনি যদি অন্যথায় মনে করেন তবে আপনার কারণগুলি সরবরাহ করুন।
ব্যবহারকারী 207421

7

আপনার readLine()পদ্ধতিটি ব্যবহার করতে হবে class BufferedReader। এই শ্রেণি থেকে একটি নতুন অবজেক্ট তৈরি করুন এবং তার উপর এই পদ্ধতিটি পরিচালনা করুন এবং এটিকে একটি স্ট্রিংয়ে সংরক্ষণ করুন।

বাফার রিডার জাভাদোক


দেখে মনে হচ্ছে বাফার রিডারপিআই-এর লিঙ্কটি নষ্ট হয়েছে
সন্দীপ

6

এটি অর্জনের সুস্পষ্ট উপায়,

উদাহরণ স্বরূপ:

আপনার যদি 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();
    }
}

নীচের মত আউটপুট, এখানে চিত্র বর্ণনা লিখুন


এটা পরিষ্কার হয় কেন? এবং এখানে লেখার ছবি পোস্ট করবেন না। পাঠ্য পোস্ট করুন।
ব্যবহারকারী 207421

আপনি একটি ছবি পোস্ট করেছেন। এটি পাঠ্যের একটি ছবি। আপনি সরাসরি এই পৃষ্ঠায় টেক্সট কেটে পেস্ট করতে পারতেন। প্রোগ্রাম পোস্ট করার বিষয়ে কেউ কিছু বলেনি। পাঠ্যের ছবি পোস্ট করা আপনার সময়ের অপচয়, যা আমি যত্ন করি না এবং ওউর ব্যান্ডউইথ, যা আমি করি।
ব্যবহারকারী 207421

6

জাভা 9:

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

2
আমার মনে হয় আপনার এটি করতে হবেSystem.getProperty("os.name").equals("Linux")
স্প্রিংলিয়নার

5
স্ট্রিংগুলির সাথে তুলনা করবেন না ==!
জোনাসসিজে - মনিকা

6
এটি ইতিমধ্যে অন্যদের দ্বারা পোস্ট হিসাবে জাভা 8 উদাহরণ। আপনি কেন দাবি করেন যে এটি "জাভা -9"?
হোলার

@ হোলার মেমরি ম্যাপ করা ফাইলের কথা তিনি ভুলে যেতে চেয়েছিলেন?
ইউজিন

এটি লাইন লাইনে প্রক্রিয়াকরণের জন্য আপনি চেষ্টা করতে পারেন (স্ট্রিম <স্ট্রিং> স্ট্রিম = ফাইলসলাইনস (পাথস.জেট (ইনপুটফিল))) .stream.forEach ((লাইন) ->। System.out.println (লাইন);} ); }
thanos.a

3
BufferedReader br;
FileInputStream fin;
try {
    fin = new FileInputStream(fileName);
    br = new BufferedReader(new InputStreamReader(fin));

    /*Path pathToFile = Paths.get(fileName);
    br = Files.newBufferedReader(pathToFile,StandardCharsets.US_ASCII);*/

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

এটা আমার জন্য কাজ করে. আশা করি এটি আপনাকেও সহায়তা করবে।


3

আপনি আরও সুনির্দিষ্টভাবে করতে স্ট্রিম ব্যবহার করতে পারেন:

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

2
আমি একমত যে এটি আসলে ভাল। নিশ্চিত, অদ্ভুত স্ট্রিংবাফার পছন্দ (স্ট্রিংবুডারকে সাধারণত পছন্দ করা হয়, যদিও এটি ভেরিয়েবলের জন্য খারাপ নাম হতে পারে) people কারণ এটি ইতিমধ্যে উপরে উল্লিখিত হয়েছে।
আন্দ্রেই রুবতসভ

2

আমি সাধারণত পড়ার রুটিন সোজা করেই করি:

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

0

আপনি এই কোডটি ব্যবহার করতে পারেন:

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

Org.apache.commons.io প্যাকেজটি ব্যবহার করে এটি আরও কার্যকারিতা দিয়েছে, বিশেষত লিগ্যাসি কোড যা জাভা 6 এবং নীচে ব্যবহার করে।

কম ব্যতিক্রম হ্যান্ডলিং এবং আরও দরকারী পদ্ধতি সহ জাভা 7 এর একটি আরও ভাল API রয়েছে:

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

ম্যাভেন

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

0

আপনি অ্যাপাচি কমন্স আইও ব্যবহার করতে পারেন :

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

3
FileUtils.readLines(file)হতাশ পদ্ধতি। অতিরিক্তভাবে, পদ্ধতিটি আহ্বান জানায় IOUtils.readLines, যা একটি বাফার্ডারিডার এবং অ্যারেলিস্ট ব্যবহার করে। এটি একটি লাইন বাই লাইন পদ্ধতি নয় এবং এটি অবশ্যই কোনও এক জিবি পড়ার জন্য ব্যবহারিক হবে না।
vallismortis
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.