Java的文件与磁盘操作

Java的文件与磁盘操作(转载)


1 如何获得某一个目录下的文件列表?
1  File MyDir  =   new  File( " C:/Windows/. " ); 
2 
3  String[] FileNames  =  MyDir.list(); 
2 如何实现一个打开文件或者是存储文件对话框?
1  AWT: FileDialog类  +  FilenameFilter类 
2 
3  Swing: JFileChooser类  +  FileFilter类
其中,基于Swing的解决方案功能更加强大,界面也更加美观。



3 利用FileReader/FileOutputStream拷贝中文文件出错?



利用如下代码片断拷贝中文文件不会出错:
1  int  c; 
2 
3  while  ((c  =  MyFileReader.read())  !=   - 1
4 
5  MyFileWriter.write(c);
利用如下代码片断拷贝中文文件会导致文件内容错误:
1  int  c; 
2 
3  while  ((c  =  MyFileReader.read())  !=   - 1
4 
5  MyFileOutputStream.write(c);
造成这个问题的原因是:FileReader.read()返回一个int,其取值范围是

0 到65535,通常来说是两个字节的;FileWriter.write(int c)向文件写

入一个int,通常来说也是两个字节的,如果某个字符的高位字节为空,那

么其高位字节将被舍弃;FileOutputStream.write(int b)虽然接受一个

int作为参数,实际上只向文件写入一个字节,如果传递过来的参数是一个

双字节的汉字,其高位字节将被舍弃,造成文件内容错误。



建议:永远只使用InputStream/OutputStream进行IO操作。



利用如下代码片断拷贝中文文件不会出错:
1  int  c; 
2 
3  while  ((c  =  MyFileInputStream.read())  !=   - 1
4 
5  MyFileOutputStream.write(c);
4 如何显示和存储拉丁语言中的特殊字符



使用统一码Unicode可以显示和存储拉丁语言中的特殊字符。具体应用范例

如下:
 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();
同样,在读取文件的时候也需要将读到的内容转换成统一码。
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 如何利用文件进行数据存取



对于一般的科学计算应用程序,DataInputStream和DataOutputStream类通

常是最好的选择。这两个类提供了存取各种数据的方法。下面的范例演示了

构造DataInputStream和DataOutputStream的方法:
1  MyDataInputStream  =   new  DataInputStream( 
2 
3  new  FileInputStream(MyInputFile)); 
4 
5  MyDataOutputStream  =   new  DataOutputStream( 
6 
7  new  FileOutputStream(MyOutputFile)); 
利用ObjectInputStream和ObjectOutputStream同样可以进行数据存取,需

要注意的是这样做增加了硬盘的开销,因为进行对象序列化过程添加了一

些额外的信息。在利用ObjectInputStream和ObjectOutputStream进行通讯

的时候,虽然数据发收过程得到了大大简化,但是对带宽的要求也大大的

提高了。



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



a. 避免多次访问磁盘,例如一次读出n个字节就比每次读出1个字节的访问

效率要高很多。

b. 避免多次访问操作系统。

c. 避免多次调用文件存取方法。

d. 避免将字节和字符混淆处理,在Java语言中字节与字符的概念是不一样

的,在涉及到双字节字符的问题上更是容易出错。



7 如何获得可用的硬盘空间?



目前尚未发现有任何干净利落的纯Java方法能够解决这个问题。通常的解

决方案是直接访问操作系统获得这些信息。有一个被称为JConfig的类库提

供了一些方法可以获得磁盘和文件信息,但是可以肯定这个类库使用了JNI

方法。



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



如果你使用的是晕倒死系列操作系统,那么下面的方法也许能够获得正确

的结果。我之所以说也许,是因为我在多个晕倒死平台上作过实际测试,

在英文版的晕倒死上基本上都能够得到正确的结果,在中文版的晕倒死上

基本上都不能够获得正确的结果。
 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 
然后你需要做的是对得到的dir.txt文件进行分析。



如果你使用的是UNIX/Linux操作系统,你可以使用类似的方法来获得相关

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



8 我能够用Java来格式化我的硬盘或者是软盘么?



关于这个问题,想来在不久的将来仍然是不会有纯Java的解决方案了。如

果你一定要在你的Java应用程序里面格式化你的C盘的话,下面的这个方法

也许会有所帮助。当然,在你使用这个方法之前,请仔细备份好女朋友给你

的情书或者是记下和下一个网友约会的日期。



建立一个称为FormatDrive.bat的文件,该文件必须放在当前目录或者是系

统路径下,文件的内容如下:



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 怎么知道我究竟有几个可用的存储设备?



在UNIX/Linux下你通常没有必要关心这个问题,只要记住那个斜杠就可以了。

在晕倒死下硬盘可以有多个逻辑分区,可应用下面的方法找出来:
 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网站提供的部分内容,特此说

明。该网站是一个优秀的Java程序设计网站,值得各位朋友经常前去访问。

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

你可能感兴趣的:(Java的文件与磁盘操作)