无法在 Java 中打开现有文件 [重复]

Posted

技术标签:

【中文标题】无法在 Java 中打开现有文件 [重复]【英文标题】:Can't open an existing file in Java [duplicate] 【发布时间】:2017-09-25 00:07:03 【问题描述】:

我正在尝试使用 Google Drive Java 快速入门,但在尝试使用 InputStream 时遇到了 NullPointerException。

Google 的快速入门代码

InputStream in =
            Quickstart.class.getResourceAsStream("client_secret.json");
        GoogleClientSecrets clientSecrets =
            GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

根据一个 SO question,getResourceAsStream 在与调用它的类相同的目录中查找文件,因此我将 client_secret.json 放在我的类中:

|src/main/java
|---quickstart
|------Quickstart.java
|------client_secret.json

我仍然有 NullPointerException,所以我尝试从文件创建 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)

当我在资源管理器中使用路径时,我可以找到这些文件。

我尝试了不同的方法来打开文件(绝对路径、相对路径、使用“父”构造函数……),但结果总是相同。不过,当我在在线 Java 编译器上执行此代码时(如 tutorialspoint 的编译器),此代码有效。

我的操作系统是 Windows 10,我正在使用 Eclipse IDE。

【问题讨论】:

A:\Documents? 重复解释"/client_secret.json""client_secret.json"的区别 这里去掉斜线:Quickstart.class.getResourceAsStream("client_secret.json"); @Jens 我在不同的地方复制了我的文件(A:\Documents,带有 Quickstart.java 等) A 是什么驱动器?通常我知道它是软盘驱动器(很久以前) 【参考方案1】:

这是完整的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

【讨论】:

正如我在 cmets 中所说,斜线是复制/粘贴错误(从实际的快速入门中复制,但已在我的代码中删除)。我编辑了原帖 @Carm 提供了一个重现这个的例子。我确实创建了我的示例来确认这一点,它正在工作。这是完整的示例 好吧,我想我的问题一定来自其他地方,因为我无法让您的示例工作(NullPointerException)... @Carrm 所以inputstream 是空的? 一个 InputStream 对象,如果没有找到具有此名称的资源,则为 null 清理项目并重试。我没有看到解决方案 是的,好像是空的

以上是关于无法在 Java 中打开现有文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法打开类文件 R.java [重复]

在Java中现有数据之间的文本文件中添加数据[重复]

Eclipse中的重复.java文件

无法打开同一目录中的文件[重复]

文件中的错误(文件,“rt”):无法打开连接[重复]

无法打开流:[重复]中没有这样的文件或目录