کلاس File

در جاوا از کلاس File برای دستکاری فایلهای موجود در یک دایرکتوری استفاده می شود. این کلاس دارای متدهایی است که به شما اجازه کپی، حذف، بازکردن، انتقال و ایجاد یک فایل را می دهند. کلاس File در پکیج java.io قرار دارد و باید آن را در برنامه وارد کنید :

import java.io.File;

برخی از متدهای پر کاربرد کلاس File در جدول زیر آمده است :

متد کاربرد
createNewFile() ایجاد یک فایل در یک مسیر خاص
delete() حذف فایل
isFile() چک می کند که آیا مسیر داده شده، یک فایل است یا نه؟
isDirectory() چک می کند که آیا مسیر داده شده، یک پوشه است یا نه؟
exists() چک کردن اینکه آیا یک فایل در یک مسیر خاص وجود دارد یا نه؟
renameTo() برای انتقال و تغییر نام یک فایل به کار می رود.
getName() نام فایل را بر می گرداند.
getParent() پوشه یا درایوی که فایل در آن قرار دارد را بر می گرداند.
getPath() مسیر فایل را بر می گرداند.
length() حجم فایل را بر حسب بایت بر می گرداند.
lastModified() زمان آخرین دستکاری فایل را بر می گرداند.
mkdir() برای ایجاد یک پوشه به کار می رود
mkdirs() برای ایجاد یک پوشه های تو در تو به کار می رود

ایجاد یک فایل

با استفاده از متد createNewFile می توان یک فایل جدید ایجاد کرد. این متد یک مقدار بولی را بر می گرداند. اگر فایل ایجاد شود true و در غیر اینصورت false را بر می گرداند . البته قبل از استفاده از این متد باید یک نمونه از کلاس فایل ایجاد شده و سپس مسیری که قرار است فایل در آنجا ساخته شود به عنوان پارامتر به سازنده کلاس فایل ارسال شود . به مثال زیر توجه کنید :

File f = new File("C:Sample.txt");

try
{
    if(f.createNewFile())
    {
        System.out.println("The File is created!");
    }
}
catch(IOException e)
{
    System.out.println(e.getMessage());
}

نکته اینجاست که اگر فایلی از قبل به این نام وجود داشته باشد حذف نشده و فایل جدید جایگزین نمی شود. همانطور که در کد بالا مشاهده می کنید باید خطاهای ایجاد و یا عدم ایجاد فایل را مدیریت کنید. روش دیگر برای ایجاد فایل ایجاد IOExeption به صورت زیر است :

public static void main(String[] args) throws IOException
{
    File f = new File("C:Sample.txt");

    f.createNewFile();
}

با استفاده از متد exists می توان تست کرد که آیا مسیری که مورد نظر شماست وجود دارد، که در صورت پیدا کردن مسیر فایل یا دایرکتوری، مقدار true و در غیر اینصورت مقدار false را بر می گرداند.

File f = new File("C:text.txt");

if (f.exists())
{
    System.out.println("The File found!");
}

حذف یک فایل

برای حذف یک فایل از متد delete استفاده می شود :

f.delete();

این متد هم یک مقدار بولی را بر می گرداند.

انتقال و تغییر نام یک فایل

برای انتقال یک فایل یک از مسیر به مسیر دیگر می توانید از متد renameTo استفاده می شود :

File Sourcesample =new File("C:\\Sample.txt");

Sourcesample.renameTo(new File("D:" + Sourcesample.getName()));

در خط دوم کد بالا ما در داخل متد renameTo یک شیء جدید ایجاد کرده ایم و مسیر جدید را که درایو D است به آن داده ایم. برای اینکه نام فایل هم تغییر نکند از متد ()getName برای به دست آوردن نام فایل مبدا استفاده کرده ایم. در کل معنی کد بالا این است که فایل اصلی را به درایو D و با همین نام منتقل کن. برای روشن شدن مطلب به کد زیر توجه کنید :

File Sourcesample =new File("C:Sample.txt");

File Destsample = new File("D:\\Sample.txt");

Sourcesample.renameTo(Destsample);

در کد بالا ما یک فایل مبدا داریم با نام Sourcesample و می خواهیم آن را به درایو D منتقل کنیم . برای این کار یک شیء جدید که نشان دهنده مکان جدید است با نام Destsample ایجاد کرده و به عنوان پارامتر به متد renameTo ارسال می کنیم. برای انتقال و تغیر نام همزمان هم می توانیم به صورت زیر مسیر و نام جدید را تعریف کنیم :

