অ্যান্ড্রয়েডে কোনও ফাইলের অনুলিপি কীভাবে করবেন?


177

আমার অ্যাপে আমি একটি নির্দিষ্ট নামের একটি নির্দিষ্ট ফাইলের একটি অনুলিপি সংরক্ষণ করতে চাই (যা আমি ব্যবহারকারীর কাছ থেকে পেয়েছি)

আমার কি সত্যিই ফাইলটির বিষয়বস্তুগুলি খুলতে এবং এটি অন্য কোনও ফাইলে লেখার দরকার আছে?

এটি করার সর্বোত্তম উপায় কী?


জাভা 7 প্রাক, আমি মনে করি উত্তরটি হ্যাঁ আপনি করছেন। stackoverflow.com/questions/106770/…
পল গ্রিম


উত্তর:


326

একটি ফাইল অনুলিপি করতে এবং এটি আপনার গন্তব্য পথে সংরক্ষণ করতে আপনি নীচের পদ্ধতিটি ব্যবহার করতে পারেন।

public static void copy(File src, File dst) throws IOException {
    InputStream in = new FileInputStream(src);
    try {
        OutputStream out = new FileOutputStream(dst);
        try {
            // Transfer bytes from in to out
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        } finally {
            out.close();
        }
    } finally {
        in.close();
    }
}

এপিআই 19+ এ আপনি জাভা অটোমেটিক রিসোর্স ম্যানেজমেন্ট ব্যবহার করতে পারেন:

public static void copy(File src, File dst) throws IOException {
    try (InputStream in = new FileInputStream(src)) {
        try (OutputStream out = new FileOutputStream(dst)) {
            // Transfer bytes from in to out
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        }
    }
}

8
ধন্যবাদ. আমার মাথা ধাক্কা দেওয়ার পরে আমি দেখতে পেলাম যে সমস্যাটি বাহ্যিক স্টোরেজে লেখার অনুমতি অনুপস্থিত। এখন এটি ঠিক আছে।
আঃ

8
@ mohitum007 যদি ফাইলটি অনুলিপি করতে ব্যর্থ হয় তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে। পদ্ধতিটি কল করার সময় একটি ট্র্যাচ ক্যাচ ব্লক ব্যবহার করুন।
নিমা জি

9
যদি কোনও ব্যতিক্রম নিক্ষেপ করা হয় তবে স্ট্রিমগুলি আবর্জনা সংগ্রহ না করা অবধি বন্ধ হবে না এবং এটি ভাল নয় । এগুলিকে বন্ধ করার বিষয়ে বিবেচনা করুন finally
পাইং

1
@Pang। তুমি ঠিক. সবচেয়ে খারাপ, ইন / আউটক্লোজ () অবশ্যই কল করা উচিত বা অন্যথায় অন্তর্নিহিত ওএসে একটি রিসোর্স ফাঁস হবে, যেহেতু জিসি কখনই ওপেন ফাইল বর্ণনাকারী বন্ধ করে না। জিসি, ফাইল-বর্ণনাকারী বা সকেটের মতো জেভিএমের বাহ্যিক ওএস সংস্থানগুলি বন্ধ করতে পারে না। এগুলিকে অবশ্যই
সর্বশেষে

4
দয়া করে উভয় স্ট্রিমগুলি শেষ পর্যন্ত বন্ধ করুন, যদি কোনও এক্সপসকিয়ন থাকে তবে আপনার স্ট্রিমের স্মৃতি সংগ্রহ করা হবে না।
pozuelog

121

বিকল্পভাবে, আপনি ফাইল অনুলিপি করতে ফাইলচেনেল ব্যবহার করতে পারেন । এটা তোলে পারে দ্রুত বাইট কপি পন্থার চেয়ে যখন একটি বড় ফাইল কপি হবে। আপনার ফাইলটি যদিও 2 জিবি থেকে বড় হয় আপনি এটি ব্যবহার করতে পারবেন না।

public void copy(File src, File dst) throws IOException {
    FileInputStream inStream = new FileInputStream(src);
    FileOutputStream outStream = new FileOutputStream(dst);
    FileChannel inChannel = inStream.getChannel();
    FileChannel outChannel = outStream.getChannel();
    inChannel.transferTo(0, inChannel.size(), outChannel);
    inStream.close();
    outStream.close();
}

3
ট্রান্সফারটো একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে এবং সেক্ষেত্রে আপনি স্ট্রিমগুলি উন্মুক্ত রেখে চলেছেন। ঠিক যেমন প্যাং এবং নিমা গৃহীত উত্তরে মন্তব্য করেছিলেন।
ভিক্টর ব্রেয়ান

এছাড়াও, ট্রান্সফারটোকে লুপের ভিতরে ডাকা উচিত কারণ এটি গ্যারান্টি দেয় না যে এটি অনুরোধ করা মোট পরিমাণ স্থানান্তর করবে।
ভিক্টর ব্রেয়ান

