سلام به کاربران عزیز Tosinso. یکی از اعمال مهمی که با فایل ها انجام میدهیم و هر روزه این عمل را ممکن است چندین بار تکرار کنیم عمل کپی کردن فایلها میباشد. همچنین برنامههای مختلفی مانند برنامههای نصاب و برنامههای دانلود نیز عمل کپی کردن را انجام میدهند. در این مطلب قصد داریم که راههای مختلف کپی کردن فایل را در جاوا معرفی کنیم.
با اینکه جاوا برای کار با فایلها یک کلاس بسیار غنی دارد و آن java.io.File میباشد ولی این کلاس یک متد برای کپی کردن یک فایل به جای دیگر ندارد. بنابراین برای کپی کردن باید از راههای دیگری استفاده کنیم.
این راه یکی از قدیمی ترین راهها میباشد. روش این کار به این شکل است که محتوای یک فایل را به فایل دیگری کپی کنیم. یعنی ما بایت ها را از یک فایل به سادهترین روش میخوانیم و در فایل مقصد همان بایت ها را می نویسیم. خواندن فایلها توسط 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 متدی به نام 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 یک متد با نام 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 و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود