জিজিআইপি ইনপুট স্ট্রিম পঠন লাইনে


85

আমার কাছে .gz ফর্ম্যাটে একটি ফাইল রয়েছে। এই ফাইলটি পড়ার জন্য জাভা ক্লাসটি জিজেআইপিআইএনপুট স্ট্রিম। যাইহোক, এই শ্রেণিটি জাভা বাফার্ডারিডার ক্লাসটি বাড়ায় না। ফলস্বরূপ, আমি লাইন দ্বারা ফাইল লাইন পড়তে সক্ষম নই। আমার এরকম কিছু দরকার

reader  = new MyGZInputStream( some constructor of GZInputStream) 
reader.readLine()...

আমি যদিও আমার ক্লাস তৈরির ক্ষেত্রে যা জাভাটির পাঠক বা বাফারড্রিডার শ্রেণি প্রসারিত করে এবং এর এক পরিবর্তনশীল হিসাবে GZIPInputStream ব্যবহার করি।

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.util.zip.GZIPInputStream;

public class MyGZFilReader extends Reader {

    private GZIPInputStream gzipInputStream = null;
    char[] buf = new char[1024];

    @Override
    public void close() throws IOException {
        gzipInputStream.close();
    }

    public MyGZFilReader(String filename)
               throws FileNotFoundException, IOException {
        gzipInputStream = new GZIPInputStream(new FileInputStream(filename));
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        // TODO Auto-generated method stub
        return gzipInputStream.read((byte[])buf, off, len);
    }

}

তবে, আমি যখন ব্যবহার করি তখন এটি কাজ করে না

BufferedReader in = new BufferedReader(
    new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());

কীভাবে কেউ পরামর্শ দিতে পারে ..


এই লিঙ্কটি দেখুন stackoverflow.com/q/6717165/779408 । একটি কমপ্রেস এবং ডিকম্প্রেস পদ্ধতিটি সেখানে উপস্থাপিত হয়।
ববস

4
এই পৃথিবীতে যা কিছু ভাল এবং সঠিক, তার ভালবাসার জন্য এবং যে কোনও বিকাশকারী এমনকি তাদের দূরবর্তী অবস্থান থেকে সার্থক কোড লেখেন তাদের সন্তুষ্টির জন্য ..... @ রিক্সন পয়েন্ট হিসাবে প্রবেশের বিষয়ে সচেতন হন! তিনিই একমাত্র উত্তর যা এটি দেখায়, যা আমাকে কাঁদতে চায়।
জেমস

উত্তর:


143

সাজসজ্জারের প্রাথমিক সেটআপটি এটির মতো:

InputStream fileStream = new FileInputStream(filename);
InputStream gzipStream = new GZIPInputStream(fileStream);
Reader decoder = new InputStreamReader(gzipStream, encoding);
BufferedReader buffered = new BufferedReader(decoder);

এই স্নিপেটের মূল সমস্যাটি হ'ল এর মান encoding। এটি ফাইলের পাঠ্যটির অক্ষর এনকোডিং। এটি কি "ইউএস-এএসসিআইআই", "ইউটিএফ -8", "শিফট-জেআইএস", "আইএসও -8859-9",…? এখানে শত শত সম্ভাবনা রয়েছে এবং সঠিক পছন্দটি সাধারণত ফাইল থেকেই নির্ধারণ করা যায় না। এটি অবশ্যই কিছু আউট-অফ-ব্যান্ড চ্যানেলের মাধ্যমে নির্দিষ্ট করা আবশ্যক।

উদাহরণস্বরূপ, সম্ভবত এটি প্ল্যাটফর্মের ডিফল্ট। নেটওয়ার্কযুক্ত পরিবেশে তবে এটি অত্যন্ত ভঙ্গুর। ফাইলটি লিখেছিল এমন মেশিনটি পার্শ্ববর্তী কিউবিকেলে বসে থাকতে পারে তবে একটি পৃথক ডিফল্ট ফাইল এনকোডিং রয়েছে।

বেশিরভাগ নেটওয়ার্ক প্রোটোকল অক্ষর এনকোডিং স্পষ্টভাবে নোট করতে একটি শিরোনাম বা অন্যান্য মেটাডেটা ব্যবহার করে।

এই ক্ষেত্রে, ফাইল এক্সটেনশান থেকে এটি প্রদর্শিত হবে যে সামগ্রীটি XML। এক্সএমএল এই উদ্দেশ্যে XML ঘোষণায় "এনকোডিং" বৈশিষ্ট্য অন্তর্ভুক্ত করে। তদতিরিক্ত, এক্সএমএলটি পাঠ্য হিসাবে নয়, এক্সএমএল পার্সার দিয়ে সত্যই প্রক্রিয়া করা উচিত। এক্সএমএল লাইন বাই লাইন পড়ার মতো মনে হচ্ছে একটি ভঙ্গুর, বিশেষ ক্ষেত্রে।

স্পষ্টভাবে এনকোডিং নির্দিষ্ট করতে ব্যর্থতা দ্বিতীয় আদেশের বিপরীতে। আপনার বিপদে ডিফল্ট এনকোডিং ব্যবহার করুন!