আমি আপনার সমাধানটি চেষ্টা করেছিলাম java.io.FileNotFoundException: /sdcard/AppProj/IMG_20150626_214946.jpg: open failed: ENOENT (No such file or directory)এবং FileOutputStream outStream = new FileOutputStream(dst);পদক্ষেপে ব্যতিক্রম ছাড়া এটি আমার পক্ষে ব্যর্থ । আমি যে পাঠ্যটি অনুধাবন করেছি সে অনুসারে, ফাইলটি বিদ্যমান নেই, তাই আমি এটি যাচাই করি এবং dst.mkdir();প্রয়োজনে কল করি, তবে এটি এখনও সহায়তা করে না। আমিও চেক করার চেষ্টা করেছিলাম এবং dst.canWrite();ফিরে এসেছিল false। এটি কি সমস্যার উত্স হতে পারে? এবং হ্যাঁ, আমি আছে <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
মাইক বি।

1
@ ভিক্টরব্রায়ান এপিআই 19 এর পরে আপনি আপনার চেষ্টা খোলার try ( FileInputStream inStream = new FileInputStream(src); FileOutputStream outStream = new FileOutputStream(dst) ) {
প্রবাহটি

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

30

কোটলিন এর জন্য এক্সটেনশন

fun File.copyTo(file: File) {
    inputStream().use { input ->
        file.outputStream().use { output ->
            input.copyTo(output)
        }
    }
}

এটি সবচেয়ে সংক্ষিপ্ত অথচ নমনীয় উত্তর। সহজ উত্তরগুলি ইউআরআইগুলির মাধ্যমে অ্যাকাউন্টে খুলতে ব্যর্থ হয় contentResolver.openInputStream(uri)
অজাহানচারলেস

6
কোটলিন প্রেম, কোটলিন জীবন!
দেব আগরওয়াল

17

এগুলি আমার পক্ষে ভাল কাজ করেছে

public static void copyFileOrDirectory(String srcDir, String dstDir) {

    try {
        File src = new File(srcDir);
        File dst = new File(dstDir, src.getName());

        if (src.isDirectory()) {

            String files[] = src.list();
            int filesLength = files.length;
            for (int i = 0; i < filesLength; i++) {
                String src1 = (new File(src, files[i]).getPath());
                String dst1 = dst.getPath();
                copyFileOrDirectory(src1, dst1);

            }
        } else {
            copyFile(src, dst);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void copyFile(File sourceFile, File destFile) throws IOException {
    if (!destFile.getParentFile().exists())
        destFile.getParentFile().mkdirs();

    if (!destFile.exists()) {
        destFile.createNewFile();
    }

    FileChannel source = null;
    FileChannel destination = null;

    try {
        source = new FileInputStream(sourceFile).getChannel();
        destination = new FileOutputStream(destFile).getChannel();
        destination.transferFrom(source, 0, source.size());
    } finally {
        if (source != null) {
            source.close();
        }
        if (destination != null) {
            destination.close();
        }
    }
}

13

এটি Android ও (এপিআই 26) এ সহজ, যেমন আপনি দেখুন:

  @RequiresApi(api = Build.VERSION_CODES.O)
  public static void copy(File origin, File dest) throws IOException {
    Files.copy(origin.toPath(), dest.toPath());
  }

10

উত্তরের জন্য খুব দেরি হতে পারে তবে সবচেয়ে সুবিধাজনক উপায়টি ব্যবহার করা

FileUtilsএর

static void copyFile(File srcFile, File destFile)

উদাহরণস্বরূপ এটি আমি করেছি

`

private String copy(String original, int copyNumber){
    String copy_path = path + "_copy" + copyNumber;
        try {
            FileUtils.copyFile(new File(path), new File(copy_path));
            return copy_path;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

`


20
ফাইলUtils অ্যানড্রয়েড নেটিভ অস্তিত্ব নেই।
বার্গা

2
তবে অ্যাপাচি দ্বারা তৈরি একটি গ্রন্থাগার রয়েছে যা এটি এবং আরও অনেক কিছু করে: commons.apache.org/proper/commons-io/javadocs/api-2.5/org/…
আলেসান্দ্রো মুজ্জি

7

কোটলিনের সাথে এখন অনেক সহজ:

 File("originalFileDir", "originalFile.name")
            .copyTo(File("newFileDir", "newFile.name"), true)

trueবা falseগন্তব্য ফাইল ওভাররাইটিং জন্য

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/copy-to.html


আপনার ফাইলটি যদি গ্যালারী অভিপ্রায় উরি থেকে আসে তবে এত সহজ নয়।
অজাহানচার্লস

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

5

এখানে এমন একটি সমাধান রয়েছে যা অনুলিপি করার সময় কোনও ত্রুটি ঘটলে প্রকৃতপক্ষে ইনপুট / আউটপুট স্ট্রিমগুলি বন্ধ করে দেয়। এই সমাধানটি স্ট্রিমের অনুলিপি অনুলিপি এবং পরিচালনা করার জন্য অ্যাপাচি কমন্স আইও আইইউটিস পদ্ধতিগুলি ব্যবহার করে।

    public void copyFile(File src, File dst)  {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(src);
            out = new FileOutputStream(dst);
            IOUtils.copy(in, out);
        } catch (IOException ioe) {
            Log.e(LOGTAG, "IOException occurred.", ioe);
        } finally {
            IOUtils.closeQuietly(out);
            IOUtils.closeQuietly(in);
        }
    }

এটি দেখতে সহজ দেখাচ্ছে
সের্গ বুরলাকা

2

কোটলিনে, ঠিক:

val fileSrc : File = File("srcPath")
val fileDest : File = File("destPath")

fileSrc.copyTo(fileDest)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.