জাভাতে কোনও ফাইল থেকে নির্দিষ্ট লাইন নম্বরটি ব্যবহার করে একটি নির্দিষ্ট লাইন কীভাবে পড়বেন?


91

জাভাতে, কোনও ফাইল থেকে কোনও নির্দিষ্ট লাইন পড়ার কী পদ্ধতি আছে? উদাহরণস্বরূপ, লাইন 32 বা অন্য কোনও লাইন নম্বর পড়ুন।


4
আমি জানি আমি খুব দেরী করেছি, তবে কারও ক্ষেত্রে এই প্রশ্নটি পাওয়া গেছে: নোট করুন যে কোনও ফাইল কেবল বাইটের ক্রম। এবং একটি নতুন লাইনটি কেবল একটি অক্ষর (উইন্ডোজ দুটি) এবং একটি অক্ষর কেবল একটি (বা আরও, এনকোডিংয়ের উপর নির্ভর করে) বাইট হয়। এবং কোনও ফাইলে বাইটের পজিশনের সূচক না রেখে those বাইটগুলি কোথায় তা জানার একমাত্র উপায় হ'ল এটি পড়া এবং এটি সন্ধান করা। (এর অর্থ এই নয় যে আপনাকে পুরো ফাইলটি মেমোরিতে লোড করতে হবে)।
szgal

উত্তর:


72

আপনি যদি ফাইলে লাইনগুলি সম্পর্কে পূর্ববর্তী জ্ঞান না পান তবে 31 টি পূর্ববর্তী লাইনগুলি না পড়ে 32 তম লাইনে সরাসরি প্রবেশ করার উপায় নেই।

এটি সমস্ত ভাষা এবং সমস্ত আধুনিক ফাইল সিস্টেমের জন্য সত্য।

আপনি 32 তমটি না পাওয়া পর্যন্ত আপনি কার্যকরভাবে লাইনগুলি পড়বেন read


4
"পূর্ববর্তী জ্ঞান" ফাইলটিতে যথাযথ লাইন আকারের প্যাটার্নের মতো সহজ হতে পারে যাতে আপনি একটি নির্দিষ্ট অবস্থানের সন্ধান করতে পারেন।
মুরালি ভিপি

4
@ মুরালি: অবশ্যই। এটি অফসেট বা এর কোনও সংমিশ্রণে লাইন নম্বর সূচকও হতে পারে।
জোচিম সৌর

104

ছোট ফাইলগুলির জন্য:

String line32 = Files.readAllLines(Paths.get("file.txt")).get(32)

বড় ফাইলগুলির জন্য:

try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
    line32 = lines.skip(31).findFirst().get();
}

এটি java.nio.charset.MalforInputException প্রদান করে: ইনপুট দৈর্ঘ্য = 1 যখন স্কিপ মান 1 হিসাবে ব্যবহৃত হয়
কানাডিয়ান

এটি আমি পোস্ট করা কোডটি নিয়ে কোনও সমস্যা নয়, এটি আপনার ফাইলের এনকোডিংয়ের সমস্যা। এই পোস্টটি দেখুন ।
আইয়ুব

4
"নোট করুন যে এই পদ্ধতিটি এমন সাধারণ ক্ষেত্রে ব্যবহৃত হয়েছে যেখানে একক ক্রিয়াকলাপে সমস্ত লাইন পড়তে সুবিধাজনক। এটি বড় ফাইলগুলিতে পড়ার উদ্দেশ্যে নয়" " - Files.readAllLines এর Javadoc ()
PragmaticProgrammer

নিম্নলিখিত কোডটির অ্যান্ড্রয়েডে 26 টি স্তরের প্রয়োজন requires যদি আমাদের মিনিট কম হয় তবে এই স্তরটি কার্যকর হয় না
আলী আজাজ আলম

38

আমি জানি না, তবে আপনি যা করতে পারতেন তা হল প্রথম 31 টি লাইনের মধ্য দিয়ে লুপ করা যা বাফার্ডরিডারের রিডলাইন () ফাংশনটি ব্যবহার করে কিছুই করেনি

