无法用Java打开现有文件

时间:2017-04-27 09:19:29

标签: java file

我试图让Google Drive Java Quickstart正常工作,但在尝试使用InputStream时我遇到了NullPointerException。

Google的快速入门代码

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。

1 个答案:

答案 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