計(jì)算機(jī)學(xué)習(xí)積累

          ----轉(zhuǎn)載有理,轉(zhuǎn)載是想研究,想研究才會(huì)看,看了才會(huì)有感想,轉(zhuǎn)載后我有時(shí)會(huì)寫一些自己的感受
          數(shù)據(jù)加載中……

          Java的文件與磁盤操作(轉(zhuǎn)載)



          1 如何獲得某一個(gè)目錄下的文件列表?
          1?File?MyDir?=?new?File("C:/Windows/." );?
          2?

          3?String[]?FileNames?=?MyDir.list();?
          2 如何實(shí)現(xiàn)一個(gè)打開文件或者是存儲(chǔ)文件對(duì)話框?
          1?AWT:?FileDialog類?+ ?FilenameFilter類?
          2?

          3?Swing:?JFileChooser類?+?FileFilter類
          其中,基于Swing的解決方案功能更加強(qiáng)大,界面也更加美觀。



          3 利用FileReader/FileOutputStream拷貝中文文件出錯(cuò)?



          利用如下代碼片斷拷貝中文文件不會(huì)出錯(cuò):
          1?int ?c;?
          2?

          3?while?((c?=?MyFileReader.read())?!=?-1 )?
          4?

          5?MyFileWriter.write(c);
          利用如下代碼片斷拷貝中文文件會(huì)導(dǎo)致文件內(nèi)容錯(cuò)誤:
          1?int ?c;?
          2?

          3?while?((c?=?MyFileReader.read())?!=?-1 )?
          4?

          5?MyFileOutputStream.write(c);
          造成這個(gè)問題的原因是:FileReader.read()返回一個(gè)int,其取值范圍是

          0 到65535,通常來說是兩個(gè)字節(jié)的;FileWriter.write(int c)向文件寫

          入一個(gè)int,通常來說也是兩個(gè)字節(jié)的,如果某個(gè)字符的高位字節(jié)為空,那

          么其高位字節(jié)將被舍棄;FileOutputStream.write(int b)雖然接受一個(gè)

          int作為參數(shù),實(shí)際上只向文件寫入一個(gè)字節(jié),如果傳遞過來的參數(shù)是一個(gè)

          雙字節(jié)的漢字,其高位字節(jié)將被舍棄,造成文件內(nèi)容錯(cuò)誤。



          建議:永遠(yuǎn)只使用InputStream/OutputStream進(jìn)行IO操作。



          利用如下代碼片斷拷貝中文文件不會(huì)出錯(cuò):
          1?int ?c;?
          2?

          3?while?((c?=?MyFileInputStream.read())?!=?-1 )?
          4?

          5?MyFileOutputStream.write(c);
          4 如何顯示和存儲(chǔ)拉丁語(yǔ)言中的特殊字符



          使用統(tǒng)一碼Unicode可以顯示和存儲(chǔ)拉丁語(yǔ)言中的特殊字符。具體應(yīng)用范例

          如下:
          ?1?MyJTextArea.append("\u00E1" );?
          ?2?

          ?3?MyJTextArea.append("\u00E2" );?
          ?4?

          ?5?MyJTextArea.append("\u00E3" );?
          ?6?

          ?7?MyJTextArea.append("\u00E4" );?
          ?8?

          ?9?MyJTextArea.append("\u00E5" );?
          10?

          11?
          12?
          13?MyFileOutputStream.write(MyJTextArea.getText().getBytes("UTF-8" ));?
          14?

          15?MyFileOutputStream.close();
          同樣,在讀取文件的時(shí)候也需要將讀到的內(nèi)容轉(zhuǎn)換成統(tǒng)一碼。
          1?byte[]?b?=?new?byte [MyFile.length()];?
          2?

          3?FileInputStream?in?=?new ?FileInputStream(MyFile);?
          4?

          5? in.read(b);?
          6?

          7?MyJTextArea.append(new?String(b,?"UTF-8"));
          5 如何利用文件進(jìn)行數(shù)據(jù)存取



          對(duì)于一般的科學(xué)計(jì)算應(yīng)用程序,DataInputStream和DataOutputStream類通

          常是最好的選擇。這兩個(gè)類提供了存取各種數(shù)據(jù)的方法。下面的范例演示了

          構(gòu)造DataInputStream和DataOutputStream的方法:
          1?MyDataInputStream?=?new ?DataInputStream(?
          2?

          3?new ?FileInputStream(MyInputFile));?
          4?

          5?MyDataOutputStream?=?new ?DataOutputStream(?
          6?

          7?new?FileOutputStream(MyOutputFile));?
          利用ObjectInputStream和ObjectOutputStream同樣可以進(jìn)行數(shù)據(jù)存取,需

          要注意的是這樣做增加了硬盤的開銷,因?yàn)檫M(jìn)行對(duì)象序列化過程添加了一

          些額外的信息。在利用ObjectInputStream和ObjectOutputStream進(jìn)行通訊

          的時(shí)候,雖然數(shù)據(jù)發(fā)收過程得到了大大簡(jiǎn)化,但是對(duì)帶寬的要求也大大的

          提高了。



          6 文件操作的基本原則是什么?



          a. 避免多次訪問磁盤,例如一次讀出n個(gè)字節(jié)就比每次讀出1個(gè)字節(jié)的訪問

          效率要高很多。

          b. 避免多次訪問操作系統(tǒng)。

          c. 避免多次調(diào)用文件存取方法。

          d. 避免將字節(jié)和字符混淆處理,在Java語(yǔ)言中字節(jié)與字符的概念是不一樣

          的,在涉及到雙字節(jié)字符的問題上更是容易出錯(cuò)。



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



          目前尚未發(fā)現(xiàn)有任何干凈利落的純Java方法能夠解決這個(gè)問題。通常的解

          決方案是直接訪問操作系統(tǒng)獲得這些信息。有一個(gè)被稱為JConfig的類庫(kù)提

          供了一些方法可以獲得磁盤和文件信息,但是可以肯定這個(gè)類庫(kù)使用了JNI

          方法。



          下載地址:http://www.tolstoy.com/samizdat/jconfig.html



          如果你使用的是暈倒死系列操作系統(tǒng),那么下面的方法也許能夠獲得正確

          的結(jié)果。我之所以說也許,是因?yàn)槲以诙鄠€(gè)暈倒死平臺(tái)上作過實(shí)際測(cè)試,

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

          基本上都不能夠獲得正確的結(jié)果。
          ?1?String?osname?=?System.getProperty("os.name" );?
          ?2?

          ?3?String?command?=?"" ;?
          ?4?

          ?5?if?(osname.indexOf("NT")?>?-1 )?
          ?6?

          ?7?command?=?"c:\\winnt\\System32\\cmd.exe" ;?
          ?8?

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

          11?command?=?"c:\\windows\\command.com" ;?
          12?

          13?
          14?
          15?Process?p?= ?Runtime.getRuntime().exec(?
          16?

          17?command?+?"?/c?dir?>?c:\\dir.txt" );?
          18?

          19? p.waitFor();?
          20?
          然后你需要做的是對(duì)得到的dir.txt文件進(jìn)行分析。



          如果你使用的是UNIX/Linux操作系統(tǒng),你可以使用類似的方法來獲得相關(guān)

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



          8 我能夠用Java來格式化我的硬盤或者是軟盤么?



          關(guān)于這個(gè)問題,想來在不久的將來仍然是不會(huì)有純Java的解決方案了。如

          果你一定要在你的Java應(yīng)用程序里面格式化你的C盤的話,下面的這個(gè)方法

          也許會(huì)有所幫助。當(dāng)然,在你使用這個(gè)方法之前,請(qǐng)仔細(xì)備份好女朋友給你

          的情書或者是記下和下一個(gè)網(wǎng)友約會(huì)的日期。



          建立一個(gè)稱為FormatDrive.bat的文件,該文件必須放在當(dāng)前目錄或者是系

          統(tǒng)路徑下,文件的內(nèi)容如下:



          rundll32.exe shell32.dll, SHFormatDrive



          格式化硬盤的方法可以這樣寫:
          ?1?public?void ?FormatDrive()?
          ?2?

          ?3? {?
          ?4?

          ?5?try ?
          ?6?

          ?7? {?
          ?8?

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

          11? p.waitfor();?
          12?

          13?}?catch ?(Exception?e)?
          14?

          15? {?
          16?

          17? System.out.println(e);?
          18?

          19? }?
          20?

          21? }?
          22?
          9 怎么知道我究竟有幾個(gè)可用的存儲(chǔ)設(shè)備?



          在UNIX/Linux下你通常沒有必要關(guān)心這個(gè)問題,只要記住那個(gè)斜杠就可以了。

          在暈倒死下硬盤可以有多個(gè)邏輯分區(qū),可應(yīng)用下面的方法找出來:
          ?1?public?void ?ListDisks()?
          ?2?

          ?3? {?
          ?4?

          ?5?File[]?roots?= ?File.listRoots();?
          ?6?

          ?7?for?(int?i=0 ;?i?
          ?8?
          {?
          ?9?

          10? System.out.println(roots[i]);?
          11?

          12? }?
          13?

          14? }?
          15?
          本FAQ參考并引用或者是改寫了www.esus.com網(wǎng)站提供的部分內(nèi)容,特此說

          明。該網(wǎng)站是一個(gè)優(yōu)秀的Java程序設(shè)計(jì)網(wǎng)站,值得各位朋友經(jīng)常前去訪問。

          摘自:
          http://www.cn-java.com/target/news.php?news_id=992

          posted on 2006-07-06 00:05 freebird 閱讀(604) 評(píng)論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 奉贤区| 青海省| 平江县| 宜君县| 灵宝市| 宁河县| 武汉市| 六盘水市| 宣化县| 桂平市| 威信县| 山西省| 和顺县| 东台市| 沐川县| 黄冈市| 江安县| 德阳市| 通许县| 黄浦区| 天津市| 班玛县| 静宁县| 即墨市| 和顺县| 珠海市| 沭阳县| 阿鲁科尔沁旗| 高青县| 日土县| 延吉市| 永川市| 历史| 土默特右旗| 鲁甸县| 专栏| 巴林左旗| 信宜市| 阳西县| 从江县| 额尔古纳市|