April 21, 2012

File, Directory နှင့် Link များကို ရေးသားခြင်း

စာမရေးဖြစ်သည်မှာ အတော်ပင်ကြာပြီ ဖြစ်၏။ အခုတလော နေ့တိုင်း အလုပ်နောက်ကျနေသည်က တစ်ကြောင်း၊ စနေတနင်္ဂနွေကျပြန်တော့လည်း ကြားအလုပ်ကို လက်ခံထားပါသဖြင့် မပြီးပြီးအောင် လုံးပမ်းနေရသည်က တစ်ကြောင်း အကြောင်းကြောင်းကြောင့် စာမရေးဖြစ်ပါ။ စာမရေးတာကြာတော့ တစ်ခုခုလိုနေသလိုပင်။ ဒီနေ့တော့ တစ်နာရီလောက် အချိန်ရပါသဖြင့် အရင်ရေးလက်စဖြစ်သော Java 7 ၏ NIO2 ကို ဆက်ပါဦးမည်။

ပြန်နွေးသည့်အနေဖြင့် အရင်ရေးခဲ့ပြီးအကြောင်းများကို အကျဉ်းချုပ် စဉ်းစားကြည့်ပါဦးမည်။ NIO2 သည် Java ၏ File System အင်တာဖေစ်အသစ်တစ်ခု ဖြစ်ပြီး၊ လက်ရှိ File System Interface ၏ အားနည်းချက်များကို ပြုပြင်ရန်ရည်ရွယ်၍ ရေးသားခဲ့သော API အသစ်တစ်ခု ဖြစ်ပါသည်။ File System တစ်ခုလုံးကို ကိုယ်စားပြုအသုံးပြုနိုင်ရန်အတွက် java.nio.file.FileSystem ကလပ်စ်၊ java.io.File အား အစာထိုးလာသည်မှာ java.nio.file.Path အင်တာဖေစ် ဖြစ်၏။ Path အင်တာဖေစ် အားအသုံးပြုနိုင်ရန် ရေးသားထားသော Utility Class မှာ java.nio.file.Files ကလပ်စ် ဖြစ်၏။

ပြီးခဲ့သော အခန်းဆက်များဖြင့် Path အော့ဘဂျက်ကို ရေးသားပုံ၊ ယခင် အသုံးပြုခဲ့သော File အော့ဘဂျက်များနှင့် အပြန်အလှန် ခေါ်ယူအသုံးပြုနိုင်ပုံ၊ အလွယ်တကူ Input Output များကို ရေးသားအသုံးပြုနိုင်ပုံ အစရှိသည်တို့ကို ဖော်ပြခဲ့၏။ ယခု တစ်ခေါက်တွင်လည်း ဆက်လက်၍ Files Utility ကလပ်စ်၏ အသုံးပြု၍ ဖိုင်နှင့် ဒိုင်အတ္တရီများကို ရေးသားပုံကို လေ့လာဖော်ပြသွားပါဦးမည်။

ယခင် IO API တွင် File ကလပ်စ်ကို အသုံးပြု၍ ဖိုင်နှင့် ဒိုင်အတ္တရီများကို အသစ်ရေးသားနိုင်ပါသည်။ Java ၏ IO System အသစ်ဖြစ်သော NIO2 တွင်လည်း၊ ဖိုင်နှင့် ဒိုင်အတ္တရီများကို အသစ်ရေးသားနိုင်ပါသည်။ သို့ရာတွင် Path ၏ လုပ်ဆောင်ချက်အနေဖြင့် မဟုတ်ပဲ Files ကလပ်စ်၏ လုပ်ဆောင်ချက်အနေဖြင့် ပံ့ပုံလာခဲ့ပါသည်။



ဖိုင်များကို ရေးသားခြင်း


ဦးစွာ ဖိုင်တစ်ခုကို အလွယ်တကူ ရေးသားကြည့်ပါမည်။
   FileSystem fs = FileSystems.getDefault();
   Path path1 = fs.getPath("default.txt");
   Files.createFile(path1);

Nio2 တွင် ဖိုင်များကို ရေးသားရာတွင် Files#createFile လုပ်ဆောင်ချက်ကို အသုံးပြုနိုင်ပါသည်။ ပါရာမီတာအနေဖြင့် ရေးသားလိုသည့် Path အော့ဘဂျက်ကို ဖြည့်စွက်ရေးသားရမည် ဖြစ်၏။ အထက်ပါ ကုဒ်များကို ကွန်ပိုင်းလုပ်ပြီး၊ အလုပ်လုပ်ခိုင်းကြည့်ပါက myfile.txt ဆိုသည့် ဖိုင်တစ်ခုကို ပမာဏ 0 byte ဖြင့် တည်ဆောက်နိုင်မည် ဖြစ်သည်။

