Java 无法使用getResourceAsStream加载文件
我正在尝试学习ApacheAvro,我已经从简单的Avro教程开始。我试图使用JSON模式来加载数据。下面是我的简单例子-Java 无法使用getResourceAsStream加载文件,java,file,classpath,avro,Java,File,Classpath,Avro,我正在尝试学习ApacheAvro,我已经从简单的Avro教程开始。我试图使用JSON模式来加载数据。下面是我的简单例子- public class AvroExample { public static Schema SCHEMA; // writer's schema public static Schema SCHEMA2; // reader's schema private String name; private int age; priv
public class AvroExample {
public static Schema SCHEMA; // writer's schema
public static Schema SCHEMA2; // reader's schema
private String name;
private int age;
private String[] mails;
private AvroExample boss;
static {
try {
SCHEMA = Schema.parse(AvroExample.class.getResourceAsStream("Employee.avsc"));
SCHEMA2 = Schema.parse(AvroExample.class.getResourceAsStream("Employee2.avsc"));
} catch (Exception e) {
System.out.println("Couldn't load a schema: " + e.getMessage());
}
}
// some more code
}
但不知怎的这一行,总是给我例外-
SCHEMA=SCHEMA.parse(AvroExample.class.getResourceAsStream(“Employee.avsc”)代码>
as-无法加载架构:java.lang.NullPointerException
我相信不知何故,它无法正确加载文件,或者我加载文件的方式错误
这是文件内容-
{
"type": "record",
"name": "Employee",
"fields": [
{"name": "name", "type": "string"},
{"name": "age", "type": "int"},
{"name": "emails", "type": {"type": "array", "items": "string"}},
{"name": "boss", "type": ["Employee","null"]}
]
}
下面是我工作区的图片,显示了我将这两个avsc文件放在哪里-
有人能帮我吗?根据您向我们展示的项目设置,您的类路径很可能如下所示
/root
/Employee.avsc
/Employee2.avsc
/com
/rjamal
/avro
/test
/AvroExperiment
/...
换句话说,两个avsc
文件将位于类路径的根。方法调用
AvroExample.class.getResourceAsStream("Employee.avsc")
在AvroExample
类所在的包中查找资源
要使其相对于类路径的根,请在路径前面加一个/
AvroExample.class.getResourceAsStream("/Employee.avsc")
检查
在委托之前,将根据
使用此算法的给定资源名称:
- 如果名称以“/”开头(“\u002f”),则资源的绝对名称是名称中“/”后面的部分
- 否则,绝对名称的形式如下:modified\u package\u name/name
其中,修改后的包名为此对象的包名,用“/”替换“.”(“\u002e”)
强调我的路径。在路径字符串前面放一个/
。至于为什么会这样,请阅读Class#getResource()
的javadoc和链接的方法。感谢Sotirios的建议。今天我学到了一件新东西。但在做出改变之后,我还是得到了同样的例外SCHEMA=SCHEMA.parse(AvroExample.class.getResourceAsStream(“/Employee.avsc”);SCHEMA2=Schema.parse(AvroExample.class.getResourceAsStream(“/Employee2.avsc”)
@trekkietchiet-T这些文件是在src/main/java
中还是在某个包中?遵循maven的惯例,将非java文件放在src/main/resources
中,它应该是Eclipse中的源文件夹。它们不在任何包中。它完全如图所示。但总的来说,最好的方法是什么?我们将把这些文件放在哪里?我还创建了另一个文件config.properties
,并将其放在相同的位置。然后我做了类似的事情-System.out.println(AvroExample.class.getResourceAsStream(“/config.properties”);System.out.println(AvroExample.class.getResourceAsStream(“/Employee.avsc”)所以第一个打印出java.io。BufferedInputStream@1160116
但第二个打印为null。@Trekkietheciet-T在Maven
应用程序中,非java资源的常规位置是src/main/resources
。把那些文件放在那里。你刚才发布的内容应该是告诉你有什么问题,或者文件名不匹配,或者它们实际上不在那里。这很奇怪。如果我正在创建一个具有不同名称的新文件,并将Employee.avsc文件中的确切内容复制到该新文件中,那么它可以正常工作。