জাভাতে বাইট করতে ফাইল []


757

আমি কিভাবে কনভার্ট করব java.io.Fileএকটি থেকে byte[]?


একটি ব্যবহার যা আমি ভাবতে পারি তা হ'ল ফাইল থেকে সিরিয়ালযুক্ত বস্তুগুলি পড়া।
মাহমুদ 600

2
আরেকটি হ'ল শিরোনাম ব্যবহার করে ফাইলের ধরণটি খুঁজে পাওয়া।
জেমস পি।

এই বাইটটি চেষ্টা করুন [] বাইটস = নাল; বাফার্ডআইপুট স্ট্রিম ফাইলআইপুট স্ট্রিম = নাল; চেষ্টা করুন {ফাইল ফাইল = নতুন ফাইল (ফাইলপথ); ফাইলআইপুট স্ট্রিম = নতুন বাফার্ডআইপুট স্ট্রিম (নতুন ফাইলআইপুট স্ট্রিম (ফাইল)); // ফাইলআইপুট স্ট্রিম = থ্রেড.কন্ট্রেনথ্রেড ()। getContextClassLoader ()। getResourceAsStream (this.filePath); বাইটস = নতুন বাইট [(প্রাক্তন) ফাইল. দৈর্ঘ্য ()]; fileInputStream.read (বাইটস); } ধরা (ফাইলনটফাউন্ডএক্সেপশন প্রাক্তন) {থ্রো প্রাক্তন; }
রোহিত চৌরাসিয়া

উত্তর:


486

এটি আপনার পক্ষে সেরা কী তার উপর নির্ভর করে। উত্পাদনশীলতা অনুসারে, চাকাটি পুনরায় উদ্ভাবন করবেন না এবং অ্যাপাচি কমন্স ব্যবহার করবেন না। যা এখানে IOUtils.toByteArray(InputStream input)


29
@ ইয়মাজোরোস: তাই সত্য! আমি বরং অন্য কিছু নির্ভরতার চেয়ে কোডের অতিরিক্ত কিছু লাইন চাই। নির্ভরতাগুলির গোপন ব্যয় রয়েছে। আপনাকে সেই লাইব্রেরির সাথে আপ টু ডেট থাকতে হবে, আপনার বিল্ড স্ক্রিপ্টিং ইত্যাদির উপর নির্ভরতা অন্তর্ভুক্ত করা উচিত, এটি আপনার কোড ইত্যাদি ব্যবহার করে লোকের সাথে যোগাযোগ করুন ইত্যাদি you এটি নিজে লিখুন
স্টিজন ডি উইট

11
এটি কোনও ফাইল কীভাবে পড়তে হবে তার প্রশ্নের উত্তর দেয় তবে জাভা.আইও.ফাইলে টাইপের কোনও অবজেক্টকে কীভাবে বাইটে রূপান্তর করা যায় তার প্রশ্ন নয় [
ইঙ্গো

5
এটি কীভাবে পড়তে ব্যবহৃত Fileহয় byte[]? আমি Java6 ব্যবহার করছি তাই আমি Nio পদ্ধতি ব্যবহার করতে পারবেন না :(
প্যাস্ট্রি

4
@ ইয়ামাজোরস আপনি কি দয়া করে আমাদের সাথে কোনও "স্ট্যান্ডার্ড 3-লাইন সমাধান" ভাগ করে নেবেন, যাতে আমাদের পুনর্নবীকরণের-চাকা-নির্ভরতার উপর নির্ভর করতে হবে না?
ম্যাটটিও

3
@ মাত্তিও: কোন? অন্যান্য উত্তরগুলি দেখুন, যেমন ফাইল.ড্রেডআলবাইটস ()। সরল, নির্ভরতা নেই।
ইয়ামাজোরস

1292

জেডিকে 7 থেকে আপনি ব্যবহার করতে পারেন Files.readAllBytes(Path)

উদাহরণ:

import java.io.File;
import java.nio.file.Files;

File file;
// ...(file is initialised)...
byte[] fileContent = Files.readAllBytes(file.toPath());

10
আমার কাছে একটি ফাইল অবজেক্ট আছে, কোনও পথ নয় (HTTP পোস্টের অনুরোধ থেকে)
aldo.roman.nurena

81
@ aldo.roman.nurena জেডি কে 7 একটি ফাইল.টোপথ () পদ্ধতি চালু করেছে যা আপনাকে একটি পাথ অবজেক্ট দেবে।
কেভিনল

6
আপনি কোনও ফাইল থেকে একটি পাথ পেতে পারেন। চেষ্টা করুন: ফাইল ফাইল = নতুন ফাইল ("/ পথ"); পথের পথ = Paths.get (file.getAbsolvePath ()); বাইট [] ডেটা = ফাইলস.আরডলবাইটস (পাথ);
gfelisberto

2
Java.nio- এ ফাইল বন্ধ করার পদ্ধতিটি কীভাবে পরিচালিত হয় - অন্য কথায়, উপরের কোডটি কি কিছু বন্ধ করা উচিত?
akauppi

4
@ কৌপ্পি উত্তরের লিঙ্কটি দেখুন: "পদ্ধতিটি নিশ্চিত করে যে ফাইলটি বন্ধ রয়েছে ..."
বার্নহার্ড বার্কার

225

জেডিকে Since - একটি লাইনার:

byte[] array = Files.readAllBytes(Paths.get("/path/to/file"));

কোন বাহ্যিক নির্ভরতা প্রয়োজন।


13
এটি এখন গৃহীত উত্তরের চেয়ে ভাল পছন্দ, যার জন্য অ্যাপাচি কমন্স প্রয়োজন।
james.garriss

1
ধন্যবাদ :) আমারও এটির একটি দরকার ছিল: স্ট্রিং টেক্সট = নতুন স্ট্রিং (ফাইলস.আরডলবাইটস (নতুন ফাইল ("/ পাথ / টু / ফাইল")। টুপাথ ())); মূলত যা stackoverflow.com/a/26888713/1257959
cgl

5
অ্যান্ড্রয়েড, এটা মিনিট এপিআই স্তর প্রয়োজন 26. হতে
আশুতোষ চামোলি

2
আপনার যোগ করতে হবে import java.nio.file.Files;এবং import java.nio.file.Paths;যদি আপনার ইতিমধ্যে না থাকে।
স্যাম

164
import java.io.RandomAccessFile;
RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);

জাভা 8 ডকুমেন্টেশন: http://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html


2
আপনাকে f.read () এর রিটার্ন মানটি পরীক্ষা করতে হবে। এখানে কখনও কখনও ঘটতে পারে, আপনি পুরো ফাইলটি পড়বেন না।
বাগ

8
আপনি যখন পড়ছেন তখন ফাইলটি পরিবর্তন হয় তবেই এই ধরনের পরিস্থিতি দেখা দিতে পারে। অন্যান্য সমস্ত ক্ষেত্রে আইওএক্সেপশন নিক্ষেপ করা হয়। এই সমস্যার সমাধানের জন্য আমি ফাইলটি পঠন-লিখনের মোডে খোলার পরামর্শ দিই: র্যান্ডমএ্যাক্সেসফিল ​​(ফাইলের নাম, "
আরডাব্লু

5
আমি কেবলমাত্র ফাইলের একটি অংশ পড়ার জন্য অন্যান্য উত্সগুলি কল্পনা করতে পারি (ফাইলটি একটি নেটওয়ার্ক শেয়ারে রয়েছে ...) পড়ুন ফুলি () এর সাথে আপনি যে চুক্তিটি সন্ধান করছেন তা রয়েছে।
ডিটিচট 3'13

3
মনে রাখবেন যে র্যান্ডমএকসেসফাইল থ্রেড নিরাপদ নয়। সুতরাং, কিছু ক্ষেত্রে সিঙ্ক্রোনাইজেশন প্রয়োজন হতে পারে।
ব্যান্সার

@ দিমিত্রি মিতসকেভিচ অন্যান্য ফাইল ক্ষেত্রেও রয়েছে যেগুলি সম্ভবত সিস্টেমের বাইরে রয়েছে। যেমন "ফাইল" পড়া / proc / লিনাক্স সংক্ষিপ্ত হতে পারে সার্চ (অর্থাত আপনি একটি লুপ প্রয়োজন সব পড়তে) উপর
টি

78

মূলত আপনাকে এটি স্মৃতিতে পড়তে হবে। ফাইলটি খুলুন, অ্যারেটি বরাদ্দ করুন এবং ফাইল থেকে সামগ্রীগুলি অ্যারেতে পড়ুন।

সহজ উপায়টি এর সাথে মিলিয়ে কিছু:

public byte[] read(File file) throws IOException, FileTooBigException {
    if (file.length() > MAX_FILE_SIZE) {
        throw new FileTooBigException(file);
    }
    ByteArrayOutputStream ous = null;
    InputStream ios = null;
    try {
        byte[] buffer = new byte[4096];
        ous = new ByteArrayOutputStream();
        ios = new FileInputStream(file);
        int read = 0;
        while ((read = ios.read(buffer)) != -1) {
            ous.write(buffer, 0, read);
        }
    }finally {
        try {
            if (ous != null)
                ous.close();
        } catch (IOException e) {
        }

        try {
            if (ios != null)
                ios.close();
        } catch (IOException e) {
        }
    }
    return ous.toByteArray();
}

এই ফাইলটি সামগ্রীর মধ্যে কয়েকটি অপ্রয়োজনীয় অনুলিপি (: ফাইল থেকে আসলে ডেটা তিনবার অনুলিপি করা হয়েছে হয়েছে buffer, থেকে bufferথেকে ByteArrayOutputStream, থেকে ByteArrayOutputStreamপ্রকৃত ফলে অ্যারেতে)।

আপনার অবশ্যই নিশ্চিত করতে হবে যে আপনি মেমরিতে কেবল একটি নির্দিষ্ট আকার পর্যন্ত ফাইলগুলি পড়েছেন (এটি সাধারণত অ্যাপ্লিকেশন নির্ভর) :-)।

আপনি IOExceptionবাইরে ফাংশন চিকিত্সা করা প্রয়োজন ।

আর একটি উপায় হ'ল:

public byte[] read(File file) throws IOException, FileTooBigException {
    if (file.length() > MAX_FILE_SIZE) {
        throw new FileTooBigException(file);
    }

    byte[] buffer = new byte[(int) file.length()];
    InputStream ios = null;
    try {
        ios = new FileInputStream(file);
        if (ios.read(buffer) == -1) {
            throw new IOException(
                    "EOF reached while trying to read the whole file");
        }
    } finally {
        try {
            if (ios != null)
                ios.close();
        } catch (IOException e) {
        }
    }
    return buffer;
}

এটির কোনও অপ্রয়োজনীয় অনুলিপি নেই।

FileTooBigExceptionএকটি কাস্টম অ্যাপ্লিকেশন ব্যতিক্রম। MAX_FILE_SIZEধ্রুব একটি অ্যাপ্লিকেশন পরামিতি হয়।

বড় ফাইলগুলির জন্য আপনার সম্ভবত স্ট্রিম প্রসেসিং অ্যালগরিদম ভাবতে হবে বা মেমরি ম্যাপিং ব্যবহার করা উচিত (দেখুন java.nio)।


আইওএসকে চেষ্টা করার বাইরে ঘোষণা করা দরকার
ড্যারিল স্পিজিটর

দ্বিতীয় উদাহরণে "আইওএস.ড্রেড (বাফার)" বিবৃতিটি কেবল ফাইলের প্রথম 4096 বাইটে পড়বে (প্রথম উদাহরণ হিসাবে ব্যবহৃত একই 4k বাফারটি ধরে নেওয়া)। দ্বিতীয় উদাহরণটি কাজ করার জন্য, আমি মনে করি রিডটি কিছু সময়ের লুপের মধ্যে থাকতে হবে যা ফলাফলটি -1 (ফাইলের শেষের দিকে পৌঁছে) পরীক্ষা করে।
স্টিজন ডি উইট

দুঃখিত, উপরে আমার মন্তব্য বরখাস্ত করুন, ফাইলের দৈর্ঘ্যে বিবৃতি সেটিং বাফার মিস করেছেন missed তবুও, আমি প্রথম উদাহরণটি আরও পছন্দ করি। একবারে পুরো ফাইলটি একটি বাফারে পড়লে স্কেলেবল হয় না। ফাইলটি বড় হয়ে গেলে আপনি মেমরি থেকে বেরিয়ে যাওয়ার ঝুঁকি ফেলবেন।
স্টিজন ডি উইট

"সহজতম" উপায়টি চেষ্টা করে-সংস্থানগুলি ব্যবহার করতে পারে।
সিনা মাদানী

শীতল, তবে ভার্বোস করতে হবে।
Sapphire_Brick

77

যেমন কেউ বলেছে, অ্যাপাচি কমন্স ফাইল ইউটিসগুলিতে আপনি যা খুঁজছেন তা থাকতে পারে

public static byte[] readFileToByteArray(File file) throws IOException

উদাহরণ ব্যবহার ( Program.java):

import org.apache.commons.io.FileUtils;
public class Program {
    public static void main(String[] args) throws IOException {
        File file = new File(args[0]);  // assume args[0] is the path to file
        byte[] data = FileUtils.readFileToByteArray(file);
        ...
    }
}

23

এটি করার জন্য আপনি এনআইও এপিও ব্যবহার করতে পারেন। মোট ফাইলের আকার (বাইটগুলিতে) কোনও ইনটায় মাপসই করা হবে আমি এই কোডটি দিয়ে এই কাজটি করতে পারি।

File f = new File("c:\\wscp.script");
FileInputStream fin = null;
FileChannel ch = null;
try {
    fin = new FileInputStream(f);
    ch = fin.getChannel();
    int size = (int) ch.size();
    MappedByteBuffer buf = ch.map(MapMode.READ_ONLY, 0, size);
    byte[] bytes = new byte[size];
    buf.get(bytes);

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    try {
        if (fin != null) {
            fin.close();
        }
        if (ch != null) {
            ch.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

আমি মনে করি এটি ম্যাপডবাইটবফার ব্যবহারের পর থেকে এটি খুব দ্রুত।


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

1
দুর্ভাগ্যক্রমে ম্যাপডবাইটবফার স্বয়ংক্রিয়ভাবে প্রকাশিত হয় না।
টম হাটিন -

2
দুর্দান্ত, নতুন উদাহরণে রয়েছে প্রিন্টস্ট্যাকট্রেস, ক্লাসিক ভাঙা ব্যতিক্রম হ্যান্ডলিং।
জেমস

আমি সম্মতি জানাই .. এটি ডিফল্ট জিনিস যা গ্রহনে ফেলেছে I
অমিত

একটি ফাইল থেকে বাইট [] তৈরি করার জন্য নিও বেঞ্চমার্কিং করছে। ডাইরেক্ট বাফার ব্যবহার ব্যতীত এটি দ্বিগুণ স্মৃতি গ্রহণ করে না। যদিও এটি খুব বড় ফাইলগুলির জন্য দ্রুত (200 মিটারের জন্য বাফারড আইওর দ্বিগুণ দ্বিগুণ দ্রুত) এটি প্রায় 5 এম এর ফাইলে 5 এর ফ্যাক্টর দ্বারা হারাতে পারে বলে মনে হয়।
শেফার্স 16:34

22

আপনার যদি জাভা 8 না থাকে এবং কয়েকটা লাইনের কোড লেখা এড়াতে একটি বিশাল গ্রন্থাগার অন্তর্ভুক্ত করা আমার পক্ষে একমত ধারণা:

public static byte[] readBytes(InputStream inputStream) throws IOException {
    byte[] b = new byte[1024];
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    int c;
    while ((c = inputStream.read(b)) != -1) {
        os.write(b, 0, c);
    }
    return os.toByteArray();
}

কলার স্ট্রিমটি বন্ধ করার জন্য দায়বদ্ধ।


21
// Returns the contents of the file in a byte array.
    public static byte[] getBytesFromFile(File file) throws IOException {        
        // Get the size of the file
        long length = file.length();

        // You cannot create an array using a long type.
        // It needs to be an int type.
        // Before converting to an int type, check
        // to ensure that file is not larger than Integer.MAX_VALUE.
        if (length > Integer.MAX_VALUE) {
            // File is too large
            throw new IOException("File is too large!");
        }

        // Create the byte array to hold the data
        byte[] bytes = new byte[(int)length];

        // Read in the bytes
        int offset = 0;
        int numRead = 0;

        InputStream is = new FileInputStream(file);
        try {
            while (offset < bytes.length
                   && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
        } finally {
            is.close();
        }

        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file "+file.getName());
        }
        return bytes;
    }

এছাড়াও, লুপের ভিতরে numRead রাখুন। আপনি যে ক্ষুদ্রতম বৈধ সুযোগটি করতে পারেন তা ভেরিয়েবলগুলি ঘোষণা করুন। লুপের বাইরে রেখে দেওয়া কেবল সেই জটিল "যখন" পরীক্ষা সক্ষম করার জন্য প্রয়োজন; লুপের অভ্যন্তরে ইওএফের জন্য পরীক্ষা করা ভাল হবে (এবং যদি এটি হয় তবে একটি ইওএফেক্সেপশন নিক্ষেপ করুন)।
এরিকসন

throw new IOException("File is too large!");ফাইলটি খুব বড় হলে আমাদের কী করা উচিত? এটি সম্পর্কে কোন উদাহরণ আছে?
Fer

21

এটি করার সহজ উপায়:

File fff = new File("/path/to/file");
FileInputStream fileInputStream = new FileInputStream(fff);

// int byteLength = fff.length(); 

// In android the result of file.length() is long
long byteLength = fff.length(); // byte count of the file-content

byte[] filecontent = new byte[(int) byteLength];
fileInputStream.read(filecontent, 0, (int) byteLength);

আরও সহজ উপায় রয়েছে, যেমন ইতিমধ্যে উল্লিখিত ওয়ান-লাইনারগুলি।
Sapphire_Brick

@ সাফায়ার_ব্রিক সরল উপায় হ্যাঁ - তবে এক লাইনার সব পরিস্থিতিতে মানায় না। যেমন অ্যান্ড্রয়েড।
বেহর

17

ফাইল থেকে বাইট পড়ার সহজ উপায়

import java.io.*;

class ReadBytesFromFile {
    public static void main(String args[]) throws Exception {
        // getBytes from anyWhere
        // I'm getting byte array from File
        File file = null;
        FileInputStream fileStream = new FileInputStream(file = new File("ByteArrayInputStreamClass.java"));

        // Instantiate array
        byte[] arr = new byte[(int) file.length()];

        // read All bytes of File stream
        fileStream.read(arr, 0, arr.length);

        for (int X : arr) {
            System.out.print((char) X);
        }
    }
}

1
আমি "
সরলতম

আপনি এখানে ব্যাখ্যা করতে পারেন? তর্ক করছ কেন?
মুহাম্মদ সাদিক

3
বিশেষ কিছু নয়, তবে আপনি সহজতম বলছেন এবং আমি আরও সহজ সমাধান দেখতে পাচ্ছি -> আমার মতে এটি সবচেয়ে সহজ নয়। কয়েক বছর আগে হয়ত ছিল, কিন্তু বিশ্ব বদলে যাচ্ছে। আমি এই জাতীয় বিবৃতি দিয়ে আমার নিজের সমাধানগুলি লেবেল করব না। ;) আপনি যদি কেবল "আমার মতে সর্বাধিক সরল .." বা "সবচেয়ে সহজ আমি খুঁজে পেয়েছি .." লিখেছিলেন তবে আপনাকে বিরক্ত করবেন না, কেবল এই কথাটি বলতে ভাল লাগছিল।
ব্লন্ডকোড

@ মুহম্মদসাদিক: কিছু আমদানি করবেন না .*, এটি একটি খারাপ অনুশীলন বলে মনে করা হয়।
নীলা_ব্রীক

13

আপনার অফার করার জন্য পেয়ারাতে ফাইল.টোবাইটআরে () রয়েছে । এর বিভিন্ন সুবিধা রয়েছে:

  1. এটি কোণার ক্ষেত্রে কভার করে যেখানে ফাইলগুলি 0 দৈর্ঘ্যের প্রতিবেদন করে তবে তার মধ্যে সামগ্রী রয়েছে
  2. এটি অত্যন্ত অপ্টিমাইজড, যদি ফাইলটি লোড করার চেষ্টা করার আগে কোনও বড় ফাইলটিতে পড়ার চেষ্টা করা হয় তবে আপনি একটি আউটআফমিউরিঅ্যাক্সপশন পাবেন। (ফাইলের দৈর্ঘ্যের চতুর ব্যবহারের মাধ্যমে ())
  3. আপনাকে চাকাটি পুনর্নির্মাণ করতে হবে না।


11

সম্প্রদায়ের উইকি উত্তর হিসাবে একই পন্থা ব্যবহার করে, তবে ক্লিনারটি এবং বাক্সের বাইরে সংকলন (আপনি যদি অ্যাপাচি কমন্স লাইবস, যেমন অ্যান্ড্রয়েডে আমদানি করতে না চান তবে পছন্দসই পদ্ধতি):

public static byte[] getFileBytes(File file) throws IOException {
    ByteArrayOutputStream ous = null;
    InputStream ios = null;
    try {
        byte[] buffer = new byte[4096];
        ous = new ByteArrayOutputStream();
        ios = new FileInputStream(file);
        int read = 0;
        while ((read = ios.read(buffer)) != -1)
            ous.write(buffer, 0, read);
    } finally {
        try {
            if (ous != null)
                ous.close();
        } catch (IOException e) {
            // swallow, since not that important
        }
        try {
            if (ios != null)
                ios.close();
        } catch (IOException e) {
            // swallow, since not that important
        }
    }
    return ous.toByteArray();
}


7

রিডফুলি বর্তমান ফাইল পয়েন্টার থেকে শুরু করে এই ফাইলটি থেকে বাইট দৈর্ঘ্য বাইটগুলি বাইট অ্যারেতে পড়ে। অনুরোধ করা সংখ্যা বাইট না পড়া পর্যন্ত এই পদ্ধতিটি ফাইল থেকে বারবার পড়ে। এই পদ্ধতিতে অনুরোধ করা বাইটের সংখ্যা না পড়া পর্যন্ত, স্ট্রিমের শেষটি সনাক্ত করা যায় না বা একটি ব্যতিক্রম ছুঁড়ে ফেলা অবধি অবরুদ্ধ হয়।

RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);

5

আপনি যদি পূর্ব-বরাদ্দ করা বাইট বাফারে বাইটস পড়তে চান তবে এই উত্তরটি সাহায্য করতে পারে।

আপনার প্রথম অনুমান সম্ভবত ব্যবহার করা হবে InputStream read(byte[])। তবে, এই পদ্ধতির একটি ত্রুটি রয়েছে যা এটি ব্যবহার করা অযৌক্তিকভাবে শক্ত করে তোলে: কোনও ইওএফের মুখোমুখি না হওয়া সত্ত্বেও অ্যারেটি পুরোপুরি পূরণ হবে এমন কোনও গ্যারান্টি নেই।

পরিবর্তে, একবার দেখুন DataInputStream readFully(byte[])। এটি ইনপুট স্ট্রিমগুলির জন্য একটি মোড়ক এবং এতে উল্লিখিত সমস্যা নেই। অতিরিক্তভাবে, যখন ইওএফ সম্মুখীন হয় তখন এই পদ্ধতিটি ছোঁড়ে th নিতান্তই ভালো.


4

একে অপরের বিরুদ্ধে জাভা ফাইল ফাইল পড়ার বিভিন্ন পদ্ধতি পরীক্ষা করার সময় কেবল নীচের উপায়ে java.io.File কে একটি বাইটে রূপান্তরিত করে না, আমি কোনও ফাইলে পড়ার দ্রুততম উপায়ও বলেছি :

java.nio.file.Files.readAllBytes ()

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-10KB.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);
    }
  }
}