ရှိနှင့်ပြီးသား ဖိုင်အား create လုပ်ပါက java.nio.file.FileAreadyExistsException ကို ဖြစ်ပေါ်စေမည် ဖြစ်၏။ တဖန် လက်တွေ့မရှိသော ဒိုင်အတ္တရီတွင် ဖိုင်အား တည်ဆောက်မိပါက java.nio.file.NoSuchFileException ကို ဖြစ်ပေါ်စေပါမည်။

တဖန် Linux နှင့် Solaries ကဲ့သို့ POSIX ကို အခြေခံသော Operating System များတွင်၊ ဖိုင်များကို တည်ဆောက်မည် ဆိုပါက အသုံးပြုနိုင်ခွင့်များကို သတ်မှတ်ရေးသားနိုင်မည် ဖြစ်သည်။ အကဲ၍ ဖတ်ရုံသာ ဖတ်နိုင်သော ဖိုင်တစ်ခုကို တည်ဆောက်မည် ဆိုပါက အောက်ပါနာ့မှုနာ အတိုင်း ရေးသားနိုင်မည် ဖြစ်သည်။
   Path path2 = fs.getPath("readOnly.txt");

   Set<PosixFilePermission> pms = 
     PosixFilePermissions.fromString("r--r--r--");
   FileAttribute<Set<PosixFilePermission>> attribute = 
     PosixFilePermissions.asFileAttribute(pms);

   Files.createFile(path2, attribute);
အထက်ပါ စာကြောင်း နံပါတ် ၈ တွင် ဖော်ပြထားသကဲ့သို့၊ Files#createFile လုပ်ဆောင်ချက်၏ ဒုတိယ ပါရာမီတာ အနေဖြင့် ပါမစ်ရှင်းကို သတ်မှတ်ရေးသားနိုင်ပါသည်။ ဒုတိယ ပါရာမီတာ၏ ပုံစံမှာ java.nio.file.attribute.FileAttribute အင်တာဖေစ် ဖြစ်ပါသည်။

FileAttribute အင်တာဖေစ်သည် name နှင့် value လုပ်ဆောင်ချက်များကို ပံ့ပိုးထားပြီး၊ name လုပ်ဆောင်ချက်ဖြင့် Attribute ၏ အမည်ကိုပြန်ပေးပြီး၊ value လုပ်ဆောင်ချက်ဖြင့် Attribute ၏ တန်ဖိုးကိုပြန်ပေးသော လုပ်ဆောင်ချက်ကို ဖြည့်စွက်ရေးသားမည်ဆိုပါက FileAttribute ၏ အော့ဘဂျက်ကို တိုက်ရိုက်ရေးသားနိုင်မည် ဖြစ်၏။ သို့ရာတွင် ဤနမှုနာ၌ PosixFilePermissions ကလပ်စ်ကို အသုံးပြုပြီး၊ FileAttribute ၏ အော့ဘဂျက်ကို ရေးသားထားပါသည်။

PosixFilePermissions ကလပ်၏ နောက်ဆုံးစာလုံးတွင် s ပါသည့်အတိုင်း၊ ဤကလပ်စ်သည် PosixFilePermission enum ကို အသုံးချနိုင်ရန် ပြင်ဆင်ထားသော Utility ကလပ်စ် တစ်ခု ဖြစ်ပါသည်။ အထက်ပါကုဒ်၏ စာကြောင်းနံပါတ် ၄ တွင် ရေးသားထားသည့်အတိုင်း၊ PosixFilePermissions#fromString လုပ်ဆောင်ချက်ကို အသုံးပြုခြင်းအားဖြင့် FilePermission အော့ဘဂျက်များပါဝင်သော java.util.Set ၏ အော့ဘဂျက်ကို ခေါ်ယူအသုံးပြု နိုင်မည် ဖြစ်၏။ fromString လုပ်ဆောင်ချက်၏ ပါရာမီတာသည် Unix အမျိုးအစား OS များတွင်ဖော်ပြလေ့ရှိသော ခွင့်ပြုချက် စာလုံးများ ဖြစ်ပါသည်။ "r--r--r--" သည် Read Only ပါမစ်ရှင်းကို ဖော်ပြပေးနေပါသည်။

