জাভাতে কোনও ফাইল অনুলিপি করার স্ট্যান্ডার্ড সংক্ষিপ্ত উপায়?


421

এটি সর্বদা আমাকে বিরক্ত করেছে যে জাভাতে কোনও ফাইল অনুলিপি করার একমাত্র উপায়টিতে স্ট্রিমগুলি খোলার, বাফার ঘোষণা করা, একটি ফাইলে পড়া, এর মধ্য দিয়ে লুপিং করা এবং এটি অন্য স্টিমের বাইরে লেখা writing ওয়েবটি একই ধরণের, তবে এখনও এই ধরণের সমাধানের থেকে কিছুটা আলাদা বাস্তবায়িত দ্বারা আবদ্ধ।

জাভা ভাষার সীমানার মধ্যে থাকার চেয়ে আরও ভাল উপায় কি আছে (যার অর্থ ওএস নির্দিষ্ট কমান্ডগুলি নির্বাহ করে না)? সম্ভবত কিছু নির্ভরযোগ্য ওপেন সোর্স ইউটিলিটি প্যাকেজে, এটি অন্তত অন্তর্নিহিত বাস্তবায়নটিকে অস্পষ্ট করবে এবং একটি লাইন সমাধান সরবরাহ করবে?


5
অ্যাপাচি কমন্স ফাইল ইউটিলে কিছু থাকতে পারে , বিশেষত কপি ফাইল পদ্ধতি methods
টুলকিট

22
: জাভা 7 ব্যবহার করেন, তাহলে Files.copy পরিবর্তে, যেমন @GlenBest দ্বারা বাঞ্ছনীয় ব্যবহার stackoverflow.com/a/16600787/44737
ডাকাতি

উত্তর:


274

উপরের টুলকিট হিসাবে উল্লিখিত হয়েছে, অ্যাপাচি কমন্স আইও হ'ল উপায়, বিশেষত ফাইল ইউটিলসcopyFile () ; এটি আপনার জন্য সমস্ত ভারী উত্তোলন পরিচালনা করে।

এবং একটি লিপি স্ক্রিপ্ট হিসাবে নোট করুন যে ফাইল ইউটিলসের সাম্প্রতিক সংস্করণগুলি (যেমন ২.০.১ রিলিজ) ফাইলগুলি অনুলিপি করার জন্য এনআইওর ব্যবহার যুক্ত করেছে; এনআইও একটি বড় অংশে ফাইল-অনুলিপি কার্যকারিতা উল্লেখযোগ্যভাবে বাড়িয়ে তুলতে পারে কারণ এনআইও রুটিনগুলি জাভা স্তরের মাধ্যমে বাইটগুলি পড়ার এবং লেখার মাধ্যমে হ্যান্ডেল না করে সরাসরি ওএস / ফাইল সিস্টেমে অনুলিপিটি স্থগিত করে। সুতরাং আপনি যদি পারফরম্যান্সের সন্ধান করছেন, আপনি ফাইল ইউটিলসের সাম্প্রতিক সংস্করণটি ব্যবহার করছেন তা যাচাই করা উচিত।


1
খুব সহায়ক - কোনও সরকারী প্রকাশে কখন এই নিও পরিবর্তনগুলি অন্তর্ভুক্ত করবে সে সম্পর্কে আপনার কী অন্তর্দৃষ্টি রয়েছে?
পিটার

2
অ্যাপাচি কমন্স আইও এর সর্বজনীন প্রকাশ এখনও 1.4 এ, গ্র্ররrrr
পিটার

14
২০১০ সালের ডিসেম্বর পর্যন্ত, অ্যাপাচি কমন্স আইওটি ২.০.০ এ রয়েছে, যার এনআইও কার্যকারিতা রয়েছে। উত্তর আপডেট হয়েছে।
সাইমন নিক্কারসন

4
অ্যান্ড্রয়েড লোকদের জন্য একটি সতর্কতা: এটি স্ট্যান্ডার্ড অ্যান্ড্রয়েড এপিআইগুলিতে অন্তর্ভুক্ত নেই
ইলডান