FileInputStream fs= new FileInputStream("someFile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
for(int i = 0; i < 31; ++i)
  br.readLine();
String lineIWant = br.readLine();

4
দয়া করে নোট করুন যে এখানে আপনি 30 নম্বর লাইনটি পড়েছেন, যা 31 তম লাইনের কারণ আমরা 0 থেকে লাইন সংখ্যা শুরু করি So সুতরাং আমি প্রশ্নের সাথে সঠিকভাবে মেলে এটি পরিবর্তন করার পরামর্শ দেব।
kiedysktos

15

জোয়াকিম অবশ্যই ঠিক আছে, এবং ক্রিসের বিকল্প রূপায়ণ '(ছোট ফাইলগুলির জন্য এটি পুরো ফাইলটি লোড করে কারণ) অ্যাপাচি থেকে কমন্স-আইও ব্যবহার করা হতে পারে (যদিও আপনি সম্ভবত কোনও নতুন নির্ভরতা প্রবর্তন করতে চান না এটি, যদি আপনি এটি অন্য জিনিসগুলির জন্যও দরকারী মনে করেন তবে তা বোধগম্য হতে পারে)।

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

String line32 = (String) FileUtils.readLines(file).get(31);

http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readLines(java.io.File , java.lang.String)


4
যদিও এটি 32 তম লাইনে যাওয়ার আগে পুরো ফাইলটিকে স্মৃতিতে লোড করবে, এটি কোনও বৃহত ফাইলের সাথে ব্যবহারিক নাও হতে পারে এবং 32 তম লাইনটি ব্যবহারের চেয়ে পড়ার চেয়ে ধীর হবে ...
beny23

ফর্সা পয়েন্ট, হ্যাঁ আমি এটি পরীক্ষার ক্ষেত্রে ব্যবহার করেছি, যেখানে টেস্টিং ফাইলগুলি ছোট ছিল, বড় ফাইলগুলিতে যদিও তারা সম্মত হয়েছিল, একটি ভাল পদ্ধতির নয়।
চার্লি কলিন্স

আপনার যদি একটি বড় ফাইল থাকে এবং এক্স লাইনের বাইরে কোনও কিছুর প্রয়োজন না হয় তবে ফাইল ইউটিসগুলি এই ব্যবহারের ক্ষেত্রে একটি খারাপ ধারণা হ'ল প্রতিবেদন করতে আপডেট পোস্টটি আপডেট হয়েছে
চার্লি কলিন্স

11

আপনি ইনডেক্স-ফাইল-রিডার চেষ্টা করতে পারেন (অ্যাপাচি লাইসেন্স 2.0)। ইনডেক্সডফাইরারিডার ক্লাসটিতে রিডলাইনস (INT থেকে, int টু) নামে একটি পদ্ধতি রয়েছে যা একটি सॉোর্টড ম্যাপ দেয় যার কী লাইন নম্বর এবং মানটি সেই রেখাটি যা পড়ত।

উদাহরণ:

File file = new File("src/test/resources/file.txt");
reader = new IndexedFileReader(file);

lines = reader.readLines(6, 10);
assertNotNull("Null result.", lines);
assertEquals("Incorrect length.", 5, lines.size());
assertTrue("Incorrect value.", lines.get(6).startsWith("[6]"));
assertTrue("Incorrect value.", lines.get(7).startsWith("[7]"));
assertTrue("Incorrect value.", lines.get(8).startsWith("[8]"));
assertTrue("Incorrect value.", lines.get(9).startsWith("[9]"));
assertTrue("Incorrect value.", lines.get(10).startsWith("[10]"));      

উপরের উদাহরণটি নীচের বিন্যাসে 50 টি লাইনের সমন্বয়ে একটি পাঠ্য ফাইল পড়ে:

[1] The quick brown fox jumped over the lazy dog ODD
[2] The quick brown fox jumped over the lazy dog EVEN

দাবি অস্বীকারকারী: আমি এই গ্রন্থাগারটি লিখেছি


6

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

The offsets can be calculated by using the RandomAccessFile

    RandomAccessFile raf = new RandomAccessFile("myFile.txt","r"); 
    //above 'r' means open in read only mode
    ArrayList<Integer> arrayList = new ArrayList<Integer>();
    String cur_line = "";
    while((cur_line=raf.readLine())!=null)
    {
    arrayList.add(raf.getFilePointer());
    }
    //Print the 32 line
    //Seeks the file to the particular location from where our '32' line starts
    raf.seek(raf.seek(arrayList.get(31));
    System.out.println(raf.readLine());
    raf.close();

আরও তথ্যের জন্য জাভা ডক্সও দেখুন: https://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html#mode

জটিলতা : এটি ও (এন) হিসাবে পুরো ফাইলটি একবারে পড়ে। মেমরির প্রয়োজনীয়তার জন্য দয়া করে সচেতন হন। যদি এটি মেমোরিতে থাকা খুব বড় হয়, তবে উপরে দেখানো অনুসারে অস্থায়ী ফাইল তৈরি করুন যা অ্যারেলিস্টের পরিবর্তে অফসেটগুলি সঞ্চয় করে।

দ্রষ্টব্য : আপনি '32 'লাইনে সমস্ত কিছু চাইলে আপনাকে কেবলমাত্র 32-বারের ক্লাসের মাধ্যমে পাওয়া পাঠ্যলাইন () এ কল করতে হবে। উপরের পদ্ধতিটি কার্যকর যদি আপনি একাধিকবার নির্দিষ্ট লাইন (অবশ্যই লাইন সংখ্যার ভিত্তিতে) পেতে চান।

ধন্যবাদ!


উপরের কোডটি কাজ করতে কিছু সম্পাদনা দরকার। : যদি কাউকে দরকার অক্ষরসেট সংশ্লিষ্ট তোমার দর্শন লগ করা সত্যিই এই পড়া উচিত stackoverflow.com/a/37275357/3198960
rufushuang

5

অন্য উপায়.

try (BufferedReader reader = Files.newBufferedReader(
        Paths.get("file.txt"), StandardCharsets.UTF_8)) {
    List<String> line = reader.lines()
                              .skip(31)
                              .limit(1)
                              .collect(Collectors.toList());

    line.stream().forEach(System.out::println);
}

4
মার্জিত, আমি এটি পছন্দ করি।
ফ্লোরস্কু ক্যাটালিন

4

না, যদি না সেই ফাইল ফর্ম্যাটে লাইনের দৈর্ঘ্য পূর্ব নির্ধারিত হয় না (উদাহরণস্বরূপ একটি নির্দিষ্ট দৈর্ঘ্য সহ সমস্ত লাইন), তাদের গণনা করার জন্য আপনাকে লাইন দ্বারা লাইনটি পুনরাবৃত্তি করতে হবে।


2

আপনি যদি কোনও পাঠ্য ফাইলের কথা বলছেন, তবে এর আগে যে সমস্ত লাইন রয়েছে তার আগে না পড়ে এটি করার কোনও উপায় নেই - সর্বোপরি, লাইনগুলি একটি নতুন লাইনের উপস্থিতি দ্বারা নির্ধারিত হয়, তাই এটি পড়তে হবে।

রিডলাইন সমর্থন করে এমন একটি স্ট্রিম ব্যবহার করুন এবং প্রথম প্রথম এক্স -1 লাইন পড়ুন এবং ফলাফলগুলি ডাম্প করুন, তারপরে পরবর্তীটি প্রক্রিয়া করুন।


2

জাভা 8 এ,

ছোট ফাইলগুলির জন্য:

String line = Files.readAllLines(Paths.get("file.txt")).get(n);

বড় ফাইলগুলির জন্য:

String line;
try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
    line = lines.skip(n).findFirst().get();
}

জাভা 7 এ

String line;
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    for (int i = 0; i < n; i++)
        br.readLine();
    line = br.readLine();
}

