如何从文件内部获取.java文件的绝对路径?
我想在当前类的同一个包中创建一个新文件如何从文件内部获取.java文件的绝对路径?,java,Java,我想在当前类的同一个包中创建一个新文件 FileOutputStream fileOut = new FileOutputStream(YYY); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(this); 用于该目的的正确YYY是什么 我试过这个: FileOutputStream fileOut = new FileOutputStream("myObject"); ObjectOutpu
FileOutputStream fileOut = new FileOutputStream(YYY);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(this);
用于该目的的正确YYY是什么我试过这个:
FileOutputStream fileOut = new FileOutputStream("myObject");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(this);
但是“myObject”文件创建于:c:\program files\eclipse
救命啊!
谢谢
编辑:也许值得一提的是,这是一个SVN项目。也许这与在简单情况下测试的有关:
URL resource=this.getClass().getClassLoader().getResource(this.getClass().getName().concat(.class))代码>
这将获得.class文件。请记住.java文件甚至可能不在系统上。您想要的是不可能的,因为周围可能没有.java文件(只有.class文件),而.class文件可能位于(嵌套的).jar文件中,JVM不知道使用哪个类路径条目来定位.class文件
也就是说,我曾尝试为我的一个项目解决同样的问题。代码如下所示:
private static List<Class> getClassesForPackage(String packagename)
throws ClassNotFoundException
{
// This will hold a list of directories matching the pckgname.
// There may be more than one if a package is split over multiple
// jars/paths
List<Class> classes = new ArrayList<Class>();
List<File> directories = new ArrayList<File>();
try {
ClassLoader classLoader =
Thread.currentThread().getContextClassLoader();
if (classLoader == null) {
throw new ClassNotFoundException("Can't get class loader.");
}
// Ask for all resources for the path
Enumeration<URL> resources =
classLoader.getResources(packagename.replace('.', '/'));
while (resources.hasMoreElements()) {
URL res = resources.nextElement();
if (res.getProtocol().equalsIgnoreCase("jar")) {
JarURLConnection conn =
(JarURLConnection) res.openConnection();
JarFile jar = conn.getJarFile();
for (JarEntry e : Collections.list(jar.entries())) {
if (e.getName().startsWith(
packagename.replace('.', '/'))
&& e.getName().endsWith(".class")
&& !e.getName().contains("$"))
{
String className =
e.getName().replace("/", ".").substring(
0,
e.getName().length() - 6);
classes.add(Class.forName(className));
}
}
}
else
directories.add(new File(URLDecoder.decode(
res.getPath(),
"UTF-8")));
}
}
catch (NullPointerException x) {
throw new ClassNotFoundException(packagename
+ " does not appear to be "
+ "a valid package (Null pointer exception)");
}
catch (UnsupportedEncodingException encex) {
throw new ClassNotFoundException(packagename
+ " does not appear to be "
+ "a valid package (Unsupported encoding)");
}
catch (IOException ioex) {
throw new ClassNotFoundException(
"IOException was thrown when trying "
+ "to get all resources for " + packagename);
}
List<String> subPackages = new ArrayList<String>();
// For every directory identified capture all the .class files
for (File directory : directories) {
if (directory.exists()) {
// Get the list of the files contained in the package
File[] files = directory.listFiles();
for (File file : files) {
// add .class files to results
String fileName = file.getName();
if (file.isFile() && fileName.endsWith(".class")) {
// removes the .class extension
classes.add(Class.forName(packagename + '.'
+ fileName.substring(0, fileName.length() - 6)));
}
// add directories to subpackages
if (file.isDirectory()) {
subPackages.add(packagename + "." + fileName);
}
}
}
else {
throw new ClassNotFoundException(packagename + " ("
+ directory.getPath()
+ ") does not appear to be a valid package");
}
}
// check all potential subpackages
for (String subPackage : subPackages) {
classes.addAll(getClassesForPackage(subPackage));
}
return classes;
}
私有静态列表getClassesForPackage(字符串packagename)
抛出ClassNotFoundException
{
//这将保存与pckgname匹配的目录列表。
//如果一个包被拆分为多个包,则可能有多个包
//罐子/路径
列表类=新的ArrayList();
列表目录=新的ArrayList();
试一试{
类加载器类加载器=
Thread.currentThread().getContextClassLoader();
if(classLoader==null){
抛出新的ClassNotFoundException(“无法获取类加载器”);
}
//请求路径的所有资源
枚举资源=
getResources(packagename.replace('.','/');
while(resources.hasMoreElements()){
URL res=resources.nextElement();
if(res.getProtocol().equalsIgnoreCase(“jar”)){
Jarull连接连接器=
(JarURLConnection)res.openConnection();
JarFile jar=conn.getJarFile();
for(JarEntry e:Collections.list(jar.entries())){
如果(e.getName().startWith(
packagename.replace('.','/'))
&&e.getName().endsWith(“.class”)
&&!e.getName().包含($)
{
字符串类名=
e、 getName().replace(“/”,“).substring(
0,
e、 getName().length()-6);
add(Class.forName(className));
}
}
}
其他的
目录.add(新文件(urldescoder.decode(
res.getPath(),
“UTF-8”);
}
}
捕获(NullPointerException x){
抛出新的ClassNotFoundException(packagename
+“似乎不是”
+“有效包(空指针异常)”;
}
捕获(不支持的编码异常){
抛出新的ClassNotFoundException(packagename
+“似乎不是”
+“有效的包(不支持的编码)”;
}
捕获(IOException ioex){
抛出新的ClassNotFoundException(
“尝试时引发IOException”
+“获取“+packagename”的所有资源);
}
列表子包=新建ArrayList();
//对于标识的每个目录,捕获所有.class文件
用于(文件目录:目录){
if(directory.exists()){
//获取包中包含的文件列表
File[]files=目录.listFiles();
用于(文件:文件){
//将.class文件添加到结果
字符串文件名=file.getName();
if(file.isFile()&&fileName.endsWith(“.class”)){
//删除.class扩展名
Class.add(Class.forName(packagename+)。'
+fileName.substring(0,fileName.length()-6));
}
//将目录添加到子包
if(file.isDirectory()){
添加(packagename+“+”文件名);
}
}
}
否则{
抛出新的ClassNotFoundException(packagename+“(”
+directory.getPath()目录
+)似乎不是有效的软件包“);
}
}
//检查所有潜在的子包
用于(字符串子包:子包){
addAll(getClassesForPackage(subPackage));
}
返回类;
}
要找到相应的.java文件的目录,您需要配置您正在使用的源目录。在一个仅从jar文件运行代码的系统上,您希望这做什么?这没有太多意义,因为一般来说,Java应用程序是从编译文件运行的,而源Java文件根本不存在于机器上。SVN与此无关,所以我需要做什么?我不想给出我的计算机上的绝对路径,因为它在其他计算机上不起作用。不是一个类,一个用于序列化对象的文件。然后反序列化它。