18
: জাভা 7 অথবা ঊর্ধ্বতন সংস্করণ ব্যবহার করেন, তাহলে আপনি যেমন @GlenBest দ্বারা প্রস্তাবিত Files.copy ব্যবহার করতে পারেন stackoverflow.com/a/16600787/44737
ডাকাতি

278

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

http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)

সংযুক্ত নিবন্ধগুলির মধ্যে একটি স্থানান্তর ট্রান্সফার ব্যবহার করে কীভাবে আপনার কোডটিতে এই ফাংশনটি সংহত করতে পারে তার দুর্দান্ত উপায় দেখায়:

public static void copyFile(File sourceFile, File destFile) throws IOException {
    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();
        }
    }
}

এনআইও শেখা কিছুটা জটিল হতে পারে, তাই আপনি যেতে যেতে এবং রাতারাতি NIO শেখার চেষ্টা করার আগে এই মেকানিকের উপর নির্ভর করতে পারেন want ব্যক্তিগত অভিজ্ঞতা থেকে আপনার কাছে অভিজ্ঞতা না থাকলে এবং জাভা.আইপি স্ট্রিমগুলির মাধ্যমে আইওর সাথে পরিচয় করানো হয় তা শেখা খুব কঠিন জিনিস হতে পারে।


2
ধন্যবাদ, দরকারী তথ্য। আমি এখনও অ্যাপাচি কমন্সের মতো কিছু নিয়ে তর্ক করব, বিশেষত যদি এটি নীচে নিও (সঠিকভাবে) ব্যবহার করে; তবে আমি একমত যে অন্তর্নিহিত মৌলিক বিষয়গুলি বুঝতে গুরুত্বপূর্ণ is
পিটার

1
দুর্ভাগ্যক্রমে, সাবধানতা অবলম্বন আছে। আমি যখন 1.5 জিবি ফাইলটি উইন্ডোজ 7, ​​32 বিটে অনুলিপি করেছি, তখন ফাইলটি ম্যাপ করতে ব্যর্থ হয়েছিল। আমাকে আর একটি সমাধান খুঁজতে হবে।
আন্তন কে।

15
উপরের কোডটি সহ তিনটি সম্ভাব্য সমস্যা: (ক) যদি গেট চ্যানেল কোনও ব্যতিক্রম ছুঁড়ে ফেলে তবে আপনি একটি খোলা প্রবাহ ফাঁস করতে পারেন; (খ) বড় ফাইলগুলির জন্য, আপনি ওএস পরিচালনা করতে পারে তার চেয়ে একবারে আরও স্থানান্তর করার চেষ্টা করছেন; (গ) আপনি স্থানান্তর থেকে ফেরতের মান অগ্রাহ্য করছেন, তাই এটি ফাইলের কেবলমাত্র অংশটি অনুলিপি করছে। এই কারণেই org.apache.tools.ant.util.ResourceUtils.copyResource এত জটিল। এছাড়াও নোট করুন যে ট্রান্সফারফ্রমে ঠিক আছে, লিনাক্সে JDK 1.4 এ ট্রান্সফারটো বিরতি: bugs.sun.com/bugdatedia/view_bug.do?bug_id=5056395
জেসি গ্লিক

7
আমি বিশ্বাস করি যে এই আপডেট হওয়া সংস্করণটি এই উদ্বেগগুলির সমাধান করেছে: gist.github.com/889747
মার্ক রেনুফ

11
এই কোড একটি বড় সমস্যা আছে। ট্রান্সফারটো () অবশ্যই একটি লুপে কল করা উচিত। অনুরোধ করা পুরো পরিমাণটি স্থানান্তর করার গ্যারান্টি দেয় না।
লর্নে

180

এখন জাভা 7 এর সাহায্যে আপনি নীচের ব্যবহারের সাথে রিসোর্স সিনট্যাক্স ব্যবহার করতে পারেন:

public static void copyFile( File from, File to ) throws IOException {

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

    try (
        FileChannel in = new FileInputStream( from ).getChannel();
        FileChannel out = new FileOutputStream( to ).getChannel() ) {

        out.transferFrom( in, 0, in.size() );
    }
}

