`
收藏列表
标题 标签 来源
uri和url的定义及关系
1.什么是URI
  Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过通用资源标志符(Universal Resource Identifier, 简称"URI")进行定位。
  URI一般由三部分组成:
访问资源的命名机制。
存放资源的主机名。
资源自身的名称,由路径表示。
  考虑下面的URI,它表示了当前的HTML 4.0规范:
  http://soft.webjx.com/lesson/148/2623648.shtml
  这个URI是这样的:这是一个可通过HTTP协议访问的资源,位于主
  机soft.webjx.com上,通过路径“/lesson/148/”访问。在HTML文档中其它资源包括"mailto"(收发email)和"ftp"(FTP访问)。
  这是URI的另一个例子,指向一个用户的邮箱:
  <A href=mailto:web@webjx.com>写给站长</A>
  注:大多数读者可能熟悉"URL",而不是URI。URL是RUI命名机制的一个子集。
  片段标志符
  有的URI指向一个资源的内部。 这种URI以"#"结束,并跟着一个anchor标志
  符(称为片段标志符)。例如,下面是一个指向section_2的URI:
  http://somesite.com/html/top.htm#section_2
  相对URI
  相对URI 不包含任何命名规范信息。它的路径通常指同一台机器上的资源。相
  对URI可能含有相对路径(如,“..”表示上一层路径),还可能包含片段标志符。
  为了说明相对URI,假设我们有一个基本的URI http://www.acme.com/support/intro.htm
  下面的链接中使用了相对URI:
  <A href="104/2627604.shtml">网页陶吧</A>
  它扩展成完全的URI就是 "http://homepage.webjx.com/104/2627604.shtml"。
  下面是一个图像的相对URI:
  <IMG src="http://www.webjx.com/htmldata/TLimages/img/head/logo.gif" alt="logo">
  它扩展成完全的URI就是 "http://www.webjx.com/TLimages/img/head/logo.gif"。
  在HTML中,URI被用来:
链接到另一个文档或资源(参看A和LINK元素)。
链接到一个外部样式表或脚本(参看LINK和SCRIPT元素)。
在页内包含图像、对象或applet(参看IMAG、OBJECT、APPLET和INPUT元素)。
建立图像映射(参看MAP和AREA元素)。
提交一个表单(参看FORM)。
建立一个框架文档(参看FRAME和IFRAME元素)。
引用一个外部参考(参看Q、BLOCKQUOTE, INS和DEL元素)。
指向一个描述文档的metadata(参看HEAD元素)。
  2.什么是URL:
  URL是Uniform Resource Location的缩写,译为“统一资源定位符”。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
  URL的格式
  URL的格式由下列三部分组成:
第一部分是协议(或称为服务方式);
第二部分是存有该资源的主机IP地址(有时也包括端口号);
第三部分是主机资源的具体地址。,如目录和文件名等。
  第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。
  URL示例
  文件的URL:
  用URL表示文件时,服务器方式用file表示,后面要有主机IP地址、文件的存取路径(即目录)和文件名等信息。有时可以省略目录和文件名,但“/”符号不能省略。
  例一:file://ftp.webjx.com/soft/file/robots.txt
  代表存放主机ftp.webjx.com上的soft/file/目录下的一个文件,文件名是robots.txt。
  例二:file://ftp.webjx.com/pub
  代表主机ftp.webjx.com上的目录/pub。
  例三:file://ftp.webjx.com/
  代表主机ftp.webjx.com上的根目录。
  Gopher的URL:
  Gopher服务器有可能使用特殊的端口,在这种情况下,主机IP地址与端口之间要用“:隔开。
  例一:gopher://gopher.webjx.com/
  表示主机gopher.webjx.com上的gopher服务器。
  例二:gopher://gopher.webjx.com:1234
  表示主机gopher.webjx.com上的gopher服务器,在端口1234上。
  网络新闻的URL:
  利用URL表示网络新闻组时,如果是usenet的话只要指定出新闻组的名字即可。
  例如:news:rec.gardening
  表示usenet上的rec.gardening新闻组(园艺)。
  HTTP的 URL:
  使用超级文本传输协议HTTP,提供超级文本信息服务的资源。
  例一:http://homepage.webjx.com/175/2603675.shtml
  其计算机域名为homepage.webjx.com。超级文本文件(文件类型为.shtml)是在目录/175下的2603675.shtml。这是天极网的一台计算机。
关于Java对相对目录的文件读写和调用方法的一些总结
关于Java对相对目录的文件读写和调用方法的一些总结

首先要讲Java路径

Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种:

1.本地系统的绝对路径:

如:  windows: C:\abc\ projectName\bin\def. properties

           Linux:  /us/home/name/projectName/bin/def.properties

Java.io包中的类,需要使用这种形式的参数。但是,它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。因此,通过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。

 

2.URI形式的绝对资源路径

如:file:/C:/abc/def.properties

URL是URI的特例。URL的前缀/协议,必须是Java熟悉的。URL可以打开资源,而URI则不行。URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可!

 

3.相对于classpath的相对路径

如:相对于file:/C:/abc/projectName/bin/def. properties/ 这个路径的相对路径。其中,bin是本项目的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。还要知道src是java文件的目录,一般的IDE会将src里面的文件都编译放到指定的目录,默认就是项目的bin目录下

 

4.相对于当前用户目录的相对路径

就是相对于System.getProperty("user.dir")返回的路径。

对于一般项目,这是项目的根路径。对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统一的规范!所以,绝对不要使用"相对于当前用户目录的相对路径"。然而默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!

 

然后获取文件路径

说完了路径问题现在就要到了使用java类操作自己项目下的文件了进行操作,以properties文件为例,要学会变通。

那么我们现在来看一下可以使用那些类来获取到我们.java文件 ,或者叫 .class文件的目录了

现在你可以想象,我现在在哪个这个java类里面的代码,那我可以使用IO流把文件读取出来,那么就是利用我现在所在的这个类调用JDK里面的方法,来找出相对于我这个类的文件地址,它是这个类的同一个目录还是在项目的某个位置,如果不是相对的话,那么你就必须每次都需要修改代码来确定文件的位置,这是不明智的选择,所以还是利用相对路径来找到相对应的文件 :这里我要用到这3个类:

java.lang.System

java.lang.ClassLoader

java.lang.Class

 

1.      java.lang.System

方法: public static String getProperty(String key)

例如:System.getProperty("user.dir");

上面方法在JSE环境(JDK6.0_23)下使用运行结果是项目的文件夹的绝对路径;在web系统中就不能确定,好像网上说每个说法,建议少用,因为下面 的更好用。

 

2.      java.lang.ClassLoader

方法1 :public URL getResource(String name)

查询JDK可以知道ClassLoader使用的是 ClassLoader中的URL findResource(String name)方法来获得当前类.class的classpath的,所以要注意的就是传只name的时候你输入的是的路径是相对于classpath的,即:你的类才packet com下,你写name="def.properties"时候,ClassLoader会找classpath下的def.properties文件 ,而不会去找自己packet下的 com/def.properties文件,如果你想用ClassLoader来读取com/def.properties文件,那么你的name应该是name="com/def.properties",而不是name="/com/def.properties",如果写成name="/com/def.properties",那么将会错误,这个地方要注意的,为什么就要自己看文档了,我也有点糊涂,但你说为什么有些地方写成"/com/def.properties",那是因为调用的是ClassLoader中的public static URL getSystemResource(String name),这个下面会讲到,如果还是要问这个不行,那你可以尝试两个方法ClassLoader().getResource("/")和class.getResource("/"),前面的为空值,后面的就是classpath了,更多的还是自己去尝试。

讲了ClassLoader获取路径问题那么就该讲如果新建ClassLoader,

1.你可以直接使用ClassLoader,即ClassLoader.getResource("");

2.可以用当前的Class类来获得Test.class.getClassLoader().getResource("");Test就是当前的类

3.可以当前线程: Thread.currentThread().getContextClassLoader().getResource("")

上面3种方法都是获得classpath目录,想指定文件直接相对与classpath来进行修改字符串,注意上面提到的路径问题

方法 2:public InputStream getResourceAsStream(String name)

路径解释和获得方法都一样,但是返回值是一个InputStream这个在文件操作中比较常用

 

3.      java.lang.Class

 

方法1 :public URL getResource(String name)

这里主要解释的就是 Class虽然都是使用ClassLoader实现但是使用的方法不一样,查看JDK文档可以发现Class使用的是ClassLoader.getSystemResource(java.lang.String)方法实现,这就是Class类中传递String name的值存在差异了Class的getResource方法的name字符串如果如果以"/"起始那么就是代表classpath目录,如果没有"/"标志开头,那么就是相对于我当前这个类目录来和字符串拼接,这就是差别。

但是发现,如果你直接调用ClassLoader.getSystemResource(java.lang.String),也不能使用以"/"的标志,可能是 加载器和类的不同把吧,这个也是要注意的。

class的获取应该不用我说了吧。

 

方法 2:public InputStream getResourceAsStream(String name)

这个方法和上面的差不多,我也不多说了。

 

 

总结一下,文件相对路径的读取应该就这么多了,文件流都出来了,还有什么是不能解决的呢,如何对properties的读取这个就不教了,还是你们自己上网找资料吧。

上面所讲的JSE文件读取,到了JEE,WEB目录下文件上传,下载对文件操作读取还没讲到,到时后再上网差一下资料,总结一些和大家分享吧。

文章写的不好还希望各位见谅,有错的提醒我,让我也少走弯路。

 

《备注:个人参考了很多网上资料,那个是原版就不知道了,所以没有出处》
System.getProperty("user.dir")不同的系统下,路径不同,关于路径的研究
    String tomcatPath = System.getProperty("user.dir");  

        out.print("tomcatPath:" + tomcatPath + "<br>");  

        String filepath = "";  

        if (tomcatPath.contains("//")) {  

            filepath = tomcatPath.replace("//bin", "//webapps//CDNManageSystem//") + "speed.txt";  

        } else {  

            filepath = tomcatPath.replace("/bin", "/webapps/CDNManageSystem/") + "speed.txt";  

        }  

        URL url = Path.class.getClassLoader().getResource("/a.properties");  

        String path = URLDecoder.decode(url.getPath(), "utf-8");  

        out.print("path:" + path + "<br>");  

        out.print("filepath:" + filepath + "<br>");  

如上代码两个linux下结果:

tomcatPath:/home/app_admin/apache-tomcat-6.0.18/logs
path:/home/app_admin/apache-tomcat-6.0.18/webapps/pathtest/WEB-INF/classes/a.properties
filepath:/home/app_admin/apache-tomcat-6.0.18/logsspeed.txt

 

 

tomcatPath:/home/liuhy/apache-tomcat-6.0.29/bin
path:/home/liuhy/apache-tomcat-6.0.29/webapps/pathtest/WEB-INF/classes/a.properties
filepath:/home/liuhy/apache-tomcat-6.0.29/webapps/CDNManageSystem/speed.txt

 

 

windows下的结果:

tomcatPath:C:/Tomcat6.0/bin
path:/C:/Tomcat6.0/webapps/pathtest/WEB-INF/classes/a.properties
filepath:C:/Tomcat6.0/webapps/CDNManageSystem/speed.txt

 

总结下:

user.dir获得的路径:在哪执行的java命令,就是哪。可是第一个系统怎么会在logs下????

下面两个在bin目录下很正常。在logs下,这就有点说不过去了

如果从java类中获得path还是用getResource比较靠谱



资料二:
1.获取所有并显示:

Java代码  

Properties p = System.getProperties();  

p.list(System.out);  

结果:

Java代码  

-- listing properties --  

java.runtime.name=Java(TM) SE Runtime Environment  

sun.boot.library.path=C:\Program Files\Java\jdk1.6.0_22\jre...  

java.vm.version=17.1-b03  

java.vm.vendor=Sun Microsystems Inc.  

java.vendor.url=http://java.sun.com/  

path.separator=;  

java.vm.name=Java HotSpot(TM) Client VM  

file.encoding.pkg=sun.io  

user.country=CN  

sun.java.launcher=SUN_STANDARD  

sun.os.patch.level=Service Pack 3  

java.vm.specification.name=Java Virtual Machine Specification  

user.dir=D:\workspace\Test2  

java.runtime.version=1.6.0_22-b04  

java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment  

java.endorsed.dirs=C:\Program Files\Java\jdk1.6.0_22\jre...  

os.arch=x86  

java.io.tmpdir=C:\DOCUME~1\jeperc\LOCALS~1\Temp\  

line.separator=  

  

java.vm.specification.vendor=Sun Microsystems Inc.  

user.variant=  

os.name=Windows XP  

sun.jnu.encoding=GBK  

java.library.path=C:\Program Files\Java\jdk1.6.0_22\bin...  

java.specification.name=Java Platform API Specification  

java.class.version=50.0  

sun.management.compiler=HotSpot Client Compiler  

os.version=5.1  

user.home=C:\Documents and Settings\jeperc  

user.timezone=  

java.awt.printerjob=sun.awt.windows.WPrinterJob  

file.encoding=utf-8  

java.specification.version=1.6  

user.name=jeperc  

java.class.path=D:\workspace\Test2\bin  

java.vm.specification.version=1.0  

sun.arch.data.model=32  

java.home=C:\Program Files\Java\jdk1.6.0_22\jre  

java.specification.vendor=Sun Microsystems Inc.  

user.language=zh  

awt.toolkit=sun.awt.windows.WToolkit  

java.vm.info=mixed mode  

java.version=1.6.0_22  

java.ext.dirs=C:\Program Files\Java\jdk1.6.0_22\jre...  

sun.boot.class.path=C:\Program Files\Java\jre6\lib\resour...  

java.vendor=Sun Microsystems Inc.  

file.separator=\  

java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...  

sun.cpu.endian=little  

sun.io.unicode.encoding=UnicodeLittle  

sun.desktop=windows  

sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+m...  

 

 获取单个:

Java代码  

System.out.println("user_dir:" + System.getProperty("user.dir"));   

java.version

Java 运行时环境版本

 

java.vendor

Java 运行时环境供应商

 

java.vendor.url

Java 供应商的 URL

 

java.home

Java 安装目录

 

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 运行时环境规范名称

 

java.class.version

Java 类格式版本号

 

java.class.path

Java 类路径

 

java.library.path

加载库时搜索的路径列表

 

java.io.tmpdir

默认的临时文件路径

 

java.compiler

要使用的 JIT 编译器的名称

 

java.ext.dirs

一个或多个扩展目录的路径

 

os.name

操作系统的名称

 

os.arch

操作系统的架构

 

os.version

操作系统的版本

 

file.separator

文件分隔符(在 UNIX 系统中是“/”)

 

path.separator

路径分隔符(在 UNIX 系统中是“:”)

 

line.separator

行分隔符(在 UNIX 系统中是“/n”)

 

user.name

用户的账户名称

 

user.home

用户的主目录

 

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 = newURL(packName);

               System.out.println(packurl.getPath());*/

                URI packuri = newURI(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("//.","/")+"/");

       }

}

System.getProperty("user.dir")  当前工程路径,因为所有在java.io中的类都是将相对路径名解释为起始于用户的当前工作目录,所以应该清楚当前的目录。

可以通过调用System.getProperty("user.dir") 来获得。
(Test.class.getPackage().getName()).replaceAll("//.","/")   当前包路径。
HTML解析JAVASCRIPT单引号和双引号区别
在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下: 
<input value="Test" type="button" onclick="alert(""OK"");" /> 
IE提示出错后,再漫不经心地改为: 
<input value="Test" type="button" onclick="alert(\"OK\");" /> 
结果还是出错。 
这时,我就想不通了,虽然我知道最直接的解决方法是写成这样: 
<input value="" type="button" onclick="alert('OK');" /> 
但为什么javascript中的转义字符\没有效果了呢? 

后来找到一段正常的代码: 
<input value="Test" type="button" onclick="alert("OK");" /> 
这时才理解,原来这时,还是归于HTML的管辖范围,所以转义字符应该使用HTML的,而不是javascript的。两个双引号的做法是 vbScript的,\"这种做法则是javascript的,而HTML的,则是用",此外还可以使用:"、'。 

下面列出各种表达方法:

XML/HTML代码
<html>    
<body>    
<input value="外双引号内双引号-错误" type="button" onclick="alert("OK");" /><br />    
<input value="外单引号内单引号-错误" type="button" onclick='alert('OK');' /><br />    
<input value="两个双引号-错误" type="button" onclick="alert(""OK"");" /><br />    
<input value="两个单引号-错误" type="button" onclick="alert(''OK'');" /><br />    
<input value="\+双引号-错误" type="button" onclick="alert(\"OK\");" /><br />    
<input value="\+单引号-错误" type="button" onclick="alert(\'OK\');" /><br />    
<input value="外双引号内单引号-OK" type="button" onclick="alert('OK');" /><br />    
<input value="外单引号内双引号-OK" type="button" onclick='alert("OK");' /><br />    
<input value="外部不使用引号-OK" type="button" onclick=alert('OK');alert("OK"); /><br />    
<input value="HTML转义字符"(& # 3 4 ;)-OK" type="button" onclick="alert("OK");" /><br />    
<input value="HTML转义字符'(& # 3 9 ;)-OK" type="button" onclick="alert('OK');" /><br />    
<input value="HTML转义字符"(& # x 2 2 ;)-OK" type="button" onclick="alert('OK');" /><br />    
<input value="HTML转义字符'(& # x 2 7 ;)-OK" type="button" onclick="alert('OK');" /><br />    
<input value="HTML转义字符"(& q u o t ;)-OK" type="button" onclick="alert("OK");" /><br />    
<input value="HTML转义字符'(& a p o s ;)-IE错误" type="button" onclick="alert('OK');" /><br />    
  
<input value="其它\\-错误" type="button" onclick="alert(\\"OK\\");" /><br />    
<input value="其它\& # 3 4 ;-错误" type="button" onclick="alert(\"OK\");" /><br />    
</body>    
</html>    
自己在做下拉转跳菜单时又遇到尴尬的问题:
<select name="jie" onChange="window.location =(‘zyz.asp?jie=’+this.options[this.selectedIndex].value);">

总是出错。后来换成
<select name="jie" onChange="window.location =("zyz.asp?jie="+this.options[this.selectedIndex].value);">

就好了。根据我个人的理解应该是 onChange=""里面是javaScript代码但先用用HTML解析后执行。
自己测试了下,感觉上面说的也不对
Global site tag (gtag.js) - Google Analytics