现在的位置: 首页 > 综合 > 正文

URI is not hierarchical

2014年01月16日 ⁄ 综合 ⁄ 共 4359字 ⁄ 字号 评论关闭

在加载图片的时候使用方法Thread.currentThread().getContextClassLoader().getResource(String source)方法获取。
结果却导至在工程中(eclipse)能正常运行,而导出的jar包在加载图片的时候就运行出错:
报:

 

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI i
s not hierarchical
        at java.io.File.<init>(File.java:363)
        at replicator.move.wizard.panel.PanelMoveFirst.installComponents(PanelMo
veFirst.java:55)
        at replicator.move.wizard.panel.PanelMoveFirst.<init>(PanelMoveFirst.jav
a:37)
        at replicator.move.wizard.DlgMoveWizard.initNavigationTree(DlgMoveWizard
.java:123)
        at replicator.move.wizard.DlgMoveWizard.<init>(DlgMoveWizard.java:110)
        at replicator.move.mainPanel.PanelMainOperation.osMove(PanelMainOperatio
n.java:211)
        at replicator.move.mainPanel.PanelMainOperation.actionOptMenuPerformed(P
anelMainOperation.java:175)
        at replicator.move.mainPanel.opt.PanelOperator.actionOptPerformed(PanelO
perator.java:228)
        at replicator.move.mainPanel.opt.PanelOperator$PanelOptItem.actionPerfor
m(PanelOperator.java:677)
        at replicator.move.mainPanel.opt.PanelOperator$PanelOptItem.access$0(Pan
elOperator.java:673)
        at replicator.move.mainPanel.opt.PanelOperator$OptItemActionListener.act
ionPerformed(PanelOperator.java:318)
        at replicator.rose.RActionLabel.fireActionEvent(RActionLabel.java:74)
        at replicator.rose.RActionLabel.access$4(RActionLabel.java:70)
        at replicator.rose.RActionLabel$lbMouseListener.mousePressed(RActionLabe
l.java:106)
        at java.awt.Component.processMouseEvent(Component.java:6260)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235)

        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

原来根据:getResource(String source)方法获取的图片,我们不能对它的数据进行操作。
要对获取的资源文件的数据进行操作,就得用
public InputStream getResourceAsStream(String name)
来直接获取文件流,然后对该文件流进行操作。
查看File(URI uri)源码发现,该异常是从这里抛出来的。

if (uri.isOpaque())
	    throw new IllegalArgumentException("URI is not hierarchical");

 

在查看URI的isOpaque()方法,

查看UIR.isOpaqua()的源码为:

public boolean isOpaque() {
        return path == null;
    }

 

解释如下:
public boolean isOpaque()判断此 URI 是否为不透明的。
当且仅当 URI 是绝对的且其特定于方案的部分不是以斜线字符 ('/') 开始时,此 URI 才是不透明的。
不透明的 URI 具有一个方案、一个特定于方案的部分,以及可能会有的一个片段;所有其他组成部分都是未定义的。 不透明 URI 无法进行进一步解析。
返回:
当且仅当此 URI 是不透明的,才返回 true

查看输出为:jar:file:/C:/test.jar!/images/welcome.gif
而在我们的工程中(eclipse工程)输出为:file:/D:/work/work/test/bin/images/welcome.gif
因而在eclipse中该uir为非透明的,而在jar包中为透明的。所以就只在由jar启动时,才会报错。

在jar包运行,获取到的path(getPath())为null
而在eclipse中获取到的/D:/work/work/test/bin/images/welcome.gif

 

URI语法:[scheme:] scheme-specific-part [#fragment]

URI分不透明URI和分层URI。

不透明URI:不透明的URI指scheme-specific-part不是以正斜杠(/)开头的绝对的URI。不透明的URI并不是用于分解的。不透明的URI与其它的URI不同,它不服从标准化、分解和相对化。

分层URI:分层的URI可以是以正斜杠开头的绝对的URI或相对的URL。scheme-specific-part的语法:[//authority] [path] [?query]。

分层URI分成基于服务器或基于注册的URI

基于服务器的URI[//authority] 部分语法为:[userinfo@] host [:port]。

URI标准化:

标准化可以通过目录术语来理解。假定目录x直接位于根目录之下,x有子目录a和b,b有文件memo.txt,a是当前目录。为了显示memo.txt中的 内容(在微软Windows下),你可能输入type \x\.\b\memo.txt。你也可能输入type\x\a\..\b\memo.txt,在这种情况下,a和..的出现是没有必要的。这两种形式都 不是最简单的。但是如果输入\x\b\memo.txt,你就指定了最简单的路径了,从根目录开始访问memo.txt。最简单的\x\b \memo.txt路径就是标准化的路径。

绝对URI:绝对的URI指以scheme(后面跟着冒号)开头的URI。

绝 对路径:路径(path)可以分成一系列的路径片断(pathsegment),每个路径片断使用正斜杠与其它的路径片断隔开。如果路径的第一个路径片断 以一个正斜杠开始,该路径就被认为是绝对的。否则路径就被认为是相对的。绝对路径是相对于分层URI而言。不透明URI没有可分解的路径概念。

   通常通过基本的和相对的URI访问资源。基本的URI是绝对的URI,它唯一地标识了某种资源的名字空间,而相对的URI标识了与基础的URI相对的资 源。(与基本的URI不同,相对的URI在某种资源的生存周期内可以永远不需要改变)。因为基本的和相对的URI都不能完整的识别某种资源,有必要把两种 URI通过解析过程合并。相反地,通过相对化从合并的URI中提取相对的URI也是可行的。

 

抱歉!评论已关闭.