无法在 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 中打开现有文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章