অথবা, আরও ভাল, এটি জাভা in তে প্রবর্তিত নতুন ফাইল ক্লাস ব্যবহার করেও সম্পন্ন করা যেতে পারে:

public static void copyFile( File from, File to ) throws IOException {
    Files.copy( from.toPath(), to.toPath() );
}

বেশ আড়ষ্ট, এহ?


15
এটি আশ্চর্যজনক জাভা আজকের আগে এই জাতীয় জিনিস যোগ করে নি। কিছু নির্দিষ্ট ক্রিয়াকলাপ কম্পিউটার সফ্টওয়্যার লেখার নিখুঁত প্রয়োজনীয় are জাভা এর ওরাকল বিকাশকারীরা অপারেটিং সিস্টেম থেকে একটি বা দুটি জিনিস শিখতে পারত, তারা কোন পরিষেবাগুলি সরবরাহ করে তা দেখে নবজাতকদের স্থানান্তরিত করতে EASIER করতে পারেন।
রিক হজগিন

2
আহ! আমি নতুন "ফাইল" শ্রেণীর সমস্ত সহায়ক কার্যকারিতা সম্পর্কে অবগত ছিলাম না। এটি ঠিক আমার যা প্রয়োজন তা আছে। উদাহরণের জন্য ধন্যবাদ।
ক্রিসক্যান্ট্রেল

1
কর্মক্ষমতা জ্ঞানী, Java Nio FileChannel ভাল, এই নিবন্ধটি পড়তে journaldev.com/861/4-ways-to-copy-file-in-java
পঙ্কজ

5
এই কোড একটি বড় সমস্যা আছে। ট্রান্সফারটো () অবশ্যই একটি লুপে কল করা উচিত। অনুরোধ করা পুরো পরিমাণটি স্থানান্তর করার গ্যারান্টি দেয় না।
লর্নে

@ স্কট: পিট একটি এক-লাইন সমাধানের জন্য জিজ্ঞাসা করেছিল এবং আপনি এতটা কাছাকাছি ... একটি অনুলিপি ফাইল পদ্ধতিতে ফাইলসকপিটি মোড়ানো অপ্রয়োজনীয়। আমি আপনার উত্তরের শুরুতে কেবল ফাইলকপি (পথ থেকে পাথ) রেখেছি এবং উল্লেখ করেছি যে আপনি যদি ফাইল ফাইল টুপাথ () ব্যবহার করতে পারেন তবে আপনার কাছে বিদ্যমান ফাইল অবজেক্টস রয়েছে: ফাইলসকপি (ফাইল.টোপ্যাথ () থেকে, toFile.toPath ())
ছিনিয়ে নিন

89
  • এই পদ্ধতিগুলি পারফরম্যান্স ইঞ্জিনিয়ারড (তারা অপারেটিং সিস্টেম নেটিভ I / O এর সাথে সংহত করে)।
  • এই পদ্ধতিগুলি ফাইল, ডিরেক্টরি এবং লিঙ্কগুলির সাথে কাজ করে।
  • সরবরাহিত প্রতিটি বিকল্প বাদ থাকতে পারে - সেগুলি alচ্ছিক।

ইউটিলিটি ক্লাস

package com.yourcompany.nio;

class Files {

