`
touchinsert
  • 浏览: 1328709 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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:<directories and zip/jar files separated by ;>
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 <code>File</code> 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 <code>pathname</code> argument is <code>null</code>
*/
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<files.length;i++){
System.out.println(files[i]);
}
} catch (Exception e) {
e.printStackTrace();
}


}

}

分享到:
评论

相关推荐

    Java路径问题

    在Java编程中,路径问题是一个常见的挑战,尤其是在处理文件系统操作和类加载时。路径问题涉及到如何正确地指定和解析文件、目录以及类路径。本文将深入探讨Java中的路径问题,包括绝对路径、相对路径、类加载器路径...

    虚拟文件路径,轻松搞定某些软件对特殊文件路径不能识别问题

    实现虚拟文件路径的方法有很多种,如在Windows中使用`mklink`命令,或者在Linux/Unix系统中使用`ln -s`创建软链接。在编程语言中,如Python有`os.symlink`,Java有`java.nio.file.Files.createSymbolicLink`等函数来...

    java环境的搭建【jdk配置,tomcat,jsp虚拟路径,myeclipse部署】

    Java环境的搭建是每个Java开发者必须经历的步骤,它涵盖了JDK配置、Tomcat服务器的安装与使用、JSP虚拟路径的理解以及MyEclipse的部署等核心知识点。下面,我们将详细探讨这些内容。 首先,JDK(Java Development ...

    apache-tomcat-9.0.40傻瓜式的,安装配置好Java之后直接打开就可以.zip

    在Unix/Linux系统中,可以在bashrc或profile文件中添加相应的路径。 接着,我们来解析压缩包中的内容。"傻瓜式的,安装配置好Java之后直接打开就可以"这个文件名暗示了这个版本的Tomcat已经做了预配置,无需用户...

    java程序开发中路径的问题

    在Windows系统中,绝对路径通常以盘符(如C:)开始,而Linux/Unix系统则以正斜杠(/)开头。 **相对路径** 相对的是当前工作目录,它不包含完整的路径信息,而是基于当前目录来定位文件。在Java中,"."代表当前目录...

    AnnotationsDirectoryItem.rar_Linux/Unix编程_Unix_Linux_

    在IT行业中,Linux/Unix编程是开发者们常常涉足的领域,尤其对于系统级程序员和软件工程师来说,理解和掌握Unix/Linux操作系统的核心概念至关重要。本资源"AnnotationsDirectoryItem.rar"似乎提供了一个针对Linux v...

    tomcat7下载

    配置JDK环境包括设置`JAVA_HOME`环境变量,指向你的JDK安装路径,以及将`%JAVA_HOME%\bin`(Windows)或`$JAVA_HOME/bin`(Unix/Linux)添加到`PATH`环境变量中。这样,Tomcat才能在启动时找到Java运行时环境。 在...

    tomcat安装及配置教程.docx Tomcat的安装及配置教程

    根据您的需求选择相应的版本和压缩包格式(.tar.gz或.zip),通常情况下,.tar.gz格式适用于Unix/Linux系统,而.zip格式则更适合Windows系统。 #### 三、解压Tomcat压缩文件 下载完成后,需要将压缩文件解压到指定...

    2023Linux 52 道面试题及答案.docx

    1. 绝对文件路径:描述了在虚拟目录结构中该目录的确切位置,以虚拟目录跟目录开始,相当于目录全名。例如:/usr/local 2. 相对文件路径:允许用户执行一个基于当前位置的目标文件路径。例如:当前在/usr/locallocal...

    Linux 52 道面试题及答案.docx

    * 绝对文件路径:描述了在虚拟目录结构中该目录的确切位置,以虚拟目录跟目录开始,相当于目录全名。以正斜线(/)开始。 * 相对文件路径:允许用户执行一个基于当前位置的目标文件路径。 * 快捷方式:单点符(.)...

    nexus-3.19.1-01-unix

    对于“nexus-3.19.1-01-unix.tar.gz”,这是一个Unix/Linux平台下的归档文件,使用tar命令解压后即可得到可执行文件。 安装和配置Nexus 3.19.1-01的步骤大致如下: 1. **下载和解压**:将`nexus-3.19.1-01-unix....

    Java中关于package的总结.docx

    从技术实现的角度来看,`package`可以理解为一种虚拟文件系统,它允许我们将不同的`.java`文件和`.class`文件按照一定的层次结构组织起来,类似于Unix或Linux操作系统中的目录结构。 - **定义Package**:在Java...

    tomcat资源包

    此外,Tomcat还支持通过修改`conf/server.xml`配置文件来定制服务器的行为,例如更改端口号、添加虚拟主机、调整连接器参数等。`conf/catalina.properties`可以用来配置日志路径和其他全局属性。对于开发者来说,...

    java检测程序系统

    2. **内存监控**:监测物理内存和虚拟内存的使用,可能涉及操作系统的内存管理接口,例如在Linux下解析/proc/meminfo文件。 3. **网卡监控**:收集网络接口的发送和接收字节数,可能需要监听网络接口的统计信息,如...

    TomCat配置

    1. **启动Tomcat**: 可以通过`startup.bat`(Windows)或`startup.sh`(Unix/Linux)脚本启动Tomcat。 2. **停止Tomcat**: 使用`shutdown.bat`(Windows)或`shutdown.sh`(Unix/Linux)脚本。 **四、Tomcat主配置...

    tomcat7 64位的

    - `PATH`:将`%CATALINA_HOME%\bin`(Windows)或`$CATALINA_HOME/bin`(Unix/Linux)添加到系统路径,以便在命令行中直接运行Tomcat相关命令。 3. **启动与停止** - 使用`startup.bat`(Windows)或`./startup....

Global site tag (gtag.js) - Google Analytics