စာကြောင်းနံပါတ် ၆ တွင် PosixFilePermissions#asFileAttribute ကို အသုံးပြု၍၊ အထက်ပါ FilePermission အော့ဘဂျက် Set မှတဆင့် FileAttribute အော့ဘဂျက်ကို ခေါ်ယူ နေသည်ကို တွေ့ရပါမည်။

နောက်ဆုံးတွင် Files#create ဖြင့် ပါမစ်ရှင်းကို သက်မှတ်ထားသော File တစ်ခုကို တည်ဆောက်နေခြင်း ဖြစ်ပါသည်။ အထက်ပါ ကုဒ်များကို လက်တွေ့ Fedora Linux အပေါ်တွင် အသုံးပြုကြည့်ပါမည်။


Default ဖြင့် ရေးသားထားသော defalut.txt မှာ Owner နှင့် Group တွင်ရေးသားခွင့်ရှိသော ဖိုင်အဖြစ် တည်ဆောက်ထားသည်ကို တွေ့ရမည် ဖြစ်ပြီး၊ ပါမစ်ရှင်းကို သတ်မှတ်ထားသော readOnly.txt ကိုမူ read only ပါမစ်ရှင်းဖြင့် တည်ဆောက်ထားသည်ကို တွေ့ရပါလိမ့်မည်။

ဖော်ပြပါ ကလပ်ကို Windows အပေါ်တွင် ကွန်ပိုင်းလုပ်၍ အသုံးပြုကြည့်ပါက java.lang.UnsupportedOperationException ကို ဖြစ်ပေါ်စေသည်ကို တွေ့ရပါမည်။ အဘယ်ကြောင့်ဆိုသော် Windows တွင် POSIX ကို Support မလုပ်သောကြောင့် ဖြစ်ပါသည်။


ဒိုင်အတ္တရီကို ရေးသားခြင်း


ဒိုင်အတ္တရီများကိုလည်း ဖိုင်များကဲ့သို့ပင် Files ကလပ်စ်ဖြင့် တည်ဆောက်နိုင်ပါသည်။ အောက်ပါ နမှုနာကို ကြည့်ပါ။
   FileSystem fs = FileSystems.getDefault();
   Path dir1 = fs.getPath("dir1");
   Files.createDirectory(dir1);
   
   Path dir3 = fs.getPath("dir2", "dir3");
   Files.createDirectories(dir3);
ဒိုင်အတ္တရီ တစ်ခုချင်းကို တည်ဆောက်လိုပါက အထက်ပါ စာကြောင်းနံပါတ် ၃ အတိုင်း Files#createDiractory မက်သတ်ကို အသုံးပြုနိုင်ပါသည်။ တဖန် စာကြောင်း ၆ကဲ့သို့ dir2/dir3 လက်ရှိ ဒိုင်အတ္တရီ (Current Directory) မှ dir2 နှင့် dir2/dir3 ကို တည်ဆောက်လိုပါက Files#createDirectories မက်သတ်ကို အသုံးပြုရန်လိုအပ်ပါသည်။

အကယ်၍ ရှိပြီးသား ဒိုင်အတ္တရီ(Directory) တစ်ခုအား Files#createDirectory ဖြင့် တည်ဆောက်မိပါက java.nio.file.FileAlreadyExistsException ကို ဖြစ်ပေါ်စေမည်ဖြစ်သည်။ သို့ရာတွင် Files#createDirectories ကို အသုံးပြုပါက Exception ကို ဖြစ်ပေါ်စေမည်မဟုတ်ပါ။


လင့်ခ်များကို ပြုလုပ်ခြင်း

Java7 အရောက်တွင် Java ဖြင့် လင့်ခ်(link)များကို အသုံးပြုလာနိုင်ပါသည်။ Java ဖြင့် အသုံးပြုနိုင်သော လင့်ခ်များမှာ Hard Link နှင့် Symbolic Link ဟူ၍ နှစ်မျိုးနှစ်စား ခွဲခြားနိုင်ပါသည်။


လင့်ခ်အမာ (Hard Link)

   FileSystem fs = FileSystems.getDefault();
   Path target = fs.getPath("target.txt");
   
   if(!Files.exists(target)) {
    Files.createFile(target);
   }
   
   // Creation of Hard Link
   Path link = fs.getPath("link.txt");
   Files.createLink(link, target);