    static int copyRecursive(Path source, Path target, boolean prompt, CopyOptions options...) {
        CopyVisitor copyVisitor = new CopyVisitor(source, target, options).copy();
        EnumSet<FileVisitOption> fileVisitOpts;
        if (Arrays.toList(options).contains(java.nio.file.LinkOption.NOFOLLOW_LINKS) {
            fileVisitOpts = EnumSet.noneOf(FileVisitOption.class) 
        } else {
            fileVisitOpts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
        }
        Files.walkFileTree(source[i], fileVisitOpts, Integer.MAX_VALUE, copyVisitor);
    }

    private class CopyVisitor implements FileVisitor<Path>  {
        final Path source;
        final Path target;
        final CopyOptions[] options;

        CopyVisitor(Path source, Path target, CopyOptions options...) {
             this.source = source;  this.target = target;  this.options = options;
        };

        @Override
        FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
        // before visiting entries in a directory we copy the directory
        // (okay if directory already exists).
        Path newdir = target.resolve(source.relativize(dir));
        try {
            Files.copy(dir, newdir, options);
        } catch (FileAlreadyExistsException x) {
            // ignore
        } catch (IOException x) {
            System.err.format("Unable to create: %s: %s%n", newdir, x);
            return SKIP_SUBTREE;
        }
        return CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
        Path newfile= target.resolve(source.relativize(file));
        try {
            Files.copy(file, newfile, options);
        } catch (IOException x) {
            System.err.format("Unable to copy: %s: %s%n", source, x);
        }
        return CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
        // fix up modification time of directory when done
        if (exc == null && Arrays.toList(options).contains(COPY_ATTRIBUTES)) {
            Path newdir = target.resolve(source.relativize(dir));
            try {
                FileTime time = Files.getLastModifiedTime(dir);
                Files.setLastModifiedTime(newdir, time);
            } catch (IOException x) {
                System.err.format("Unable to copy all attributes to: %s: %s%n", newdir, x);
            }
        }
        return CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) {
        if (exc instanceof FileSystemLoopException) {
            System.err.println("cycle detected: " + file);
        } else {
            System.err.format("Unable to copy: %s: %s%n", file, exc);
        }
        return CONTINUE;
    }
}

ডিরেক্টরি বা ফাইল অনুলিপি করা হচ্ছে

long bytes = java.nio.file.Files.copy( 
                 new java.io.File("<filepath1>").toPath(), 
                 new java.io.File("<filepath2>").toPath(),
                 java.nio.file.StandardCopyOption.REPLACE_EXISTING,
                 java.nio.file.StandardCopyOption.COPY_ATTRIBUTES,
                 java.nio.file.LinkOption.NOFOLLOW_LINKS);

ডিরেক্টরি বা ফাইল সরানো

long bytes = java.nio.file.Files.move( 
                 new java.io.File("<filepath1>").toPath(), 
                 new java.io.File("<filepath2>").toPath(),
                 java.nio.file.StandardCopyOption.ATOMIC_MOVE,
                 java.nio.file.StandardCopyOption.REPLACE_EXISTING);

একটি ডিরেক্টরি বা ফাইল পুনরাবৃত্তভাবে অনুলিপি করা

long bytes = com.yourcompany.nio.Files.copyRecursive( 
                 new java.io.File("<filepath1>").toPath(), 
                 new java.io.File("<filepath2>").toPath(),
                 java.nio.file.StandardCopyOption.REPLACE_EXISTING,
                 java.nio.file.StandardCopyOption.COPY_ATTRIBUTES
                 java.nio.file.LinkOption.NOFOLLOW_LINKS );

ফাইলগুলির প্যাকেজের নামটি ভুল ছিল (java.nio.file হওয়া উচিত java.nio নয়)। আমি তার জন্য একটি সম্পাদনা জমা দিয়েছি; আশা করি ঠিক আছে!
স্টুয়ার্ট রসিটার

43

জাভা 7 এ এটি সহজ ...

File src = new File("original.txt");
File target = new File("copy.txt");

Files.copy(src.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING);

1
আপনার উত্তর স্কট বা গ্লেনের সাথে কী যুক্ত করে?
উরি আগাসি

11
এটি সংক্ষিপ্ত, কম বেশি। তাদের উত্তরগুলি ভাল এবং বিশদযুক্ত, তবে এগুলি দেখার সময় আমি সেগুলি মিস করেছি। দুর্ভাগ্যক্রমে এর অনেকগুলি উত্তর রয়েছে এবং সেগুলির অনেকগুলি দীর্ঘ, অপ্রচলিত এবং জটিল এবং স্কট এবং গ্লেনের ভাল উত্তরগুলি এতে হারিয়ে গেছে (আমি এটির জন্য সহায়তা দেবো)। আমার উত্তরটি যদি বিদ্যমান () এবং ত্রুটির বার্তাটি ছুঁড়ে ফেলে তিনটি লাইনে হ্রাস করে উন্নত হতে পারে তবে আমি অবাক হই।
কেভিন স্যাডলার

এটি ডিরেক্টরিগুলির জন্য কাজ করে না। অভিশাপ সবাই এই এক ভুল হয়ে যাচ্ছে। আপনার এপিআই যোগাযোগের আরও কিছু সমস্যা। আমিও ভুল করেছিলাম।
মিমি

2
@ মোমো প্রশ্নটি ছিল একটি ফাইল কীভাবে অনুলিপি করবেন।
কেভিন স্যাডলার

28

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

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

1
এটি কাজ করবে, তবে আমি মনে করি না যে এটি এখানে অন্যান্য উত্তরগুলির চেয়ে ভাল?
রুপ

2
@ রুপ এটি এখানে অন্যান্য উত্তরের চেয়ে যথেষ্ট ভাল, (ক) কারণ এটি কাজ করে এবং (খ) কারণ এটি তৃতীয় পক্ষের সফ্টওয়্যারটির উপর নির্ভর করে না।
মারকুইস

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

কবজির মতো কাজ করেছেন। সেরা সমাধানের জন্য তৃতীয় পক্ষের গ্রন্থাগারগুলির প্রয়োজন হয় না এবং জাভা ১.6 এ কাজ করে। ধন্যবাদ।
জেমস ওয়েয়ারজবা

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

24

নোট করুন যে এই সমস্ত প্রক্রিয়া কেবল ফাইলের বিষয়বস্তু অনুলিপি করে, অনুমতিগুলির মতো মেটাডেটা নয়। সুতরাং আপনি যদি লিনাক্সে একটি এক্সিকিউটেবল .sh ফাইল অনুলিপি করতে বা সরাতে চান তবে নতুন ফাইলটি কার্যকর হতে পারে না।

সত্যিকার অর্থে কোনও ফাইল অনুলিপি করতে বা ফাইল স্থানান্তরিত করতে, যেমন কমান্ড লাইন থেকে অনুলিপি করার অনুরূপ ফলাফল পেতে, আপনাকে আসলে একটি নেটিভ সরঞ্জাম ব্যবহার করতে হবে। হয় শেল স্ক্রিপ্ট বা জেএনআই।

স্পষ্টতই, এটি জাভা 7 - http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html এ সংশোধন করা হতে পারে । আঙ্গুলগুলি পার হয়ে গেল!


23

গুগলের পেয়ারা লাইব্রেরিতে একটি অনুলিপি পদ্ধতি রয়েছে :

পাবলিক স্ট্যাটিক শূন্য অনুলিপি ( ফাইল  থেকে,
                         ফাইল  )IOException 
                 নিক্ষেপ
একটি ফাইল থেকে অন্য ফাইলটিতে সমস্ত বাইট অনুলিপি করে।

সতর্কতা: যদি toকোনও বিদ্যমান ফাইল উপস্থাপন করে তবে সেই ফাইলটির বিষয়বস্তুগুলি ওভাররাইট করা হবে from। যদি toএবং একই ফাইলটিতে fromউল্লেখ করা হয় তবে সেই ফাইলটির সামগ্রী মুছে ফেলা হবে।

পরামিতি:from - উত্স ফাইল to- গন্তব্য ফাইল

নিক্ষেপ: IOException - যদি আই / ও ত্রুটি ঘটে তবে IllegalArgumentException- যদিfrom.equals(to)


19

জাভা 7 মান হিসেবে পাওয়া যায়, path.copyTo: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html http://java.sun.com/docs/books/ টিউটোরিয়াল / অপরিহার্য / IO / copy.html

আমি বিশ্বাস করতে পারি না যে ফাইল অনুলিপি করার মতো সাধারণ এবং সাধারণ কিছু মানক করতে এত সময় লেগেছিল :(


10
কোনও প্যাথকপিও নেই; এটি ফাইলসকপি।
জেসি গ্লিক

7

উপরের কোডটি নিয়ে তিনটি সম্ভাব্য সমস্যা:

  1. যদি getChannel একটি ব্যতিক্রম ছুঁড়ে, আপনি একটি খোলা স্ট্রিম ফাঁস হতে পারে।
  2. বড় ফাইলগুলির জন্য, আপনি ওএস হ্যান্ডেল করতে পারে তার চেয়ে একবারে আরও স্থানান্তর করার চেষ্টা করছেন।
  3. আপনি ট্রান্সফারফর্মের রিটার্ন মানটিকে উপেক্ষা করছেন, তাই এটি ফাইলের কেবলমাত্র অংশটি অনুলিপি করছে।

এ কারণেই org.apache.tools.ant.util.ResourceUtils.copyResourceএতো জটিল। এছাড়াও নোট করুন যে ট্রান্সফারফ্র্যামের ঠিক আছে যখন, লিনাক্সের জেডিকে ১.৪ এ ট্রান্সফারটো বিচ্ছেদ হয় ( বাগ আইডি দেখুন: ৫০৫563৯৯ ) - জেসি গ্লিক জান


7

আপনি যদি এমন কোনও ওয়েব অ্যাপ্লিকেশনটিতে থাকেন যা ইতিমধ্যে স্প্রিং ব্যবহার করে এবং আপনি যদি সহজ ফাইল অনুলিপি করার জন্য অ্যাপাচি কমন্স আইও অন্তর্ভুক্ত না করতে চান তবে আপনি স্প্রিং ফ্রেমওয়ার্কের ফাইলকপি ইউটিলেস ব্যবহার করতে পারেন ।


7

এখানে তিনটি উপায় যা আপনি একক লাইন কোডের সাহায্যে ফাইলগুলি অনুলিপি করতে পারবেন!

জাভা 7 :

java.nio.file.Files # কপি

private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

অ্যাপাচি কমন্স আইও :

FileUtils # copyFile

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}

পেয়ারা :

ফাইল # কপি

private static void copyFileUsingGuava(File source,File dest) throws IOException{
    Files.copy(source,dest);          
}

প্রথমটি ডিরেক্টরিগুলির জন্য কাজ করে না। অভিশাপ সবাই এই এক ভুল হয়ে যাচ্ছে। আপনার এপিআই যোগাযোগের আরও কিছু সমস্যা। আমিও ভুল করেছিলাম।
মিমি

প্রথমটির জন্য 3 টি পরামিতি প্রয়োজন। Files.copyমাত্র 2 প্যারামিটার ব্যবহার Pathকরার জন্য Stream। শুধু প্যারামিটার যোগ StandardCopyOption.COPY_ATTRIBUTESঅথবা StandardCopyOption.REPLACE_EXISTINGজন্য PathকরতেPath
Pimp থেকে Trizkit

6
public static void copyFile(File src, File dst) throws IOException
{
    long p = 0, dp, size;
    FileChannel in = null, out = null;

    try
    {
        if (!dst.exists()) dst.createNewFile();

        in = new FileInputStream(src).getChannel();
        out = new FileOutputStream(dst).getChannel();
        size = in.size();

        while ((dp = out.transferFrom(in, p, size)) > 0)
        {
            p += dp;
        }
    }
    finally {
        try
        {
            if (out != null) out.close();
        }
        finally {
            if (in != null) in.close();
        }
    }
}

সুতরাং শীর্ষ গৃহীত উত্তর থেকে পার্থক্য হ'ল আপনি কিছুক্ষণ লুপের মধ্যে স্থানান্তর পেয়েছেন?
রুপ

1
এমনকি সংকলনও করে না এবং ক্রিয়েটনিউইফাইল () কলটি নিরর্থক এবং অপব্যয়যুক্ত।
মার্কুইস লরেন

3

বাফারের সাথে এনআইও অনুলিপিটি আমার পরীক্ষা অনুসারে দ্রুত। আমার একটি পরীক্ষার প্রকল্প থেকে https://github.com/mhisoft/fastcopy এ নীচের কাজের কোডটি দেখুন

import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.text.DecimalFormat;


public class test {

private static final int BUFFER = 4096*16;
static final DecimalFormat df = new DecimalFormat("#,###.##");
public static void nioBufferCopy(final File source, final File target )  {
    FileChannel in = null;
    FileChannel out = null;
    double  size=0;
    long overallT1 =  System.currentTimeMillis();

    try {
        in = new FileInputStream(source).getChannel();
        out = new FileOutputStream(target).getChannel();
        size = in.size();
        double size2InKB = size / 1024 ;
        ByteBuffer buffer = ByteBuffer.allocateDirect(BUFFER);

        while (in.read(buffer) != -1) {
            buffer.flip();

            while(buffer.hasRemaining()){
                out.write(buffer);
            }

            buffer.clear();
        }
        long overallT2 =  System.currentTimeMillis();
        System.out.println(String.format("Copied %s KB in %s millisecs", df.format(size2InKB),  (overallT2 - overallT1)));
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    finally {
        close(in);
        close(out);
    }
}

private static void close(Closeable closable)  {
    if (closable != null) {
        try {
            closable.close();
        } catch (IOException e) {
            if (FastCopy.debug)
                e.printStackTrace();
        }    
    }
}

}


চমৎকার! এই এক standar java.io প্রবাহ চেয়ে দ্রুত বরং এসে গেছে .. শুধুমাত্র 160 সেকেন্ডের মধ্যে 10GB অনুলিপি
aswzen

2

জাভা এবং অ্যান্ড্রয়েডের সমস্ত সংস্করণগুলির সাথে দ্রুত এবং কাজ করুন:

private void copy(final File f1, final File f2) throws IOException {
    f2.createNewFile();

    final RandomAccessFile file1 = new RandomAccessFile(f1, "r");
    final RandomAccessFile file2 = new RandomAccessFile(f2, "rw");

    file2.getChannel().write(file1.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, f1.length()));