File Destsample = new File("D:NewName.txt");

به دست آوردن مسیر و والد یک فایل

برای به دست آوردن مسیر و والد یک فایل از متد های ()getParent و ()getPath به صورت زیر استفاده می شود :

File f =new File("C:Sample.txt");

System.out.println(f.getName());
System.out.println(f.getParent());
System.out.println(f.getPath());
Sample.txt
C:
C:\\Sample.txt

همانطور که در کد بالا مشاهده می کنید نام فایل، مکان و مسیر فایل نشان داده شده است. کلاس File دارای متدهای بیشتری برای کار با فایل است که در این درس به همین چند متد اکتفا می کنیم.

ایجاد یک پوشه و پوشه های تو در تو

برای ایجاد یک پوشه از متد mkdir استفاده می شود :

File f =new File("C:\\Folder1");

f.mkdir();

کد بالا یک پوشه با نام Folder1 در درایو C ایجاد می کند. و برای ایجاد پوشه های تو در تو از متد mkdirs می توان استفاده کرد :

File f =new File("C:\\Folder1\Folder2");

f.mkdirs();

کد بالا یک پوشه با نام Folder1 در درایو C ایجاد می کند که در داخل آن یک پوشه دیگر Folder2 قرار دارد.

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

برای به دست آوردن نام پوشه ها و فایل های موجود در یک پوشه از متد ()listFiles استفاده می شود. یک پوشه به نام Folder در داخل درایو C ایجاد کرده و دو فایل و یک پوشه در داخل آن قرار دهید. سپس کدهای زیر را بنویسید :

import java.io.File;

public class MyFirstProgram 
{
    public static void main(String[] args) 
    {
        File file = new File("C:Folder");
        if(file.isDirectory())
        {
            File[] files = file.listFiles();
            for(File f : files)
            {
                System.out.println(f.getName());
            }
        }
    }   
}

در کد بالا ابتدا مسیر پوشه ای که در درایو C ایجاد کرده ایم را در سازنده کلاس File نوشته ایم. در خط بعد با استفاده از متد ()isDirectory چک می کنیم که آیا مسیر متعلق به یک پوشه است یا نه؟ اگر چنین بود در داخل بدنه دستور if ابتدا یک آرایه از کلاس فایل ایجاد می کنیم، چون متد ()listFiles یک آرایه از فایل ها را بر می کرداند. سپس با استفاده از یک حلقه foreach نام فایل ها را چاپ می کنیم.

به دست آوردن لیست زیر پوشه ها

همانطور که در مثال قبل دیدیم با استفاده از متد listFiles می توانیم لیست فایل ها و زیر پوشه های یک پوشه خاص را به دست بیاوریم ولی گاهی نیاز داریم تنها زیر پوشه ها را لیست کنیم برای اینکار می توانیم از FileFilter استفاده کنیم.به مثال زیر دقت کنید :

import java.io.*;

public class FileDemo
{
    public static void main(String[] args)
    {
        File file = new File("G:/MyFolder");
        FileFilter myFilter = new FileFilter()
        {
            @Override
            public boolean accept(File f)
            {
                return f.isDirectory();
            }
        };

        if(file.isDirectory())
        {
            File[] files = file.listFiles(myFilter);
            for(File f : files)
            {
                System.out.println(f.getName());
            }
        }            
    }   
}

مثال بالا لیست زیر پوشه های پوشه MyFolder را چاپ می کند.برای استفاده از FileFilter ابتدا یک شی از آن ایجاد می کنیم ، چون این کلاس یک Interface است مجبور به پیاده سازی متد accept آن خواهیم بود ، در داخل متد accept مشخص می کنیم که چه نوع فایل هایی باید لیست شوند؟ در اینجا فقط فایل هایی که شرط isDirectory برای آن ها true باشد (به عبارتی پوشه باشند و نه یک فایل معمولی) لیست خواهند شد. برای استفاده از myFilter کافی است آن را به عنوان پارامتر به متد listFiles ارسال کنیم.در مثال بعد با کاربرد FileFilter بیشتر آشنا خواهید شد. گاهی نیاز داریم تا فایل های خاصی را لیست کنیم ، به عنوان مثال در یک برنامه مخصوص ویرایش متن ممکن است لازم داشته باشیم تنها فایل های با پسوند txt چاپ شوند، خوشبختانه در این حالت هم می توانیم از FileFilter استفاده کنیم. مثال زیر تمام فایل های با پسوند txt که در داخل پوشه MyFolder قرار دارند را چاپ می کند :