လင့်ခ်အမာ (Hard Link) များအား အထက်ပါ စာကြောင်း ၁၀ အတိုင်း Files#createLink ကို အသုံးပြု၍ တည်ဆောက်နိုင်ပါသည်။ ပဋ္ဌမ ပါရာမီတာမှာ အသုံးပြုမည့် လင့်ခ်၏ Path အော့ဘဂျက်ဖြစ်ပြီး၊ ဒုတိယ ပါရာမီတာမှာ လင့်ခ်လုပ်မည့် ဖိုင်၏ ပါရာမီတာကို ရေးသားရပါမည်။

လင့်ခ်အမာများကို ရေးသားအသုံးပြုရာတွင် ဖိုင်ကိုသော်၎င်း ဒိုင်အတ္တရီကိုသော်၎င်း ရေးသားအသုံးပြုနိုင်ပါသည်။ သို့ရာတွင် သတိပြုရန် အချက်အနည်းငယ်ရှိပါသည်။

  • Linux, Solaries များတွင် ဖိုင်နှင့် ဒိုင်အတ္တရီများကို လင့်ခ်အမာဖြင့် လင့်ခ်လုပ်နိုင်သော်လည်း၊ Windows မှာတော့ ဖိုင်များကိုသာ လင့်ခ်လုပ်နိုင်ပါသည်။
  • Windows တွင်အသုံးပြုရာတွင် FAT ကိုအသုံးပြုသည့် Volume ဆိုပါက Hard Link များကို အသုံးပြု၍ရမည် မဟုတ်ပါ။
  • Linux, Solaries နှင့် Windows များမှာပါ လင့်ခ်အမာ (Hard Link) များကို လင့်ခ်လုပ်လိုသည့် ဖိုင်၊ ဒိုင်အတ္တရီများနှင့် Volume တစ်ခုအတွင်းမှသာ အသုံးပြုနိုင်ပါသည်။


စင်ဘိုးလစ်လင့်ခ် (Symbolic Link)


လင့်ခ်အမာများနှင့်စာလျှင် စင်ဘိုးလစ်လင့်ခ်များသည် ပို၍သုံးရလွယ်ကူပါသည်။ လက်တွေ့ ရေးသားကြည့်ပါမည်။
   // Creation of Symbolic Link
   Path link = fs.getPath("link.txt");
   Files.createSymbolicLink(link, target);
အထက်ပါအတိုင်း Files#createSymbolicLink မက်သတ်ဖြင့် စင်ဘိုးလစ်လင့်ခ်ကို ရေးသားအသုံးပြုနိုင်ပါသည်။ အထက်ပါကုဒ်များကို Fedora Linux ပေါ်တွင် Run ကြည့်ပါမည်။


အထက်ပါအတိုင်း target.txt ကို ရည်ညွှန်းသော link.txt စင်ဘိုးလစ်လင့်ခ်ကို ရေးသားနိုင်သည်ကို တွေ့ရပါမည်။

Windows အပေါ်တွင်လည်း Windows Vista မှစ၍ စင်ဘိုးလစ်လင့်ခ်များကို ရေးသားအသုံးပြု နိုင်ပါသည်။ သို့ရာတွင် စင်ဘိုးလစ်လင့်ခ်ကို ရေးသားရန် Admin Permission ကို လိုအပ်ပါသည်။ Command Promt ကို Admin ဖြင့်ဖွင့်ပြီး၊ နမှုနာ Symbolic.java ကို ကွန်ပိုင်းလုပ်ပြီး၊ အလုပ်ခိုင်းကြည့်ပါမည်။


အထက်ပါအတိုင်း target.txt ကို ရည်ညွှန်းသည့် စင်ဘိုးလစ်လင့်ခ်ကို ရေးသားနိုင်သည်ကို တွေ့ရပါမည်။

ယခုတစ်ခေါက်တွင် Files Utility Class ကို အသုံးပြု၍ File၊ Directory နှင့် လင့်ခ်များကို ရေးသားနိုင်ပုံကို ဖော်ပြခဲ့၏။ နောက်အခေါက်များတွင်လည်း ဆက်လက်၍ Nio2 နှင့်ပတ်သက်သော အကြောင်းအရာများကို ဆက်လက်ဖော်ပြသွားပါဦးမည်။


လေးစားစွာဖြင့်
မင်းလွင်


ကိုးကား
http://itpro.nikkeibp.co.jp/article/COLUMN/20110830/367909/?ST=develop&mkjt&P=1
http://docs.oracle.com/javase/tutorial/essential/io/check.html

No comments:

Post a Comment