    file1.close();
    file2.close();
}

1
সমস্ত ফাইল সিস্টেম মেমরি ম্যাপযুক্ত ফাইলগুলিকে সমর্থন করে না এবং আমি মনে করি এটি ছোট ফাইলগুলির জন্য তুলনামূলকভাবে ব্যয়বহুল।
রুপ

1.4 এর আগে জাভার কোনও সংস্করণ নিয়ে কাজ করে না এবং একক লেখার যথেষ্ট গ্যারান্টি দেয় এমন কিছুই নেই nothing
মার্কুইস লরেনের

1

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

বিভিন্ন পদ্ধতি ব্যবহার করে ফাইল স্থানান্তরের তুলনা

পদ্ধতিগুলি এখানে:

private static long fileCopyUsingFileStreams(File fileToCopy, File newFile) throws IOException {
    FileInputStream input = new FileInputStream(fileToCopy);
    FileOutputStream output = new FileOutputStream(newFile);
    byte[] buf = new byte[1024];
    int bytesRead;
    long start = System.currentTimeMillis();
    while ((bytesRead = input.read(buf)) > 0)
    {
        output.write(buf, 0, bytesRead);
    }
    long end = System.currentTimeMillis();

    input.close();
    output.close();

    return (end-start);
}

private static long fileCopyUsingNIOChannelClass(File fileToCopy, File newFile) throws IOException
{
    FileInputStream inputStream = new FileInputStream(fileToCopy);
    FileChannel inChannel = inputStream.getChannel();

    FileOutputStream outputStream = new FileOutputStream(newFile);
    FileChannel outChannel = outputStream.getChannel();

    long start = System.currentTimeMillis();
    inChannel.transferTo(0, fileToCopy.length(), outChannel);
    long end = System.currentTimeMillis();

    inputStream.close();
    outputStream.close();

    return (end-start);
}

private static long fileCopyUsingApacheCommons(File fileToCopy, File newFile) throws IOException
{
    long start = System.currentTimeMillis();
    FileUtils.copyFile(fileToCopy, newFile);
    long end = System.currentTimeMillis();
    return (end-start);
}

private static long fileCopyUsingNIOFilesClass(File fileToCopy, File newFile) throws IOException
{
    Path source = Paths.get(fileToCopy.getPath());
    Path destination = Paths.get(newFile.getPath());
    long start = System.currentTimeMillis();
    Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
    long end = System.currentTimeMillis();

    return (end-start);
}

এনআইও চ্যানেল ক্লাসটি ব্যবহার করার সময় আমি যা দেখতে পাচ্ছি তা হ'ল আমি এখনও মধ্যবর্তী ফাইল কপির অগ্রগতি দেখানোর উপায় খুঁজে পাচ্ছি না।

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