Java 版 (精华区)

发信人: DreamWeaver (东方欲晓), 信区: Java
标  题: SMTH Java FAQ (3) 文件与磁盘操作
发信站: 哈工大紫丁香 (2002年07月31日09:46:35 星期三), 站内信件

SMTH Java FAQ (3) 文件与磁盘操作

qyjohn@SMTH


1 如何获得某一个目录下的文件列表?

  File MyDir = new File("C:/Windows/.");
  String[] FileNames = MyDir.list();

2 如何实现一个打开文件或者是存储文件对话框?

  AWT:    FileDialog类 + FilenameFilter类
  Swing:  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));

  利用ObjectInputStream和ObjectOutputStream同样可以进行数据存取,需
  要注意的是这样做增加了硬盘的开销,因为进行对象序列化过程添加了一
  些额外的信息。在利用ObjectInputStream和ObjectOutputStream进行通讯
  的时候,虽然数据发收过程得到了大大简化,但是对带宽的要求也大大的
  提高了。

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

  a. 避免多次访问磁盘,例如一次读出n个字节就比每次读出1个字节的访问
     效率要高很多。
  b. 避免多次访问操作系统。
  c. 避免多次调用文件存取方法。
  d. 避免将字节和字符混淆处理,在Java语言中字节与字符的概念是不一样
     的,在涉及到双字节字符的问题上更是容易出错。

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

  目前尚未发现有任何干净利落的纯Java方法能够解决这个问题。通常的解
  决方案是直接访问操作系统获得这些信息。有一个被称为JConfig的类库提
  供了一些方法可以获得磁盘和文件信息,但是可以肯定这个类库使用了JNI
  方法。

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

  如果你使用的是晕倒死系列操作系统,那么下面的方法也许能够获得正确
  的结果。我之所以说也许,是因为我在多个晕倒死平台上作过实际测试,
  在英文版的晕倒死上基本上都能够得到正确的结果,在中文版的晕倒死上
  基本上都不能够获得正确的结果。

  String osname = System.getProperty("os.name");
  String command = "";
  if (osname.indexOf("NT") > -1)
  command = "c:\\winnt\\System32\\cmd.exe";
  else if (osname.indexOf("Windows") > -1)
  command = "c:\\windows\\command.com";

  Process p = Runtime.getRuntime().exec(
              command + " /c dir > c:\\dir.txt");
  p.waitFor();

  然后你需要做的是对得到的dir.txt文件进行分析。

  如果你使用的是UNIX/Linux操作系统,你可以使用类似的方法来获得相关
  信息。建议使用的命令是df -k > dir.txt。

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

  关于这个问题,想来在不久的将来仍然是不会有纯Java的解决方案了。如
  果你一定要在你的Java应用程序里面格式化你的C盘的话,下面的这个方法
  也许会有所帮助。当然,在你使用这个方法之前,请仔细备份好女朋友给你
  的情书或者是记下和下一个网友约会的日期。

  建立一个称为FormatDrive.bat的文件,该文件必须放在当前目录或者是系
  统路径下,文件的内容如下:

  rundll32.exe shell32.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[] roots = File.listRoots();
      for (int i=0; i<roots.length; i++)
      {
            System.out.println(roots[i]);
      }
  }


  本FAQ参考并引用或者是改写了www.esus.com网站提供的部分内容,特此说
  明。该网站是一个优秀的Java程序设计网站,值得各位朋友经常前去访问。


--
 ("`-''-/").___..--''"`-._                          云与清风常拥有,
  `6_ 6  )   `-.  (     ).`-.__.`)                  冰雪知音世难求。
   (_Y_.)'  ._   )  `._ `. ``-..-                   击节纵歌相对笑,
  _..`--'_..-_/  /--'_.' ,'                         案上诗书杯中酒。
 (il),-''  (li),'  ((!.-'                                2000.12.31
___________________________________________________________________

--

你看到我的妮妮了吗?Q_Q          忘掉她,忘掉她就可以不必再忍受,忘掉她就不再有痛苦。忘掉她,忘掉
     你没有的东西,忘掉别人有的东西,忘掉你失去和以后不能得到的东西,忘掉
     仇恨,忘掉屈辱,忘掉爱情,象犀牛忘掉草原,象水鸟忘掉湖泊,象地狱里的
     人忘掉天堂,象截肢的人忘掉自己曾快步如飞,象落叶忘掉风,象公犀牛忘掉
     母犀牛。忘掉是一般人能做的唯一的事。但是我决定不忘掉她。

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.4]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.483毫秒