3

আমাকে তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করেই আরও একটি সমাধান যুক্ত করুন। এটি স্কট ( লিঙ্ক ) দ্বারা প্রস্তাবিত একটি ব্যতিক্রম হ্যান্ডলিং প্যাটার্নটি পুনরায় ব্যবহার করে । এবং আমি কুরুচিপূর্ণ অংশটি একটি পৃথক বার্তায় স্থানান্তরিত করেছি (আমি কিছু ফাইলUtils শ্রেণিতে লুকিয়ে রাখব;))

public void someMethod() {
    final byte[] buffer = read(new File("test.txt"));
}

private byte[] read(final File file) {
    if (file.isDirectory())
        throw new RuntimeException("Unsupported operation, file "
                + file.getAbsolutePath() + " is a directory");
    if (file.length() > Integer.MAX_VALUE)
        throw new RuntimeException("Unsupported operation, file "
                + file.getAbsolutePath() + " is too big");

    Throwable pending = null;
    FileInputStream in = null;
    final byte buffer[] = new byte[(int) file.length()];
    try {
        in = new FileInputStream(file);
        in.read(buffer);
    } catch (Exception e) {
        pending = new RuntimeException("Exception occured on reading file "
                + file.getAbsolutePath(), e);
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (Exception e) {
                if (pending == null) {
                    pending = new RuntimeException(
                        "Exception occured on closing file" 
                             + file.getAbsolutePath(), e);
                }
            }
        }
        if (pending != null) {
            throw new RuntimeException(pending);
        }
    }
    return buffer;
}