উত্স: ফাইল থেকে নবম লাইন পড়া


1
public String readLine(int line){
        FileReader tempFileReader = null;
        BufferedReader tempBufferedReader = null;
        try { tempFileReader = new FileReader(textFile); 
        tempBufferedReader = new BufferedReader(tempFileReader);
        } catch (Exception e) { }
        String returnStr = "ERROR";
        for(int i = 0; i < line - 1; i++){
            try { tempBufferedReader.readLine(); } catch (Exception e) { }
        }
        try { returnStr = tempBufferedReader.readLine(); }  catch (Exception e) { }

        return returnStr;
    }

1

এটি আমার পক্ষে কাজ করে: আমি একটি সাধারণ পাঠ্য ফাইল পড়ার উত্তরটি একত্রিত করেছি

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

public static LinkedList<String> readFromAssets(Context context, String filename) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open(filename)));
    LinkedList<String>linkedList = new LinkedList<>();
    // do reading, usually loop until end of file reading
    StringBuilder sb = new StringBuilder();
    String mLine = reader.readLine();
    while (mLine != null) {
        linkedList.add(mLine);
        sb.append(mLine); // process line
        mLine = reader.readLine();


    }
    reader.close();
    return linkedList;
}

তারপরে আপনি এটি করতে পারেন: লিঙ্কলিস্ট.জেট (31)
তাচেনকো

