April 29, 2012

File, Directory များအား အသုံးချခြင်း

ပြီးခဲ့တဲ့ ဘလောဂ်များဖြင့် Java Nio2 ၏ Files Utility Class ကို အသုံးပြု၍ နမှုမှာအမျိုးမျိုးကို ဖော်ပြခဲ့ပါသည်။ သို့ရာတွင် Files ကလပ်စ်၌ အခြားအသုံးဝင်သော လုပ်ဆောင်ချက်များစွာ ကျန်ရှိပါသေးသည်။ ဖိုင်နှင့် ဒိုင်အတ္တရီ များအား ကော်ပီကူးခြင်း၊ ပြောင်းရွှေ့ခြင်းနှင့် ဖျက်ပစ်ခြင်း(Delete) အစရှိသည် လုပ်ဆောင်ချက်များကို Files ကလပ်စ်ကို အသုံးပြု၍ လုပ်ဆောင်နိုင်ပါသေးသည်။

အထူးသဖြင့် ကော်ပီကူးခြင်းသည် ယခင် ပံ့ပိုးထားခြင်း မရှိပါသဖြင့် Streams နှင့် Channel များကို အသုံးပြု၍ တကူးတက ရေးသားနေရပါသည်။ ထို့အပြင် ကော်ပီကူးခြင်းသည် အသုံးများပါသဖြင့် Nio2 တွင် ကော်ပီကူးခြင်းကို ပံ့ပိုးလာခြင်းသည် လွန်စွာမှ အသုံးဝင်လပေသည်။ ယခုတစ်ခေါက်တွင်လည်း ဆက်လက်၍ ဖိုင်နှင့် ဒိုင်အတ္တရီများကို အသုံးပြုပုံတို့ကို နမှုနာများရေး၍ ဆက်လက်လေ့လာသွားပါဦးမည်။


ကော်ပီကူးခြင်း


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

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;


public class FileCopy {

 public static void main(String[] args) {
  
  if(args.length != 2) {
   System.err.println("Please set 2 parameters");
   return;
  }
  
  try {
   FileSystem fs = FileSystems.getDefault();
   
   Path origin = fs.getPath(args[0]);
   Path toCopy = fs.getPath(args[1]);
   
   Files.copy(origin, toCopy);
  } catch (IOException e) {
   System.err.println("There is no file ["+args[0] +"]");
  }

 }
}



ရိုးရိုးကော်ပီကူးရုံဆိုပါက Files#copy မက်သတ်၏ ပဋ္ဌမပါရာမီတာတွင် ကူးလိုသည့် မှုရင်း ဖိုင်၏ Path အော့ဘဂျက်ကို ရေးသားပြီး၊ ဒုတိယ ပါရာမီတာတွင် ကူးလိုသည့် ဖိုင်၏ Path အော့ဘဂျက်ကို ရေးသားရပါမည်။

အထက်ပါ နမှုနာတွင်  ရေးသားထားသည့်အတိုင်း Files.copy(origin, toCopy); ဟု၊ origin သည် မှုလဖိုင်ဖြစ်ပြီး toCopy သည် ကူးမည့် ဖိုင်အသစ်ဖြစ်ပါသည်။ ဤကဲ့သို့ရေးသားရာတွင် origin သည် လက်ရှိ တည်ရှိခြင်းမရှိပါက NoSuchFileException ကို ဖြစ်ပွားစေမည် ဖြစ်ပြီး၊ toOrigin သည် လက်ရှိ တည်ရှိပြီး ဖြစ်ပါက FileAlreadyExitsException ကို ဖြစ်ပေါ်စေမည် ဖြစ်ပါသည်။

အကယ်၍ ရှိပြီးသားဖိုင် အပေါ်တွင် ထပ်ပြီး ရေးသားလိုပါက Files#copy မက်သတ်၏ တတိယ လုပ်ဆောင်ချက်တွင် java.nio.file.StandardCopyOption.REPLACE_EXISTING ကို သတ်မှတ် ရေးသားနိုင်ပါသည်။

StandardCopyOption သည် enum ပုံစံ ဖြစ်ပြီး၊ အောက်ပါ အချက်အလက်များကို ပိုင်ဆိုင်ပါသည်။

  • REPLACE_EXISTING
  • COPY_ATTRIBUTES
  • ATOMIC_MOVE
COPY_ATTRIBUTES ကို အသုံးပြုပါက၊ နောက်ဆုံးဆက်သွယ်သော အချိန် ကဲ့သို့သော ဖိုင်တစ်ခု၏ Meta data အချက်အလက်များကိုပါ ကော်ပီကူးနိုင်ပါသည်။ တဖန် ATOMIC_MOVE သည် ကော်ပီကူးရာတွင် အသုံးမပြုနိုင်ပဲ ထိုဖိုင်အား ရွှေ့ပြောင်းရာတွင် အသုံးပြုနိုင်ပါသည်။

StandardCopyOption ကဲ့သို့ပင် ယခင် အခန်းများတွင် ဖော်ပြပြီးဖြစ်သော LinkOption များကိုလည်း အသုံးပြုနိုင်ပါသည်။ 

သတိပြုရန် အချက်တစ်ခုမှာ ကော်ပီကူးရာတွင် Windows ဆိုပါက copy ကွန်မန်းကို၎င်း၊ Linux ၏ cp ကွန်မန်းကို၎င်း အသုံးပြုရာ၌၊ ဖိုင်တစ်ခုအား အခြားသော ဒိုင်အတ္တရီ တစ်ခုဆီသို့ လက်ရှိအမည်အတိုင်း ကော်ပီကူးလိုပါက ကော်ပီကူးမည့်ဖိုင်အသစ်နေရာတွင် ကူးပြီးသိမ်းစေလိုသည့် ဒိုင်အတ္တရီကို သာရေးသားလျှင် ရနိုင်ပေသည်။ တကူးတက ဖိုင်အမည် ရေးသားရန် မလိုအပ်ပေး။ အောက်ပါအတိုင်းဖြစ်၏။