import java.io.*;

public class FileDemo
{
    public static void main(String[] args)
    {
        File file = new File("G:/MyFolder");
        FileFilter myFilter = new FileFilter()
        {
            @Override
            public boolean accept(File f)
            {
                return f.getName().endsWith(".txt");
            }
        };

        if(file.isDirectory())
        {
            File[] files = file.listFiles(myFilter);
            for(File f : files)
            {
                System.out.println(f.getName());
            }
        }            
    }   
}               

همانطور که مشاهده می کنید این مثال بسیار شبیه مثال قبلی است با این تفاوت که در اینجا به جای استفاده از شرط isDirectory از شرط متفاوت تری به صورت getName().endsWith استفاده می کند ، متد ()getName نام فایل را بر می گرداند و متد ()endsWith مشخص می کند آیا نام فایل با پسوند .txt خاتمه می یابد یا خیر؟ در نتیجه استفاده از myFilter به عنوان پارامتر ورودی listFiles باعث می شود تنها فایل هایی با پسوند txt چاپ شوند.
گاهی نیاز پیدا می کنیم برای لیست کردن فایل ها شرط های متفاوتی داشته باشیم به عنوان مثال ممکن است بخواهیم تمام فایل های txt و exe و همچنین تمام زیر پوشه های یک پوشه خاص را لیست کنیم برای این کار کافی است از عملگر || برای ترکیب شرط ها استفاده کنیم. مثال زیر تمام فایل های exe و همچنین تمام زیر پوشه های پوشه MyFolder را لیست می کند :

import java.io.*;

public class FileDemo
{
    public static void main(String[] args)
    {
        File file = new File("G:/MyFolder");
        FileFilter myFilter = new FileFilter()
        {
            @Override
            public boolean accept(File f)
            {
                return f.getName().endsWith(".exe") || f.isAbsolute();
            }
        };

        if(file.isDirectory())
        {
            File[] files = file.listFiles(myFilter);
            for(File f : files)
            {
                System.out.println(f.getName());
            }
        }            
    }   
}                

برای به دست آوردن نام درایو های اصلی سیستم هم از متد ()listRoots استفاده می کنیم :

import java.io.*;

public class FileDemo
{
    public static void main(String[] args)
    {
        File[] roots = File.listRoots();
        for (File f : roots)
        {
            System.out.println(f);
        }
    }
}

همانطور که مشاهده می کنید متد ()listRoots یک آرایه از نوع File بر می گرداند که با یک حلقه for می توانیم اشیای داخل آن را مورد بررسی قرار دهیم.دقت کنید که متد ()listRoots یک متد static است و برای استفاده از آن نیاز به ساختن یک شی جدید از کلاس File نداریم و می توانیم مستقیماً آن را فراخوانی کنیم.

تفاوت متد های list و listFiles

برای لیست فایل ها و پوشه های داخل یک پوشه خاص می توانیم از یکی از متد های ()list یا ()listFiles استفاده کنیم ، تفاوت این دو متد در این است که متد ()list تنها آرایه ای از String ها بر می گرداند که حاوی نام فایل هاست و مناسب برنامه هایی است که تنها به نام فایل نیاز داریم ولی متد ()listFiles آرایه ای از نوع File بر می گرداند و این قابلیت را به ما می دهد که مستقیماً با زیر فایل ها و زیر پوشه های پوشه مورد نظر به سادگی کار کنیم.

تعیین حجم کلی و فضای خالی یک درایو

برای تعیین فضای خالی یک درایو می توانیم از متد ()getFreeSpace استفاده کنیم ، این متد تعداد بایت های آزاد یک درایو را مشخص می کند ، فراخوانی این متد فقط باید بر روی درایو های اصلی انجام شود و بر روی سایر فایل ها نتیجه ای نخواهد داشت. مثال زیر فضای خالی درایو G را مشخص می کند :

File f = new File("G:");
System.out.println(f.getFreeSpace());

برای تعیین حجم یک درایو می توانیم از متد ()getTotalSpace استفاده کنیم ، این متد حجم یک درایو را برحسب بایت در اختیار ما قرار می دهد ، مشابه متد قبلی این متد نیز باید روی درایو های اصلی فراخوانی شود. مثال زیر حجم درایو G را مشخص می کند :

File f = new File("G:/");
System.out.println(f.getTotalSpace());