java新手提问,路径问题。

rocknet 2004-11-18 09:42:17
我运行一个SAX的例程,原来要解析的那个xml文件是放在项目的根目录下的,可以运行。
现在我把那个xml放在我的包路径下(和运行类在同一个包路径下),就提示找不到文件了。
我该怎么办啊?

package com.rocknet.TestSAX;//surveys.xml也在这个包下。

import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.*;

public class SurveyReader extends DefaultHandler
{
public SurveyReader()
{
System.out.println("Object Created.");
}

public static void main(String args[])
{
XMLReader xmlReader = null;
try
{
SAXParserFactory spfactory = SAXParserFactory.newInstance();
spfactory.setValidating(false);
SAXParser saxParser = spfactory.newSAXParser();
xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(new SurveyReader());
InputSource source = new InputSource("surveys.xml");//这里载入xml
xmlReader.parse(source);
}
catch (Exception e)
{
System.err.println(e);
System.exit(1);
}
}
}
...全文
182 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
launch401 2004-11-18
  • 打赏
  • 举报
回复
java找要用的类是先看import语句,确定这个类所在的包,然后对于classpath中的每一项,在classpath后面加上包名(把.换成/),看一看要用的class在不在这个路径下,找到的话,就用了,如果对于classpath中的每一项都没有,那么就是报错,说找不到class。

你的这个问题和class的查找还是两回事,因为你要找一个普通文件。你要给出这个文件的绝对路径或是相对路径,如果是相对路径的话,就要相对于当前用户的工作的目录,你可以用System.out.println(System.getPorperty("user.dir"));这条语句看一下你的工作路径,一般都是包所在的根目录。
rocknet 2004-11-18
  • 打赏
  • 举报
回复
谢谢chanceqw,我还是有点不明白。
比如有两个类A和B,在同一个包里面。
在A中new B()的时候,JVM到哪去找B呢?B中的Pakage信息不会被带到A中吧。
是不是默认到同一个包里面找啊?如果是这样的话,就应该能找到同一个包里面的其他文件啊。
kevingn 2004-11-18
  • 打赏
  • 举报
回复
InputSource source = new InputSource(".\\com\\rocknet\\TestSAX\\surveys.xml");
chanceqw 2004-11-18
  • 打赏
  • 举报
回复
程序中使用相对路径都是相对于CLASSPATH的,而且只会找CLASSPATH那一层,不可能递归查找
所以显然"com/rocknet/TestSAX/surveys.xml"跟"surveys.xml"找到的东西不可能一样
除非你在CLASSPATH中加入了“com/rocknet/TestSAX”这个目录
class通过package和import关键字就告诉了JVM具体路径,但是xml显然缺少这个机制
因为你不可能import一个xml,也不可能在xml中写上它属于哪个package来告诉JVM它的路径
rocknet 2004-11-18
  • 打赏
  • 举报
回复
.class和.xml的等级还不一样吗?
java解释器也不是要到文件系统下去找这个.class文件吗?既然能找到.class,为什么找不到.xml呢?
takecare 2004-11-18
  • 打赏
  • 举报
回复
呵呵。你的同包的类跟你的那个xml文件有什么差别呢?
好好想想吧。
launch401 2004-11-18
  • 打赏
  • 举报
回复
你又不是调用类,而是这个文件的地址。当前工作路径是包的根目录。
rocknet 2004-11-18
  • 打赏
  • 举报
回复
一定要写这么长吗?那为什么调用同一个包的类就不用写这么长呢?也不用import。
射天狼 2004-11-18
  • 打赏
  • 举报
回复
//***************************************************
//名称:getHelpContent
//功能:取得帮助文件内容
//输入:
//输出:
//返回:帮助文件内容
//***************************************************
private String getHelpContent () throws IOException
{
URL url = null;
StringBuffer strBufContent = new StringBuffer ();
BufferedReader bufReader = null;
int i = 0;

try
{
url = getClass().getResource("/frameApp/help/frameAppHelp.txt");
bufReader = new BufferedReader (new InputStreamReader (url.openStream ()));
while (bufReader.ready ())
{
strBufContent.append (bufReader.readLine () + "\r\n");
}
}
catch (Exception e)
{
System.out.println (e.toString ());
return ("");
}

return (strBufContent.toString ());
}
launch401 2004-11-18
  • 打赏
  • 举报
回复
InputSource source = new InputSource(".\\com\\rocknet\\TestSAX\\surveys.xml");
takecare 2004-11-18
  • 打赏
  • 举报
回复
我倒!


InputSource source = new InputSource("com/rocknet/TestSAX/surveys.xml");//这里载入xml
rocknet 2004-11-18
  • 打赏
  • 举报
回复
是的,那个xml原来是放在com目录上层的,可以运行。
可是现在我想放在包目录下啊,不行吗?
takecare 2004-11-18
  • 打赏
  • 举报
回复
surveys.xml放到com目录的上层,也就是跟com目录并级。
同时将com目录的上层放到classpath中;当然如果喜欢设置当前目录到classpath中的话,你的工作目录应该是在com目录的上层。
chanceqw 2004-11-18
  • 打赏
  • 举报
回复
而且,我认为在运行的时候并非在同一个包里面找,我想这是编译的时候的事。编译好的class文件中B的信息也许是带完整包名的。运行的时候所有相对路径都是相对于CLASSPATH的,正如你要在命令行运行
com.rocknet.TestSAX.A的话
你的当前目录下必须包含com\rocknet\TestSAX\A.class
然后还在这个目录下java com.rocknet.TestSAX.A
而不是cd到com\rocknet\TestSAX\下运行java A (这样运行是会报错的)
这个例子正说明了类查找机制的问题(查找基点是CLASSPATH中指定目录)
chanceqw 2004-11-18
  • 打赏
  • 举报
回复
在A中new B()的时候,JVM到哪去找B呢?B中的Pakage信息不会被带到A中吧。

我想java的编译本质上跟c++没有什么不同,都是首先link,之后再compile
在编译A的时候如果用到B,则会寻找B(相当于link),找不到则报错。B如果不带包名的话,编译器首先会查找java.lang包,如果没有,则找A相同的包。我想B的定位工作在编译时就已经做好了。JVM自然知道到哪里去找B
但是寻找普通文件则不同(首先用法也不同)。即使可能并不存在这个文件,编译的时候,也不会报错。普通文件是作为流打开的,而class文件是由ClassLoader装载的。这是两种不同的机制。

我想JVM当然也可以设计成你所说的那种情况,但是它没有。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