4
ধন্যবাদ এটি কাজ করেছে ... তবে, পাঠকের পদক্ষেপের প্রয়োজন নেই .. আমরা এটিকে GZIPInputStream gzip = নতুন GZIPInputStream (নতুন ফাইলআইপুটস্ট্রিম ("এফ: /gawiki-20090614-stub-meta-history.xml.gz" হিসাবেও লিখতে পারি )); বাফারড্রেডার বিআর = নতুন বাফারডারিডার (নতুন ইনপুটস্ট্রিমআডার (জিজিপ));
কপিল ডি

12
@ ক্যাপিলডি এটি আমাকে দু: খিত করে তোলে যে আপনি এনকোডিং সম্পর্কে তাঁর বক্তব্যটি পুরোপুরি মিস করেছেন ... যেমন আপনার মন্তব্য এবং আপনার মন্তব্যে উদাহরণের মাধ্যমে দেখানো হয়েছে। এরিকসনের উত্তর পুনরায় পড়ুন .... সম্ভবত 30 বার শেষ।
জেমস

জিজিপ কমান্ড এনকোডিংটি কীভাবে জানতে পারে? আমি সারা বিশ্ব থেকে প্রচুর লিনাক্স / ইউনিক্স সার্ভার থেকে প্রচুর ফাইল পড়তে চাই ... তাই আমি নিশ্চিত করতে চাই যে আমি এই অধিকারটি করছি ... পোস্টটিতে উল্লেখ করা হয়েছে এনকোডিং সাধারণত ফাইল নিজেই নির্ধারণ করতে পারে না ... তবে gzip -d কমান্ডটি পৃথক ইনপুট ছাড়াই যে কোনও ফাইলের সাথে কাজ করছে বলে মনে হচ্ছে ... (এটি আমি এখন যা ব্যবহার করি তবে তা অবরুদ্ধ করতে চাই) তাই আমি যদি বুঝতে পারি যে এনজিডিংটি জানতে gzip কী কাজ করে, একই কাজ করতে পারেন। কোন চিন্তা / পরামর্শ কেউ আমাকে সঠিক দিকে নির্দেশ করতে পারে?
glyphx

@glyphx আপনার প্রশ্নটি পরিষ্কার নয়। আপনি কী বোঝাতে চাইছেন যে কীভাবে আপনি সামগ্রীর ধরণের সম্পর্কে কিছু বাহ্যিক দাবিগুলির অনুপস্থিতিতে একটি জিজিপ ফাইলকে চিনতে পারবেন? একটি ইঙ্গিতটি ফাইল এক্সটেনশান, অন্যটি ফাইল শিরোনামে ম্যাজিক নম্বর 0x1F8B এর উপস্থিতি। তবে আপনি যতক্ষণ না পুরো জিনিসটি প্রক্রিয়াকরণ না করেন আপনি কোনও ফাইলই একটি বৈধ gzip ফাইল হিসাবে জানতে পারবেন না।
এরিকসন

4
পরিষ্কার হওয়ার জন্য আমি জানি এই ফাইলগুলি জিজেপ ফাইল ip এবং জিজেপড ফাইলগুলি হ'ল সিএসভি এবং পাইপ ডিলিম ফাইলগুলির মতো সমস্ত পাঠ্য ভিত্তিক ফাইল। আমি কেবল এই ফাইলগুলি সরাসরি জাভা লাইন দিয়ে লাইনে পড়তে সক্ষম হতে চাই। আমি এগুলি gzip -d করতে পারি এবং তারপরে সেগুলি লাইন লাইন পড়তে সমস্যা হয় না। এনকোডিং নির্দিষ্ট করে দেওয়ার বিষয়ে আমি আপনার মন্তব্যে কেবল বিভ্রান্ত হয়ে পড়েছিলাম ... আমি মনে করব বেশিরভাগ ফাইল ASCII ... তবে কারও কারও এশিয়ান অক্ষর থাকতে পারে তাই সম্ভবত ইউটিএফ -8? আমি ঠিক নিশ্চিত করতে চাই যে আমি এটি সঠিকভাবে করছি ... এটি কি আরও পরিষ্কার? ধন্যবাদ!
glyphx

44
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"));
BufferedReader br = new BufferedReader(new InputStreamReader(gzip));
br.readLine();


আপনার উত্তর দুর্দান্ত। সংক্ষিপ্ত এবং সংক্ষিপ্ত .. তবে, এরিকসনের উত্তরটি আরও বিশদ।
কপিল ডি


2

আপনি কোনও ব্যবহার শ্রেণিতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন এবং যখনই প্রয়োজন হয় এটি ব্যবহার করতে পারেন ...

public static List<String> readLinesFromGZ(String filePath) {
    List<String> lines = new ArrayList<>();
    File file = new File(filePath);

    try (GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(file));
            BufferedReader br = new BufferedReader(new InputStreamReader(gzip));) {
        String line = null;
        while ((line = br.readLine()) != null) {
            lines.add(line);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace(System.err);
    } catch (IOException e) {
        e.printStackTrace(System.err);
    }
    return lines;
}

1

এখানে একটি লাইন আছে

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(
           new GZIPInputStream(
              new FileInputStream(
                 "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) 
     {br.readLine();}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.