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 File
of een van de andere FileXxx
varianten 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 ProjectRoot
bevindt, 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.txt
was, 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 src
of 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 Class
class, die de methode getResourceXxx
heeft, 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));
getResourceAsStream
retourneert een InputStream
, maar verkrijgt een URL onder de motorkap. Als alternatief kunt u een URL
krijgen 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 resources
in 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 src
MAP.
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:
- 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
- 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