مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش 4 روش کپی کردن فایل در جاوا به زبان ساده

سلام به کاربران عزیز Tosinso. یکی از اعمال مهمی که با فایل ها انجام می‌دهیم و هر روزه این عمل را ممکن است چندین بار تکرار کنیم عمل کپی کردن فایل‌ها می‌باشد. همچنین برنامه‌های مختلفی مانند برنامه‌های نصاب و برنامه‌های دانلود نیز عمل کپی کردن را انجام می‌دهند. در این مطلب قصد داریم که راه‌های مختلف کپی کردن فایل را در جاوا معرفی کنیم.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

در دوره آموزش جاوا ( آموزش برنامه نویسی جاوا ) این موارد بصورت رایگان آموزش داده شده است

کپی کردن فایل در جاوا

با اینکه جاوا برای کار با فایل‌ها یک کلاس بسیار غنی دارد و آن java.io.File می‌باشد ولی این کلاس یک متد برای کپی کردن یک فایل به جای دیگر ندارد. بنابراین برای کپی کردن باید از راه‌های دیگری استفاده کنیم.

۱.کپی کردن با استفاده از FileStream ها

این راه یکی از قدیمی ترین راه‌ها می‌باشد. روش این کار به این شکل است که محتوای یک فایل را به فایل دیگری کپی کنیم. یعنی ما بایت ها را از یک فایل به ساده‌ترین روش می‌خوانیم و در فایل مقصد همان بایت ها را می نویسیم. خواندن فایل‌ها توسط FileInputStream و نوشتن در فایل مقصد توسط FileOutputStream انجام می‌شود. در ادامه کد این روش آورده شده است.

        throws IOException {
    InputStream input = null;
    OutputStream output = null;
    try {
        input = new FileInputStream(source);
        output = new FileOutputStream(dest);
        byte[] buf = new byte[1024];
        int bytesRead;
        while ((bytesRead = input.read(buf)) > 0) {
            output.write(buf, 0, bytesRead);
        }
    } finally {
        input.close();
        output.close();
    }
}

همانطور که در کد دیده می‌شود ما چندین بار عمل خواندن و نوشتن را انجام می‌دهیم به همین دلیل می‌توان گفت که این روش به اندازه کافی سودمند نیست.

۲.کپی کردن فایل‌ها با استفاده از java.nio.channels.FileChannel

این روش از روش قبل سریع‌تر است. در java NIO متدی به نام transferFrom وجود دارد که طبق مستندات از روش قبل سریع‌تر می باشد. کد استفاده از این روش در ادامه آمده است.

private static void copyFileUsingFileChannels(File source, File dest)
        throws IOException {
    FileChannel inputChannel = null;
    FileChannel outputChannel = null;
    try {
        inputChannel = new FileInputStream(source).getChannel();
        outputChannel = new FileOutputStream(dest).getChannel();
        outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
    } finally {
        inputChannel.close();
        outputChannel.close();
    }
}

۳. کپی کردن با استفاده از Apache Commons IO

کتابخانه Apache Commons IO یک متد با نام copyFile ارائه می‌دهد که می‌تواند عمل کپی کردن را انجام دهد. این متد در کلاس FileUtils قرار دارد. اگر شما در پروژه خودتان از Apache Commons استفاده می‌کنید پس حتماً توصیه می‌شود که برای کپی کردن فایل نیز از همین روش استفاده کنید. در اصل این روش هم برای کپی کردن فایل‌ها به صورت داخلی از java NIO استفاده می کند. کد این روش در ادامه آورده شده است:

private static void copyFileUsingApacheCommonsIO(File source, File dest)
        throws IOException {
    FileUtils.copyFile(source, dest);
}
۴. کپی کردن با استفاده از کلاس Files از جاوا ۷
اگر با جاوای ۷ کار کرده باشید احتمالاً برای کپی کردن از کلاس Files استفاده کرده اید. کد این روش بسیار ساده است و به شکل زیر است:
private static void copyFileUsingJava7Files(File source, File dest)
        throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

حال کدام روش بهتر است؟

طبق تست هایی که گرفته شده است در مواجهه با فایل‌های بزرگ استفاده از FileChannels یعنی روش دوم بسیار سریعتر بوده است. بنابراین می‌توانید برای کپی کردن از آن استفاده کنید.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات