如何利用Java虚拟Unix/Linux的文件路径

原创 2007年09月28日 01:30:00
如何利用Java虚拟Unix/Linux的文件路径

大部分的java程序应用于Unix/Linux系统,而绝大部分的开发是在Windows下。虽然,java可以运行在anywhere, 但毕竟还有很多环境配置问题。

 

例如在UNIX下,你需要将某些配置文件的路径写入到另一个配置文件。 也许有很多局限,使你必须写入绝对路径。

 

在config.propertIEs里写入

logs = /logs/app/db/logs.properties

configs=/usr/WebSphere/AppServer/installedApps/appname/earname/warname/WEB-INF/properties/myconfig.properties

 

在开发阶段,你是否愿意在你的Windows开发机上建立上面这样的目录,或者逐个修改这个路径呢? 尤其在已有的系统下,为了开发新的功能,构筑开发环境时,这种配置文件路径的修改是相当花时间的。 并且,在Release时,你必须要使用Ant工具批量修改这些配置文件。 但我可以说,大部分项目只有给生产和系统集成测试环境才会配置Ant工具。而在低级别的测试环境下,你只能手动更改。 那么如何才能不修改任何文件可以再windows本地调试并运行呢?

 

一下,我给出一个小小方案。

 

1. 重写java.io.File类

 

先不要向我丢香蕉皮, 重写java.io.File并不一定要变动rt.jar文件。 jvm支持pretend,也就是伪装,我可以把我重写的java.io.File在运行期时代替rt.jar原有的java.io.File类。 想了解更详细的信息可以在 JAVA_HOME里找这个文件:[ JAVA_HOME]/bin/client/Xusage.txt

 

-Xbootclasspath/p:

prepend in front of bootstrap class path

 

在调试时,我就是要用这个参数。假设,我把重写的java.io.File类文件打包为filemap_1_4.jar。调试时,我就可以运行 java -Xbootclasspath/p:D:/MyProject/FileMap/filemap_1_4.jar -cp ...

 

这样,在我调用的所有类里,涉及到文件或文件系统功能时,都调用D:/MyProject/FileMap/filemap_1_4.jar 下面的java.io.File而不是rt.jar.

 

2. 功能实现

 

2.1 文件目录映射关系

为了增加一些灵活性, 我使用一个目录映射文件,来定义UNIX/LINUX文件路径和Windows文件路径的映射关系。

 

例如,filemap.properties

/usr/WebSphere/AppServer/installedApps/appname/earname/warname/=C:/MyProject/

/logs/app/db/=c:/MyProject/logs

 

当程序要读取/usr/WebSphere/AppServer/installedApps/appname/earname/warname/WEB-INF/properties/myconfig.properties

 

文件时,java.io.File会映射到C:/MyProject/WEB-INF/properties/myconfig.properties。

 

2.2 java.io.File更改

增加一个静态变量 private static HashMap filemaps=null;用来保存映射关系。

 

增加一个私有方法 initmaps初始化 filemaps

 

 

/**
* read filemap.propreties to initialize file map.
*/
private void initmaps(){
if(filemaps==null){
filemaps=new HashMap();
String filemap=System.getProperty("filemap"); 
//获得filemap.properties文件路径,需要在jvm运行时传入-Dfilemap=[filemap.properties全路径名],
不要试图使用 classloader.getResource(), 因为getResource里也会使用java.io.File,会产生jvm异常。

if(filemap==null || filemap=="")
return;
this.path = fs.normalize(filemap); 
//准备读取filemap.properties文件。因为使用FileInputStream时,
需要传入一个java.io.File对象,在这暂 时把this.path设为filemap.properties的路径。

this.prefixLength = fs.prefixLength(this.path);
Properties pro=new Properties();
try {

pro.load(new FileInputStream(this)); //读取filemap.properties.

Enumeration enumeration=pro.propertyNames();

while(enumeration.hasMoreElements()){
String sourcepath=(String)enumeration.nextElement(); 
String targetpath=pro.getProperty(sourcepath);
filemaps.put(sourcepath, targetpath); //保存到filemaps静态对象里。
}
} catch(FileNotFoundException e1){
return;
} catch(IOException e2){
return;
}
} 
}

 

 

我们还需要一个私有方法转换路径。

 

 

/**
* Get Virutal Path string
* @param name 原UNIX/Linux路径。
* @return 新windows路径。
*/
private String getVirtualPath(String name){
Iterator sources=filemaps.keySet().iterator(); 
while(sources.hasNext()){
String source=(String)sources.next();
if(name.startsWith(source)==true){ 
//当原路径包含filemaps里某一个source路径时,将原路径转换为新的target路径。
String target=(String)filemaps.get(source);
name=target name.substring(source.length());
}
} 
return name;
}

 

好了,现在准备在java.io.File里调用这两个方法。

 

 

/**
* Creates a new File instance by converting the given
* pathname string into an abstract pathname. If the given string is
* the empty string, then the result is the empty abstract pathname.
*
* @param pathname A pathname string
* @throws NullPointerException
* If the pathname argument is null
*/
public File(String pathname) {
//new function
initmaps();

if (pathname == null) {
throw new NullPointerException();
}
//new function
pathname=getVirtualPath(pathname);

this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}