1

এই কোডটি ব্যবহার করুন:

import java.nio.file.Files;

import java.nio.file.Paths;

public class FileWork 
{

    public static void main(String[] args) throws IOException {

        String line = Files.readAllLines(Paths.get("D:/abc.txt")).get(1);

        System.out.println(line);  
    }

}

0

আপনি বাফার্ডরিডারের পরিবর্তে লাইননিম্বারডিডার ব্যবহার করতে পারেন। এপিআই দিয়ে যান। আপনি setLineNumber এবং getLineNumber পদ্ধতিগুলি পেতে পারেন।


সাহায্য করে না - আপনাকে এর আগেও সমস্ত লাইন পড়তে হবে ... আপনি প্রতারণা করে প্রথম লাইন 32 <g>
kleopatra

0

আপনি বাফার্ডারীডার এর সাবক্লাস লাইন নাম্বার রিডারও একবার দেখে নিতে পারেন। রিডলাইন পদ্ধতির পাশাপাশি এটিতে লাইন নম্বর অ্যাক্সেস করার জন্য সেটার / গেটর পদ্ধতিও রয়েছে। ফাইল থেকে ডেটা পড়ার সময়, পঠিত লাইনের সংখ্যার উপর নজর রাখতে খুব দরকারী।


0

ভিক্ষা থেকে রেখাগুলি বাদ দিতে আপনি স্কিপ () ফাংশনটি ব্যবহার করতে পারেন।

public static void readFile(String filePath, long lineNum) {
    List<String> list = new ArrayList<>();
    long totalLines, startLine = 0;

    try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
        totalLines = Files.lines(Paths.get(filePath)).count();
        startLine = totalLines - lineNum;
        // Stream<String> line32 = lines.skip(((startLine)+1));

        list = lines.skip(startLine).collect(Collectors.toList());
        // lines.forEach(list::add);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    list.forEach(System.out::println);

}

0

সহজ উপায় - লাইন নম্বর ব্যবহার করে একটি লাইন পড়া। ধরা যাক লাইন নম্বরটি 1 থেকে নাল পর্যন্ত শুরু হয়।

public class TextFileAssignmentOct {
    
    private void readData(int rowNum, BufferedReader br) throws IOException {
        int n=1;                                    //Line number starts from 1
        String row;
        while((row=br.readLine()) != null)  {       // Reads every line
            if (n == rowNum) {                      // When Line number matches with which you want to read
                System.out.println(row);
            }
            n++;                                    //This increments Line number
        }
    }

    public static void main(String[] args) throws IOException {
        File f = new File("../JavaPractice/FileRead.txt");
        FileReader fr = new FileReader(f);
        BufferedReader br = new BufferedReader(fr);
        
        TextFileAssignmentOct txf = new TextFileAssignmentOct();
        txf.readData(4, br);    //Read a Specific Line using Line number and Passing buffered reader
    }
}

-7

এগুলি সবই ভুল আমি প্রায় 10 সেকেন্ডের মধ্যে এটি লিখেছিলাম। এটির সাহায্যে আমি যা চাই তার লাইনে ফিরে আসার জন্য প্রধান পদ্ধতিতে কেবল অবজেক্ট.কেটকিউশন ("লিনেনম্বার") কল করতে পেরেছি।

public class Questions {

File file = new File("Question2Files/triviagame1.txt");

public Questions() {

}

public String getQuestion(int numLine) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(file));
    String line = "";
    for(int i = 0; i < numLine; i++) {
        line = br.readLine();
    }
    return line; }}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.