首页 > 学院 > 开发设计 > 正文

文件名到URL的转换

2019-11-18 13:28:06
字体:
来源:转载
供稿:网友

  主题:
  * Pathnames to URLs
  * Using Vector in the Collection Framework
  * Reading/Writing Unicode Using I/O Stream Encodings
  
  CONVERTING PATHNAMES TO URLS
  
  File.toURL 方法是 java(tm) 2 Platform 的新特性, 可以用来将 pathname
  转换为URL格式.
  
  简单示例如下:
  
  import java.io.*;
  import java.net.*;
  
  public class url {
  public static void main(String args[])
  {
  if (args.length != 1) {
  System.err.PRintln("missing filename");
  System.exit(1);
  }
  File f = new File(args[0]);
  try {
  URL u = f.toURL();
  System.out.println(u);
  }
  catch (MalformedURLException e) {
  System.err.println(e);
  }
  }
  }
  
  For input of:
  
  $ java url paper.txt (current Directory is t:/tmp)
  
  output is:
  
  file:/T:/tmp/paper.txt
  
  得到的URL可以用来指示Netscape或者IE来察看本地的文件.
  
  这个方法时的应用程序可以将本地文件与基于Web的资源一视同仁的编程.
  
  USING VECTOR IN THE COLLECTION FRAMEWORK
  
  Collections 是 Java 2 Platform 的新特性, 用于组织和操作大量的数据元素.
  再如, ArrayList 可以作为 Vector 的替代者, HashMap 和 Hashtable 极为相像.
  
  像 Vector 这样的原先使用的类依然可以使用, 但是用新的代用品更为优秀.
  如何在两者之间转化成为了一个问题. 你可能在应用程序中想把 Vector 对象
  转换为 ArrayList . 如下示例说明了之一转换过程:
  
  import java.util.*;
  
  public class convert {
  public static void process(ArrayList al)
  {
  for (int i = 0; i < al.size(); i++)
  System.out.println(al.get(i));
  }
  
  public static void main(String args[])
  {
  Vector vec = new Vector();
  
  vec.addElement("123");
  vec.addElement(new Integer(456));
  vec.addElement(new Double(789));
  
  process(new ArrayList(vec));
  }
  }
  
  首先生成一个 Vector 对象并加入若干个数据元素. 然后调用 process 方法,
  并将一个 ArrayList 作为参数, 这个 ArrayList 对象是通过带有一个 Vector
  对象的参数的构造函数生成的. 更准确的说, 在这里, ArrayList 的构造函数
  所需的参数是从 "Collection" 接口实现的, Vector 的上两层基类
  java.util.AbstractCollection 正是实现的 Collection 接口, 同样 ArrayList
  对象也可以用同样的方法从构造函数中获得.
  
  READING/WRITING UNICODE USING I/O STREAM ENCODINGS
  
  与常用的其他语言不同 Java 使用双字节的 Unicode 字符集. 这样做带来的问题是:
  Java的字符集是如何在磁盘文件上存储的, 并且 Java 如何使用现有的大量 ASCII
  格式的数据?
  
  早期的 JDK(tm) , 比如 1.0.2 版本, 中这个问题没有得到解决. 例如:
  DataInputStream.readLine 方法用于读取整行的输入, 但他无法正确的将字节转化为
  字符, 因此已被废弃. 在 Unicode 得到广泛的使用前, 这个问题仍然是重要的.
  
  解决问题之道是使用 Reader 和 Writer 这一对 I/O 类. 他们是基于字节流的
  (如同FileInputStream), 并且实现字符, 字节的双向转换.
  
  下面的程序可以得到系统的缺省转换格式:
  
  public class encode {
  public static void main(String args[])
  {
  String p = System.getProperty("file.encoding");
  System.out.println(p);
  }
  }
  
  在我的机器和 Java 2 软件上, 输出为 "GBK", 这个格式为:
  
  GBK, Simplified Chinese
  
  对于 encodings 的表格可以从如下获得:
  
  http://java.sun.com/prodUCts/jdk/1.1/intl/Html/intlspec.doc7.html
  
  假如你希望直接指定转换方式, 下面的程序就是范例, 他将Unicode字母表中的所有小写字母写入文件。
  在这些字母中, 有一些的高字节是非零的(就是那些大于'/u00ff'的字母),因此正确的转化十分重要。
  这里使用的方式为 UTF-8, 他能够将ASCII字符转换为单字节字符,而其他字符仍然保持两到三个字节。
  
  import java.io.*;
  
  public class enc1 {
  
  public static void main(String args[]) {
  try {
  FileOutputStream fos = new FileOutputStream("out");
  OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF8");
  for (int c = '/u0000'; c <= '/uffff'; c++) {
  if (!Character.isLowerCase((char)c))
  continue;
  osw.write(c);
  }
  osw.close();
  } catch (IOException e) {
  System.err.println(e);
  }
  }
  }
  
  相反的转换过程如下;
  
  import java.io.*;
  
  public class enc2 {
  
  public static void main(String args[]) {
  try {
  FileInputStream fis = new FileInputStream("out");
  InputStreamReader isr = new InputStreamReader(fis, "UTF8");
  for (int c = '/u0000'; c <= '/uffff'; c++) {
  if (!Character.isLowerCase((char)c))
  continue;
  int ch = isr.read();
  if (c != ch)
  System.err.println("error");
  }
  isr.close();
  } catch (IOException e) {
  System.err.println(e);
  }
  }
  }
  
  InputStreamReader 和 OutputStreamWriter 是用于字节流域字符流进行相互转化的类。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表