သို့ရာတွင် Java ၏ Files.copy ကို အသုံးပြုရာ၌ ကူးလိုသည့် ဖိုင်၏ အမည် အပြည့်အစုံကို ရေးသားရန် လိုအပ်ပါသည်။ ရေးပြီးသား FileCopy.java ကို အသုံးပြု၍ စမ်းသပ်ကြည့်ပါမည်။


ကော်ပီကူးမည့်နေရာတွင် copydir သည် ရှိနှင့်ပြီးဖြစ်သောကြောင့် FileAlreadyExitsException ကို ဖြစ်ပေါ်စေပါသည်။ အောက်ပါအတိုင်း အမည်အပြည့်အစုံကို ရေးသားပါက ကူးနိုင်မည် ဖြစ်ပါသည်။




ရွှေ့ပြောင်းခြင်း


ဖိုင်များအား ကော်ပီကူးသကဲ့သို့ တစ်နေရာမှ တစ်နေရာဆီသို့ ပြောင်းရွှေ့ရာတွင်လည်း Files ကလပ်စ်ကို အသုံးပြုနိုင်ပါသည်။ ဖိုင်များအား ရွှေ့ပြောင်းရာတွင် Files#move မက်သတ်ကို အသုံးပြုနိုင်ပါသည်။

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

public class MoveSample {
 
 public static void main(String[] args) throws IOException {
  FileSystem fs = FileSystems.getDefault();
  Path origin = fs.getPath(args[0]);
  Path toMove = fs.getPath(args[1]);
  Files.move(origin, toMove, StandardCopyOption.ATOMIC_MOVE);
 }
}

ဖိုင်ဒါမှမဟုတ် ဒိုင်အတ္တရီ တစ်ခုအား ပြောင်းရွှေ့ရာတွင်၎င်း၊ အခြားအမည်တစ်ခုအဖြစ် ပြောင်းလည်း လိုသည့်အခါမျိုးတွင် Files#move လုပ်ဆောင်ချက်ကို အသုံးပြုနိုင်ပါသည်။ move လုပ်ဆောင်ချက်၏ ပဋ္ဌမ ပါရာမီတာနေရာတွင် မှုရင်းဖိုင်ကို ရေးရန်လိုအပ်ပြီး၊ ပြောင်းရွှေ့လိုသည့် ဖိုင်နေရာအား ဒုတိယ ပါရာမီတာနေရာတွင် ရေးသားရပါမည်။ တတိယ ပါရာမီတာအနေဖြင့် Varags ပုံစံ LinkOption နှင့် StandardCopyOption များကို အသုံးပြုနိုင်ပါသည်။ အထက်ပါ နမှုနာထဲတွင်မှု ATOMIC_MOVE ကို အသုံးပြုထားပါသည်။




ဖျက်ပစ် (Delete) ခြင်း


Java ၏ ဖိုင်အိုင်အို အင်တာဖေစ် အသစ်ဖြစ်သော nio2 တွင် ဖိုင်နှင့် ဒိုင်အတ္တရီများအား ဖျက်ပစ်ရာတွင် Files#delete နှင့် Files#deleteIfExists ကို အသုံးပြုနိုင်ပါသည်။ File#delete ကို အသုံးပြုရာတွင် လက်ရှိ ဖိုင်စစ္စတမ်အပေါ်တွင် ဖျက်လိုသည့်ဖိုင်သည် တည်ရှိနေခြင်းမရှိပါက NoSuchFileExitsException ကို ဖြစ်ပေါ်စေမည် ဖြစ်သည်။ Files#deleteIfExits ကို အသုံးပြုပါက ဖိုင်ရှိရှိ မရှိရှိ Exception ကို ဖြစ်ပေါ်စေမည် မဟုတ်ပေ။

File#deleteIfExits ကို အသုံးပြုရာတွင် ဖျက်လိုသည့် ဖိုင်အား ဖျက်ပစ်နိုင်ပါက true ကို ရရှိမည် ဖြစ်ပြီး၊ အကယ်၍ ဖိုင်မရှိပက၊ ဒါမှမဟုတ် ဖျက်ပစ်နိုင်ခြင်း မရှိပါက false ကို ပြန်ရမည် ဖြစ်သည်။ လက်တွေ့ရေးသားကြည့်ပါမည်။

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;

public class DeleteSample {

 public static void main(String[] args) throws IOException {
  FileSystem fs = FileSystems.getDefault();
  for(String s : args) {
   Path origin = fs.getPath(s);
   Files.delete(origin);
  }
 }
}



ယနေ့တွင် Java ၏ ဖိုင်စစ္စတမ် အင်တာဖေစ် အသစ်၏ အသုံးများမည်ဖြစ်သော Files ကလပ်စ်၏ လုပ်ဆောင်ချက်အချို့ကို ဖော်ပြခဲ့၏။ နောက်ရက်များတွင်လည်း ဆက်လက်၍ ဖော်ပြသွားပါဦးမည်။


ကိုးကား

http://itpro.nikkeibp.co.jp/article/COLUMN/20110830/367909/?ST=develop&mkjb&P=3
http://itpro.nikkeibp.co.jp/article/COLUMN/20110830/367909/?ST=develop&mkjt&P=4

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

No comments:

Post a Comment