3
public static byte[] readBytes(InputStream inputStream) throws IOException {
    byte[] buffer = new byte[32 * 1024];
    int bufferSize = 0;
    for (;;) {
        int read = inputStream.read(buffer, bufferSize, buffer.length - bufferSize);
        if (read == -1) {
            return Arrays.copyOf(buffer, bufferSize);
        }
        bufferSize += read;
        if (bufferSize == buffer.length) {
            buffer = Arrays.copyOf(buffer, bufferSize * 2);
        }
    }
}

1

ফাইল থেকে বাইট পড়ার জন্য অন্য উপায়

Reader reader = null;
    try {
        reader = new FileReader(file);
        char buf[] = new char[8192];
        int len;
        StringBuilder s = new StringBuilder();
        while ((len = reader.read(buf)) >= 0) {
            s.append(buf, 0, len);
            byte[] byteArray = s.toString().getBytes();
        }
    } catch(FileNotFoundException ex) {
    } catch(IOException e) {
    }
    finally {
        if (reader != null) {
            reader.close();
        }
    }

ফাঁকা ধরা ব্লক ব্যবহার করবেন না। এটি ডিবাগিংকে শক্ত করে তোলে।
Sapphire_Brick

1
//The file that you wanna convert into byte[]
File file=new File("/storage/0CE2-EA3D/DCIM/Camera/VID_20190822_205931.mp4"); 