public File(String parent, String child) {
//new function
initmaps();

if (child == null) {
throw new NullPointerException();
}
//new function
child=getVirtualPath(child);
parent=getVirtualPath(parent);

if (parent != null) {
if (parent.equals("")) {

this.path = fs.resolve(fs.getDefaultParent(),
fs.normalize(child));
} else {

this.path = fs.resolve(fs.normalize(parent),
fs.normalize(child));
}
} else {
this.path = fs.normalize(child);
}
this.prefixLength = fs.prefixLength(this.path);
}


public File(File parent, String child) {
//new function
initmaps();
child=getVirtualPath(child);

if (child == null) {
throw new NullPointerException();
}
if (parent != null) {
if (parent.path.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(),
fs.normalize(child));
} else {
String parentpath=getVirtualPath(parent.path); 
this.path = fs.resolve(parent.path,
fs.normalize(child));
}
} else {
this.path = fs.normalize(child);
}
this.prefixLength = fs.prefixLength(this.path);
}

 

2.3 打包

 

将java.io.File编译并打包成jar文件。 filemap_1_4.jar

 

2.4 设置调试环境。

 

在你需要调试环境里不需要把这个jar文件发入classpath,但需要在VM arguments里加上

 

-Xbootclasspath/p:C:/MyProject/filemap_1_4.jar -Dfilemap=C:/MyProject/filemap.properties

 

3.测试

编写测试程序

 

 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
FileReader filereader;
try {
//打印/usr/WebSphere/AppServer/InstallApp/Test.java
filereader = new FileReader(
"/usr/WebSphere/AppServer/InstallApp/Test.java");
BufferedReader bufferedreader = new BufferedReader(filereader);
String line=null;
while((line=bufferedreader.readLine())!=null)
System.out.println(line);
//遍历/usr/WebSphere/AppServer/InstallApp/Test.java所在的目录下所有文件,并打印文件名。

File fl=new File("/usr/WebSphere/AppServer/InstallApp/Test.java");
String path=fl.getParent();
String[] files=new File(path).list();
for(int i=0;i System.out.println(files);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
 

Java虚拟Unix/Linux文件路径

大部分的java程序应用于UNIX/Linux系统,而绝大部分的开发是在Windows下。虽然,java可以运行在anywhere, 但毕竟还有很多环境配置问题。例如在UNIX下,你需要将某些配置文件...
  • tyrone1979
  • tyrone1979
  • 2007年09月22日 10:19
  • 3789

Windows和Linux/Unix系统中文件路径使用总结

一、Microsoft  Windows     Windows系统中以反斜线’\‘表示文件路径,而在编程语言中反斜线'\'通常为转义字符。所以在Windows环境下的程序中,如涉及到文件路径一般需要...
  • qq302501035
  • qq302501035
  • 2015年03月13日 21:35
  • 2230

unix操作系统 关于虚拟内存映射

理解这个概念以前需要理解几个问题 1.      程序是以文件的形式存在于磁盘上的 2.      程序必须装入内存才能被运行 3.      磁盘是由一个个大小固定的块组成的,文件在磁盘上并不...
  • qsfool1987
  • qsfool1987
  • 2014年11月11日 20:27
  • 429

Unix路径“/”和“//”

在看《Unix环境高级编程》,作者编译一个检测目录中各种文件类型的数量和占比的小程序。使用编译后的文件,发现目录后面有“/”和没有“/”,结果是一样。同时,程序中没有对这两种情况做任何处理。于是,在程...
  • xiemengguilin
  • xiemengguilin
  • 2015年02月05日 21:47
  • 1532

【Unix编程】C/C++获取目录下文件或目录

在Unix/Linux系统中,要获取一个指定目录下所有的文件或文件夹,一般用dirent.h(POSIX标准定义的目录操作头文件)。 一、数据类型 在头文件中定义了两种主要的数据类型。 DIR:...
  • lisong694767315
  • lisong694767315
  • 2014年09月20日 17:12
  • 3019

Java开发中 unix/windows路径转换

/**  *   * @param path  * 
  • GOALSTAR
  • GOALSTAR
  • 2007年10月25日 20:15
  • 2890

简化文件的绝对路径 Simpify Path

在操作系统中,每个文件都有一个绝对路径。并且其最简化的形式是唯一的。对于Unix系列系统,绝对路径是从根路径/开始的,用正斜杠表示。一个句点.表示当前路径,两个句点..表示上一级路径。对于一个路径字符...
  • luckyjoy521
  • luckyjoy521
  • 2014年02月23日 14:37
  • 2251

关于在UNIX/Linux下文件系统的寻址结构

自:http://zone.it.sohu.com/forums/thread-300095-1-1.html 在HPUX或者任何一种UNIX系统,包括Linux系统,对于在磁盘中的文件的寻址结构都...
  • ryuali2010
  • ryuali2010
  • 2012年08月15日 11:09
  • 1263

Linux/Unix文件系统索引节点浅析

索引节点,其英文为 Inode,是 Index Node 的缩写。索引节点是整个 Linux 文件系统的基础。存储于文件系统上的任何文件都可以用索引节点来表示。举一个例子来说,假设有一个老图书馆里面有...
  • u011432636
  • u011432636
  • 2014年08月20日 18:01
  • 1072

linux与Unix是什么关系?有什么区别?

LINUX是从UNIX派生出的一个操作系统,所以命令和一些概念都很相似,如果初学,建议用REDHAT,SCO这些支持X86的系统,个人观点 学习操作系统课程,linux, u...
  • Guitaristr
  • Guitaristr
  • 2014年03月13日 14:55
  • 2008
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何利用Java虚拟Unix/Linux的文件路径
举报原因:
原因补充:

(最多只允许输入30个字)