簡體   English   中英

java.io.FileNotFoundException: 系統找不到指定的文件

[英]java.io.FileNotFoundException: the system cannot find the file specified

我有一個名為“ word.txt ”的文件。

它與我的java文件在同一目錄中。

但是,當我嘗試在以下代碼中訪問它時,會發生此文件未找到錯誤:

Exception in thread "main" java.io.FileNotFoundException: word.txt 
(The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at Hangman1.main(Hangman1.java:6)

這是我的代碼:

import java.io.File;
import java.util.*;

public class Hangman1 {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(new File("word.txt"));          
        String in = "";         
        in = input.nextLine();          
    }
}

直接把word.txt作為項目根文件夾的子目錄和src的peer

Project_Root
    src
    word.txt

免責聲明:我想解釋為什么這適用於這個特殊情況以及為什么它可能不適用於其他人。

為什么有效:

當您使用File或任何其他FileXxx變體時,您正在查找文件系統上相對於“工作目錄”的文件 工作目錄,可以這樣描述:

從命令行運行時

C:\\EclipseWorkspace\\ProjectRoot\\bin > java com.mypackage.Hangman1

工作目錄是C:\\EclipseWorkspace\\ProjectRoot\\bin 使用您的 IDE(至少是我使用過的所有 IDE),工作目錄是ProjectRoot 因此,當文件位於ProjectRoot ,僅使用文件名作為相對路徑是有效的,因為它位於工作目錄的根目錄中。

同樣,如果這是您的項目結構ProjectRoot\\src\\word.txt ,則路徑"src/word.txt"將是有效的。

為什么它可能不起作用

一方面,工作目錄總是會改變。 例如,像上面的例子一樣從命令行運行代碼,工作目錄是bin 所以在這種情況下它會失敗,因為沒有bin\\word.txt

其次,如果您要將這個項目導出到 jar 中,並且該文件被配置為包含在 jar 中,它也會失敗,因為路徑也不再有效。

話雖如此,您需要確定文件是否是(或只是“資源”——有時我會互換使用的術語)。 如果是這樣,那么您需要將文件構建到類路徑中,並通過 URL 訪問它。 您需要做的第一件事(在這種特殊情況下)是確保將文件內置到類路徑中。 使用項目根目錄中的文件,您必須配置構建以包含該文件。 但是如果你把文件放在src或下面的某個目錄中,那么默認構建應該把它放在類路徑中。

您可以通過多種方式訪問​​類路徑資源。 您可以使用Class類,該類具有getResourceXxx方法,您可以從中獲取類路徑資源。

例如,如果您將項目結構更改為ProjectRoot\\src\\resources\\word.txt ,則可以使用:

InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

getResourceAsStream返回一個InputStream ,但在InputStream獲取一個 URL。 或者,如果您需要,您可以獲得一個URL getResource()將返回一個 URL

對於 Maven 用戶,目錄結構類似於src/main/resourcesresources文件夾的內容放在類路徑的根目錄下。 所以如果你有一個文件,那么你只能使用getResourceAsStream("/thefile.txt")

可以使用相對路徑,但它們可能很棘手。 最好的解決方案是知道您的文件保存在哪里,即打印文件夾:

import java.io.File;
import java.util.*;

public class Hangman1 {

    public static void main(String[] args) throws Exception {
        File myFile = new File("word.txt");
        System.out.println("Attempting to read from file in: "+myFile.getCanonicalPath());

        Scanner input = new Scanner(myFile);
        String in = "";
        in = input.nextLine();
    }

}

此代碼應打印要查找的文件夾。 將文件放在那里,您就可以開始使用了。

您的文件應該直接在項目文件夾下,而不是在任何其他子文件夾中。

如果您的項目文件夾以AProject命名,則它應該與您的src文件夾位於同一位置。

Aproject
        src
        word.txt

我正在從屬性文件中讀取路徑,並沒有提到最后有一個空格。 確保你沒有。

確保在創建 txt 文件時不要輸入名稱“name.txt”,只需輸入“name”。 如果您鍵入“name.txt”,Eclipse 會將其視為“name.txt.txt”。 這為我解決了它。 還將文件保存在 src 文件夾中,而不是 .java 所在的文件夾,一個文件夾。

我有同樣的問題,但你知道為什么嗎? 因為我沒有將 .txt 放在我的 File 的末尾,所以它是 File 而不是 textFile,你應該只做兩件事:

  1. 將您的文本文件放在根目錄中(例如,如果您有一個名為 HelloWorld 的項目,只需右鍵單擊包目錄中的 HelloWorld 文件並創建 File
  2. 使用您想要的任何名稱保存為該文件,但最后使用 .txt 我想您的問題已解決,但我將其寫給其他人知道這一點。 謝謝。

嘗試使用代碼創建一個文件,這樣你就會知道系統創建的文件的路徑

File test=new File("check.txt");
if (test.createNewFile()) {
    System.out.println("File created: " + test.getName());
  }

我認為它總是歸結為classpath 話雖如此,如果您從 .class 所在的同一文件夾運行,則更改Scanner input = new Scanner(new File("word.txt")); to Scanner input = new Scanner(new File("./word.txt")); 那應該工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM