SMTH Java FAQ (3) 檔案與磁碟操作(菜鳥必看) (轉)

worldblog發表於2007-12-11
SMTH Java FAQ (3) 檔案與磁碟操作(菜鳥必看) (轉)[@more@]

1 如何獲得某一個目錄下的列表?

 

  File MyDir = new File("C://.");

  String[] FileNames = MyDir.list();

 

2 如何實現一個開啟檔案或者是檔案對話方塊?

 

  AWT:  FileDialog類 + FilenameFilter類

  :  JFileChooser類 + FileFilter類

 

  其中,基於Swing的解決方案功能更加強大,介面也更加美觀。

 

3 利用FileReader/FileOutputStream複製中文檔案出錯?

 

  利用如下程式碼片斷複製中文檔案不會出錯:

 

  int c;

  while ((c = MyFileReader.read()) != -1)

  MyFileWriter.write(c);

 

  利用如下程式碼片斷複製中文檔案會導致檔案內容錯誤:

 

  int c;

  while ((c = MyFileReader.read()) != -1)

  MyFileOutputStream.write(c);

 

  造成這個問題的原因是:FileReader.read()返回一個int,其取值範圍是

  0 到65535,通常來說是兩個位元組的;FileWriter.write(int c)向檔案寫

  入一個int,通常來說也是兩個位元組的,如果某個字元的高位位元組為空,那

  麼其高位位元組將被捨棄;FileOutputStream.write(int b)雖然接受一個

  int作為引數,實際上只向檔案寫入一個位元組,如果傳遞過來的引數是一個

  雙位元組的漢字,其高位位元組將被捨棄,造成檔案內容錯誤。

 

  建議:永遠只使用InputStream/OutputStream進行IO操作。

 

  利用如下程式碼片斷複製中文檔案不會出錯:

 

  int c;

  while ((c = MyFileInputStream.read()) != -1)

  MyFileOutputStream.write(c);

 

4 如何顯示和儲存拉丁語言中的特殊字元

 

  使用統一碼Unicode可以顯示和儲存拉丁語言中的特殊字元。具體應用範例

  如下:

 

  MyJTextArea.append("u00E1");

  MyJTextArea.append("u00E2");

  MyJTextArea.append("u00E3");

  MyJTextArea.append("u00E4");

  MyJTextArea.append("u00E5");

 

  MyFileOutputStream.write(MyJTextArea.getText().getBytes("UTF-8"));

  MyFileOutputStream.close();

 

  同樣,在讀取檔案的時候也需要將讀到的內容轉換成統一碼。

 

  byte[] b = new byte[MyFile.length()];

  FileInputStream in = new FileInputStream(MyFile);

  in.read(b);

  MyJTextArea.append(new String(b, "UTF-8"));

 

5 如何利用檔案進行資料存取

 

  對於一般的科學計算應用,DataInputStream和DataOutputStream類通

  常是最好的選擇。這兩個類提供了存取各種資料的方法。下面的範例演示了

  構造DataInputStream和DataOutputStream的方法:

 

  MyDataInputStream  = new DataInputStream(

  new FileInputStream(MyInputFile));

  MyDataOutputStream = new DataOutputStream(

  new FileOutputStream(MyOutputFile));

 

  利用InputStream和ObjectOutputStream同樣可以進行資料存取,需

  要注意的是這樣做增加了的開銷,因為進行序列化過程新增了一

  些額外的資訊。在利用ObjectInputStream和ObjectOutputStream進行通訊

  的時候,雖然資料發收過程得到了大大簡化,但是對頻寬的要求也大大的

  提高了。

 

6 檔案操作的基本原則是什麼?

 

  a. 避免多次訪問,例如一次讀出n個位元組就比每次讀出1個位元組的訪問

  要高很多。

  b. 避免多次訪問操作。

  c. 避免多次檔案存取方法。

  d. 避免將位元組和字元混淆處理,在語言中位元組與字元的概念是不一樣

  的,在涉及到雙位元組字元的問題上更是容易出錯。

 

7 如何獲得可用的硬碟空間?

 

  目前尚未發現有任何干淨利落的純Java方法能夠解決這個問題。通常的解

  決方案是直接訪問獲得這些資訊。有一個被稱為JConfig的類庫提

  供了一些方法可以獲得磁碟和檔案資訊,但是可以肯定這個類庫使用了JNI

  方法。

 

  地址:

 

  如果你使用的是暈倒死系列作業系統,那麼下面的方法也許能夠獲得正確

  的結果。我之所以說也許,是因為我在多個暈倒死平臺上作過實際測試,

  在英文版的暈倒死上基本上都能夠得到正確的結果,在中文版的暈倒死上

  基本上都不能夠獲得正確的結果。

 

  String osname = System.getProperty("os.name");

  String command = "";

  if (osname.indexOf("NT") > -1)

  command = "c:winntSystem32cmd.exe";

  else if (osname.indexOf("Windows") > -1)

  command = "c:windowscommand.com";

 

  Process p = Runtime.getRuntime().exec(

  command + " /c dir > c:dir.txt");

  p.waitFor();

 

  然後你需要做的是對得到的dir.txt檔案進行分析。

 

  如果你使用的是/作業系統,你可以使用類似的方法來獲得相關

  資訊。建議使用的命令是df -k > dir.txt。

 

8 我能夠用Java來格式化我的硬碟或者是麼?

 

  關於這個問題,想來在不久的將來仍然是不會有純Java的解決方案了。如

  果你一定要在你的Java應用程式裡面格式化你的C盤的話,下面的這個方法

  也許會有所幫助。當然,在你使用這個方法之前,請仔細好女朋友給你

  的情書或者是記下和下一個網友約會的日期。

 

  建立一個稱為FormatDrive.bat的檔案,該檔案必須放在當前目錄或者是系

  統路徑下,檔案的內容如下:

 

  rundll32.exe 32.dll, SHFormatDrive

 

  格式化硬碟的方法可以這樣寫:

 

  public void FormatDrive()

  {

  try

  {

  Process p = Runtime.getRuntime().exec("FormatDrive.bat");

  p.waitfor();

  } catch (Exception e)

  {

  System.out.println(e);

  }

  }

 

9 怎麼知道我究竟有幾個可用的儲存裝置?

 

  在UNIX/Linux下你通常沒有必要關心這個問題,只要記住那個斜槓就可以了。

  在暈倒死下硬碟可以有多個邏輯分割槽,可應用下面的方法找出來:

 

  public void ListDisks()

  {

  File[] s = File.listRoots();

  for (int i=0; i

  {

  System.out.println(roots[i]);

  }

  }

 

 

  本FAQ參考並引用或者是改寫了網站提供的部分內容,特此說

  明。該網站是一個優秀的Java網站,值得各位朋友經常前去訪問。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991170/,如需轉載,請註明出處,否則將追究法律責任。

相關文章