FileInputStream fileInputStream=new FileInputStream(file);
byte[] data=new byte[(int) file.length()];
BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
bufferedInputStream.read(data,0,data.length);

//Now the bytes of the file are contain in the "byte[] data"

1
যদিও এই কোডটি প্রশ্নের সমাধান দিতে পারে, কেন / কীভাবে এটি কাজ করে তা প্রসঙ্গে যুক্ত করা ভাল। এটি ভবিষ্যতের ব্যবহারকারীদের শিখতে এবং তাদের নিজস্ব কোডটিতে সেই জ্ঞানটি প্রয়োগ করতে সহায়তা করতে পারে। কোডটি ব্যাখ্যা করা হলে আপনিও upvotes আকারে ব্যবহারকারীদের কাছ থেকে ইতিবাচক প্রতিক্রিয়া জানাতে পারেন।
borchvm

ঠিক আছে, আমি ভবিষ্যতের পোস্টগুলিতে মনে রাখব এটিই গুরুত্বপূর্ণ অংশ। আপনার দরকারী অন্তর্দৃষ্টি জন্য ধন্যবাদ।
উসামা মেহমুদ

0

এটা চেষ্টা কর :

import sun.misc.IOUtils;
import java.io.IOException;

try {
    String path="";
    InputStream inputStream=new FileInputStream(path);
    byte[] data=IOUtils.readFully(inputStream,-1,false);
}
catch (IOException e) {
    System.out.println(e);
}

এর জন্য একটি নির্দিষ্ট জেআরই বাস্তবায়ন প্রয়োজন যা অন্য জেআরইতে চালিত হলে অ্যাপ্লিকেশনটি ভেঙে দেবে।
রট্টমন

2
সামান্য ভুল: আইওএক্সেপশন এবং আইওক্সেপশন নয়, তবে ধন্যবাদ :)
মাতান মার্সিয়ানো

1
@MatanMarciano: আমার খারাপ
Sapphire_Brick

-7

ইন JDK8

Stream<String> lines = Files.lines(path);
String data = lines.collect(Collectors.joining("\n"));
lines.close();

2
আমার ফরাসী ভাষী বন্ধুটি প্রশ্নটি পড়ুন, এটি "বাইট []" র রূপান্তরিত করার বিষয়ে জিজ্ঞাসা করে এবং আপনার উত্তরটি সরবরাহ করে না।
কায়সার কেইস্টার

2
এটি বাইটে রূপান্তর করার জন্য উত্তর দেওয়ার জন্য এমনকি একটি দূরবর্তী বিকল্প সরবরাহ করে না []!
আন্দো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.