我试图让Google Drive Java Quickstart正常工作,但在尝试使用InputStream时我遇到了NullPointerException。
InputStream in =
Quickstart.class.getResourceAsStream("client_secret.json");
GoogleClientSecrets clientSecrets =
GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
根据一个SO问题,getResourceAsStream在与调用它的类相同的目录中查找文件,所以我将client_secret.json放在我的类中:
|src/main/java
|---quickstart
|------Quickstart.java
|------client_secret.json
我仍然有NullPointerException,所以我尝试从File创建InputStream而不是使用getResourceAsStream:
java.io.File initialFile = new java.io.File("A:/Documents/client_secret.json");
// java.io.File initialFile = new java.io.File("client_secret.json");
if (initialFile.canRead()) {
System.out.println("it works!");
} else {
System.out.println("that's a fail");
}
System.out.println(initialFile.getAbsolutePath() + " " + initialFile.exists() + " " + initialFile.getAbsoluteFile().exists());
InputStream in = new FileInputStream(initialFile);
导致:
that's a fail
A:\Documents\client_secret.json false false
Exception in thread "main" java.io.FileNotFoundException: A:\Documents\client_secret.json (Le fichier spécifié est introuvable)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at quickstart.Quickstart.authorize(Quickstart.java:76)
at quickstart.Quickstart.getDriveService(Quickstart.java:102)
at quickstart.Quickstart.main(Quickstart.java:111)
我在浏览器中使用路径时可以找到文件。
我尝试了不同的方法来打开文件(绝对路径,相对路径,使用&#34; parent&#34;构造函数,...),但总是相同的结果。当我在在线java编译器上执行它时,这段代码可以工作(比如tutorialspoint&#39;)。
我的操作系统是Windows 10,我正在使用Eclipse IDE。
答案 0 :(得分:0)
这在完整的answer of LordOfThePigs中解释。
在Class.getResourceAsStream(path)中,路径被解释为您调用它的类的包的本地路径。例如,调用String.getResourceAsStream(“myfile.txt”)将在类路径中的以下位置查找文件:“java / lang / myfile.txt”。如果您的路径以/开头,那么它将被视为绝对路径,并将从类路径的根开始搜索。因此,调用String.getResourceAsStream(“/ myfile.txt”)将查看类路径./myfile.txt中的以下位置。
您的路径被定义为绝对路径,绝对是类路径的根。
Quickstart.class.getResourceAsStream("client_secret.json"); // remove the "/"
- src
- labo
- Main.java
- Test.log // > Hello from Labo
- Test.log // > Hello from Source Package
这将是基于路径的输出
InputStream in = Main.class.getResourceAsStream("Test.log"); // /labo/Test.log
// > Hello from Labo
InputStream in = Main.class.getResourceAsStream("/Test.log"); // /Test.log
// > Hello from Source Package
代码:
public class Main {
public static void main(String[] args ) throws Exception{
String[] paths = {"/Test.log", "Test.log"};
for(String path : paths)
readPath(path);
}
static void readPath(String path) throws Exception{
InputStream in = Main.class.getResourceAsStream(path);
InputStreamReader reader = new InputStreamReader(in);
int i = -1;
System.out.println(path + " : ");
while((i = reader.read()) > -1){
System.out.print((char)i);
public }
System.out.println();
}
}
输出:
/Test.log :
Hello from the Source Package
Test.log :
Hello from Labo