java.io.FileNotFoundException: het systeem kan het opgegeven bestand niet vinden

Ik heb een bestand met de naam “word.txt“.

Het staat in dezelfde map als mijn java-bestand.

Maar wanneer ik het probeer te openen in de volgende code, treedt deze bestand niet gevonden-fout op:

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)

Hier is mijn code:

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();          
    }
}

Antwoord 1, autoriteit 100%

Zet het woord.txt direct als een kind van de hoofdmap van het project en een peer van src

Project_Root
    src
    word.txt

Disclaimer:ik wil graag uitleggen waarom dit werkt voor dit specifieke geval en waarom het misschien niet werkt voor anderen.

Waarom het werkt:

Als u Fileof een van de andere FileXxxvarianten gebruikt, zoekt u een bestand op het bestandssysteem ten opzichte van de “werkmap”. De werkdirectory kan als volgt worden omschreven:

Wanneer u start vanaf de opdrachtregel

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

de werkmap is C:\EclipseWorkspace\ProjectRoot\bin. Met je IDE (tenminste alle waarmee ik heb gewerkt), is de werkdirectory de ProjectRoot. Dus als het bestand zich in de ProjectRootbevindt, dan is het gebruik van alleen de bestandsnaam als het relatieve pad geldig, omdat het zich in de root van de werkdirectory bevindt.

Als dit uw projectstructuur ProjectRoot\src\word.txtwas, zou het pad "src/word.txt"ook geldig zijn.

>

Waarom het misschien niet werkt

Ten eerste kan de werkdirectory altijd veranderen. Als u bijvoorbeeld de code vanaf de opdrachtregel uitvoert, zoals in het bovenstaande voorbeeld, is de werkmap de bin. Dus in dit geval zal het mislukken, omdat er geen bin\word.txt

. is

Ten tweede, als u dit project naar een jar zou exporteren en het bestand was geconfigureerd om in de jar te worden opgenomen, zou het ook mislukken, omdat het pad ook niet langer geldig is.

Dat gezegd hebbende, moet je bepalen of het bestand een embedded-resource(of gewoon “resource” – termen die ik soms door elkaar gebruik). Als dat het geval is, moet u het bestand in het klassenpad bouwen en het openen via een URL. Het eerste dat u zou moeten doen (in dit specifieke geval) is ervoor zorgen dat het bestand ingebouwdwordt in het klassenpad. Met het bestand in de hoofdmap van het project, moet u de build configureren om het bestand op te nemen. Maarals je het bestand in de srcof in een of andere directory hieronder plaatst, dan zou de standaard build het in het klassenpad moeten plaatsen.

Je kunt op verschillende manieren toegang krijgen tot de bronnen voor klassenpaden. U kunt gebruik maken van de Classclass, die de methode getResourceXxxheeft, waarmee u classpath-bronnen kunt verkrijgen.

Als u bijvoorbeeld uw projectstructuur heeft gewijzigd in ProjectRoot\src\resources\word.txt, kunt u dit gebruiken:

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

getResourceAsStreamretourneert een InputStream, maar verkrijgt een URL onder de motorkap. Als alternatief kunt u een URLkrijgen als u dat nodig heeft. getResource()retourneert een URL

Voor Maven-gebruikers, waar de directorystructuur is zoals src/main/resources, wordt de inhoud van de map resourcesin de root van het klassenpad geplaatst. Dus als je daar een bestand hebt, gebruik dan alleen getResourceAsStream("/thefile.txt")


Antwoord 2, autoriteit 17%

Relatieve paden kunnen worden gebruikt, maar ze kunnen lastig zijn. De beste oplossing is om te weten waar uw bestanden worden opgeslagen, dat wil zeggen, druk de map af:

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();
    }
}

Deze code moet de map afdrukken waar het op zoek is. Plaats het bestand daar en u zult goed zijn om te gaan.


Antwoord 3, Autoriteit 3%

Uw bestand moet direct onder de map Project zijn en niet in elke andere submap.

Als de map van uw project is genoemd om b.v. AProject, het moet op dezelfde plaats staan ​​als uw srcMAP.

Aproject
        src
        word.txt

Antwoord 4, Autoriteit 2%

Ik leed pad van een eigenschappenbestand en niet vermeldde dat er uiteindelijk een ruimte was.
Zorg dat je er geen hebt.


Antwoord 5

Zorg ervoor dat u een TXT-bestand maakt dat u niet typt in de naam “NAME.TXT”, typ gewoon in “NAAM”. Als u “NAME.TXT” Eclipse typt, ziet u het als “NAME.TXT.TXT”. Dit lag het voor mij op. Sla het bestand ook op in de SRC-map, niet de map waar de .java verblijft, één map omhoog.


Antwoord 6

Ik heb hetzelfde probleem, maar weet je waarom? Omdat ik .txt aan het einde van mijn dossier niet heb gezet en dus het was bestand geen textfile, je zult slechts twee dingen doen:

  1. Plaats uw tekstbestand in de root-directory (E.x als u een project hebt genaamd Helloworld, klik dan met de rechtermuisknop op het HLELLDORLD-bestand in de pakketdirectory en maak bestand
  2. Opslaan als dat bestand met elke gewenste naam, maar met een .txt aan het einde van dat
    Ik vermoed dat je probleem is opgelost, maar ik schrijf het aan andere mensen weten dat.
    Bedankt.

Antwoord 7

Probeer een bestand te maken met behulp van de code, zodat u het pad van het bestand kent kennen waar het systeem

maakt

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

Antwoord 8

Ik denk dat het altijd kookt naar de classpath. Dat gezegd hebbende, als u vanuit dezelfde map loopt, waar uw .klasse is dan wijzigt Scanner input = new Scanner(new File("word.txt"));naar Scanner input = new Scanner(new File("./word.txt"));die moet werken

Other episodes