在web项目中处理路径相关的操作
在web项目中如何获得当前目录比较重要,服务部署在另一台机器上,那么如何获得当前的目录呢?
比如你想做一个下载功能,你必须获得当前的路径,才能够去建立一个downloads文件夹,再来就是下载,保存数据。
如果在配置文件中已经确定好了文件夹,那么可以考虑使用apache.hadoop.conf.Configuration类。
Hadoop配置文件采用XML格式,下面是Hadoop配置文件的一个例子:
1 <?xml version="1.0"?> 2 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 3 <configuration> 4 <property> 5 <name>io.sort.factor</name> 6 <value>10</value> 7 <description>The number of streams to merge at once while sorting 8 files. This determines the number of open file handles.</description> 9 </property> 10 <property> 11 <name>dfs.name.dir</name> 12 <value>${hadoop.tmp.dir}/dfs/name</value> 13 <description>Determines where on the local filesystem the DFS name 14 nodeshould store the name table(fsimage). ……</description> 15 </property> 16 <property> 17 <name>dfs.web.ugi</name> 18 <value>webuser,webgroup</value> 19 <final>true</final> 20 <description>The user account used by the web interface. 21 Syntax: USERNAME,GROUP1,GROUP2, ……</description> 22 </property> 23 </configuration>
Hadoop配置文件的根元素是configuration,一般只包含子元素property。每一个property元素就是一个配置 项,配置文件不支持分层或分级。每个配置项一般包括配置属性的名称name、值value和一个关于配置项的描述description;元素final 和Java中的关键字final类似,意味着这个配置项是“固定不变的”。final一般不出现,但在合并资源的时候,可以防止配置项的值被覆盖。
在 上面的示例文件中,配置项dfs.web.ugi的值是“webuser,webgroup”,它是一个final配置项;从description看, 这个配置项配置了Hadoop Web界面的用户账号,包括用户名和用户组信息。这些信息可以通过Configuration类提供的方法访问。
在 Configuration中,每个属性都是String类型的,但是值类型可能是以下多种类型,包括Java中的基本类型,如 boolean(getBoolean)、int(getInt)、long(getLong)、float(getFloat),也可以是其他类型,如 String(get)、java.io.File(getFile)、String数组(getStrings)等。以上面的配置文件为 例,getInt("io.sort.factor")将返回整数10;而getStrings("dfs.web.ugi")返回一个字符串数组,该数 组有两个元素,分别是webuser和webgroup。
合并资源指将多个配置文件合并,产生一个配置。如果有两个配置文件,也就是两个资源,如core-default.xml和core-site.xml,通过Configuration类的addResources()方法,把它们合并成一个配置。代码如下:(一般情况下,只会有一个配置文件。)
Configurationconf = new Configuration();
conf.addResource("core-default.xml");
conf.addResource("core-site.xml");
如 果这两个配置资源都包含了相同的配置项,而且前一个资源的配置项没有标记为final,那么,后面的配置将覆盖前面的配置。上面的例子中,core- site.xml中的配置将覆盖core-default.xml中的同名配置。如果在第一个资源(core-default.xml)中某配置项被标记 为final,那么,在加载第二个资源的时候,会有警告提示。
那么就已经将配置文件用程序读到了,只要配置文件中设置了相关的文件路径,那么根据property中的name就可以读到value。
Configuration类中有get方法,
public String get(String name, String defaultValue)
调用这个方法,首先会根据name去查,查不到那么返回defaultValue。
defaultValue在调用的时候,程序可以自己定义,这个方法比较好,一般会使用这个。比如:
conf.get("taskDir","./task");
获取的路径一般也用相对路径:./xxxxx/xxx
以上并没有解决获取绝对路径的问题,获取绝对路径,使用需要的方法:
System.getProperty("user.home")
System.getProperty("user.dir")
/**
获得当前类的完整路径。最后一句
*/
package org.outman.dms.server;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
/**
*
java.version Java 运行时环境版本
java.vendor Java 运行时环境供应商
java.vendor.url Java 供应商的 URL
java.vm.specification.version Java 虚拟机规范版本
java.vm.specification.vendor Java 虚拟机规范供应商
java.vm.specification.name Java 虚拟机规范名称
java.vm.version Java 虚拟机实现版本
java.vm.vendor Java 虚拟机实现供应商
java.vm.name Java 虚拟机实现名称
java.specification.version Java 运行时环境规范版本
java.specification.vendor Java 运行时环境规范供应商
java.specification.name Java 运行时环境规范名称
os.name 操作系统的名称
os.arch 操作系统的架构
os.version 操作系统的版本
file.separator 文件分隔符(在 UNIX 系统中是“ / ”)
path.separator 路径分隔符(在 UNIX 系统中是“ : ”)
line.separator 行分隔符(在 UNIX 系统中是“ /n ”)
java.home Java 安装目录
java.class.version Java 类格式版本号
java.class.path Java 类路径
java.library.path 加载库时搜索的路径列表
java.io.tmpdir 默认的临时文件路径
java.compiler 要使用的 JIT 编译器的名称
java.ext.dirs 一个或多个扩展目录的路径
user.name 用户的账户名称
user.home 用户的主目录
user.dir
*/
public class Test {
public static void main(String[] args) throws MalformedURLException, URISyntaxException {
System.out.println("java.home : "+System.getProperty("java.home"));
System.out.println("java.class.version : "+System.getProperty("java.class.version"));
System.out.println("java.class.path : "+System.getProperty("java.class.path"));
System.out.println("java.library.path : "+System.getProperty("java.library.path"));
System.out.println("java.io.tmpdir : "+System.getProperty("java.io.tmpdir"));
System.out.println("java.compiler : "+System.getProperty("java.compiler"));
System.out.println("java.ext.dirs : "+System.getProperty("java.ext.dirs"));
System.out.println("user.name : "+System.getProperty("user.name"));
System.out.println("user.home : "+System.getProperty("user.home"));
System.out.println("user.dir : "+System.getProperty("user.dir"));
System.out.println("===================");
System.out.println("package: "+Test.class.getPackage().getName());
System.out.println("package: "+Test.class.getPackage().toString());
System.out.println("=========================");
String packName = Test.class.getPackage().getName();
/*URL packurl = new URL(packName);
System.out.println(packurl.getPath());*/
URI packuri = new URI(packName);
System.out.println(packuri.getPath());
//System.out.println(packuri.toURL().getPath());
System.out.println(packName.replaceAll("//.", "/"));
System.out.println(System.getProperty("user.dir")+"/"+(Test.class.getPackage().getName()).replaceAll("//.", "/")+"/");
}
}
在这里做一个小总结,在日常的web项目中会在另一台机器上部署web服务,那么就有用户登录机器,在该用户目录下进行部署,那么可以通过
System.getProperty("user.home")
来获取用户的工作目录,在这之下,可以进行字符串的拼接(可能使用到:file.separator),执行mkdir类似的功能。注意mkdir()和mkdirs()的区别

浙公网安备 33010602011771号