我有一个必须有一些静态方法的类.在这些静态方法中,我需要调用方法getClass()来进行以下调用:
public static void startMusic() {
URL songPath = getClass().getClassLoader().getResource("background.midi");
}
Run Code Online (Sandbox Code Playgroud)
然而Eclipse告诉我:
Cannot make a static reference to the non-static method getClass()
from the type Object
Run Code Online (Sandbox Code Playgroud)
修复此编译时错误的适当方法是什么?
是否有任何实用程序可以帮助将资源中的文本文件读入String.我想这是一个很受欢迎的要求,但谷歌搜索后我找不到任何实用程序.
我想知道Class.getResource()和之间的区别是什么ClassLoader.getResource()?
编辑:我特别想知道文件/目录级别是否涉及任何缓存.如"在类版本中缓存的目录列表?"
以下AFAIK应该基本上做同样的事情,但它们不是:
getClass().getResource()
getClass().getClassLoader().getResource()
Run Code Online (Sandbox Code Playgroud)
我在摆弄一些报告生成代码时发现了这一点,该代码WEB-INF/classes/从该目录中的现有文件创建了一个新文件.当使用Class中的方法时,我可以找到部署时使用的文件getClass().getResource(),但在尝试获取新创建的文件时,我收到了一个null对象.浏览目录会清楚地显示新文件存在.文件名前面带有正斜杠,如"/myFile.txt"中所示.
另一方面,ClassLoader版本getResource()确实找到了生成的文件.根据这种经验,似乎存在某种目录列表的缓存.我是对的,如果是的话,这会记录在哪里?
从API文档上Class.getResource()
查找具有给定名称的资源.搜索与给定类关联的资源的规则由类的定义类加载器实现.此方法委托给此对象的类加载器.如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResource(java.lang.String).
对我来说,这是"Class.getResource真正调用它自己的类加载器的getResource()".这和做的一样getClass().getClassLoader().getResource().但显然不是.有人可以请我为此事提供一些启示吗?
我的GUI出错了.尝试设置标题栏图标,然后将其包含在Runnable JAR中.
BufferedImage image = null;
try {
image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif"));
}
catch (IOException e) {
e.printStackTrace();
}
frame.setIconImage(image);
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
at GUI.<init>(GUI.java:39)
at GUI.main(GUI.java:351)
Run Code Online (Sandbox Code Playgroud)
图像位于正确的目录中,"resources"文件夹是项目文件的根目录
从资源中检索文件时,我应该在什么情况下使用哪一个?
我在我的代码中硬编码了这个 JSON 字符串。
String json = "{\n" +
" \"id\": 1,\n" +
" \"name\": \"Headphones\",\n" +
" \"price\": 1250.0,\n" +
" \"tags\": [\"home\", \"green\"]\n" +
"}\n"
;
Run Code Online (Sandbox Code Playgroud)
我想将它移动到资源文件夹并从那里读取它,我如何在 JAVA 中做到这一点?
关于类加载方法之间的区别的流行答案,Jon Skeet表示,
类加载器资源路径始终被视为绝对路径.
一个更受欢迎的答案以一个例子肯定了这个陈述.
ClassLoader.getResourceAsStream(path)将所有路径视为绝对路径.所以调用String.getClassLoader().getResourceAsString("myfile.txt")并将String.getClassLoader().getResourceAsString("/myfile.txt")在以下位置的类路径中查找文件:./myfile.txt.
忽略该示例不会编译的事实,共识表明前导斜杠与ClassLoader无关.
一个简单的测试显示不然.
Foo.class.getClassLoader().getResource("test.xml") // file
Foo.class.getClassLoader().getResource("/test.xml") // null
我只是添加了files/test.xml一个测试项目的类路径的路径,一个名为Foo包含一个main()方法的类打印出这两个调用的结果.我错过了什么,因为数百人已经投了上述答案?ClassLoader是绝对的,还是取决于输入名称的结构?
这篇Oracle博客文章对我的理解很有帮助.
最终从资源名称构造URL的方法是URLClassPath.JarLoader.checkResource().
我有像Project这样的文件夹结构
由于整个项目将被打包到一个jar文件中,我必须使用getResourceAsStream从资源中读取一个文件.虽然我已经阅读了有关getResourceAsStream的所有问题,但我仍然无法使其正常工作.有人可以帮忙吗?谢谢!
public class TestMain {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
InputStream stream = TestMain.class.getResourceAsStream("\resources\test.txt");
System.out.println(stream);
BufferedReader bufRead = new BufferedReader(new InputStreamReader(stream));
StringBuilder builder = new StringBuilder();
String line=null;
while((line=bufRead.readLine())!=null){
builder.append(line).append("\n");
}
System.out.println(builder.toString());
}
}
Run Code Online (Sandbox Code Playgroud) 我需要从Java桌面应用程序生成复杂的文本文件.
我已经决定,如果我可以复制模板文件并将其定制为需要构建的任何内容,那么代码将更容易实现.
我只会向客户分发罐子.有关于如何处理这个问题的最佳做法吗?
我有一个初始化文件(initialize.java),它使用fileInputStream从fileInput.txt中提取数据,但它们都位于不同的目录中.
Run Code Online (Sandbox Code Playgroud)Project/library/initialize.java Project/resources/text/fileInput.txt
我在initialize.java中的代码是:
FileInputStream fstream = new FileInputStream("/resources/text/fileInput.txt");
Run Code Online (Sandbox Code Playgroud)
但是文件无法读取.我也试过了
FileInputStream fstream = new FileInputStream("./resources/text/fileInput.txt");
Run Code Online (Sandbox Code Playgroud)
但那也行不通.
如何访问txt文件以及使用"./resources"和"/ resources"之间的区别是什么?
感谢您阅读本文.
我是Java的新手,我遇到了一个无法找到解决方案的问题.我编写了一个读取和写入txt文件的程序.当我在NetBeans中运行它似乎工作正常,但是当我尝试运行JAR文件时,似乎程序无法访问txt文件.
我使用以下代码创建了该文件:
File data = new File("src/data.txt");
Run Code Online (Sandbox Code Playgroud)
它可能无法在创建文件时起作用吗?如果不是它会是什么?
编辑:文本文件被修改为程序前进,如果我使用输入流我将无法写入或更改txt文件,我应该改变我管理我的数据的方式?(txt文件)还是有一种方法让jar仍然可以访问Txt文件?