Hoe kan ik een bestand lezen van een relatief pad in een Java-project? java.io.File kan het opgegeven pad niet vinden

Ik heb een project met 2 pakketten:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

In pakket (2) heb ik een tekstbestand ListStopWords.txt, in pakket (1) heb ik een klasse FileLoadder. Hier is code in FileLoadder:

File file = new File("properties\\files\\ListStopWords.txt");

Maar heb deze fout:

The system cannot find the path specified

Kun je een oplossing geven om het te repareren? Bedankt.


Antwoord 1, autoriteit 100%

Als het al in het klassenpad staat, verkrijg het dan gewoon van het klassenpad in plaats van van het schijfbestandssysteem. Knoei niet met relatieve paden in java.io.File. Ze zijn afhankelijk van de huidige werkdirectory waarover je totaal geen controle hebt vanuit de Java-code.

Ervan uitgaande dat ListStopWords.txtzich in hetzelfde pakket bevindt als uw klasse FileLoadder, doet u het volgende:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

Of als alles wat je uiteindelijk zoekt eigenlijk een InputStreamis:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

Dit heeft zeker de voorkeur boven het maken van een new File()omdat de urlniet noodzakelijk een schijfbestandssysteempad vertegenwoordigt, maar het kan ook een virtueel bestandssysteempad vertegenwoordigen (wat kan gebeuren wanneer de JAR wordt uitgebreid naar het geheugen in plaats van naar een tijdelijke map op het schijfbestandssysteem) of zelfs een netwerkpad die beide niet per definitie kunnen worden verwerkt door de File-constructor.

Als het bestand is -zoals de pakketnaam doet vermoeden- is eigenlijkeen volwaardige eigenschappenbestand(met key=valueregels) met alleen de “verkeerde” extensie, dan zou je de InputStreamonmiddellijk kunnen voeden naar de load()methode.

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

Opmerking: wanneer u toegang probeert te krijgen vanuit de static-context, gebruik dan FileLoader.class(of wat dan ook YourClass.class) in plaats van getClass()in bovenstaande voorbeelden.


Antwoord 2, autoriteit 32%

Het relatieve pad werkt in Java met de .specificatie.

  • .betekent dezelfde map als de huidige context.
  • ..betekent de bovenliggende map van de huidige context.

Dus de vraag is hoe weet je het pad waar de Java momenteel naar zoekt?

Doe een klein experiment

  File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

Let op de uitvoer, u zult de huidige map leren kennen waar Java naar zoekt. Gebruik vanaf daar gewoon de specificatie ./om uw bestand te lokaliseren.

Bijvoorbeeld als de uitvoer is

G:\JAVA8Ws\MyProject\content.

en uw bestand is aanwezig in de map “MyProject”, gebruik gewoon

File resourceFile = new File("../myFile.txt");

Hopelijk helpt dit.


Antwoord 3, autoriteit 25%

De volgende regel kan worden gebruikt als we het relatieve pad van het bestand willen specificeren.

File file = new File("./properties/files/ListStopWords.txt");  

Antwoord 4, autoriteit 5%

InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}

Antwoord 5, autoriteit 3%

probeer .\properties\files\ListStopWords.txt


Antwoord 6, autoriteit 3%

Ik had kunnen reageren, maar daar heb ik minder reputatie voor.
Het antwoord van Samrat deed het werk voor mij. Het is beter om het huidige mappad te zien via de volgende code.

  File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

Ik heb het gewoon gebruikt om een ​​probleem te verhelpen waar ik in mijn project werd geconfronteerd. Gebruik het om te gebruiken ./ om terug naar de bovenliggende map van de huidige map.

   ./test/conf/appProperties/keystore 

7, Autoriteit 2%

Aangenomen dat u wilt lezen van resourcesmap in FileSystemklasse.

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);
System.out.println(Files.readString(path));

Opmerking: toonaangevend .is niet nodig.


8

Ik wilde parse ‘Command.json’ in Src / Main // JS / Simulator.java. Daarvoor kopieerde ik JSON-bestand in SRC-map en gaf het absolute pad als volgt:

Object obj  = parser.parse(new FileReader("./src/command.json"));

9

Voor mij is het probleem eigenlijk dat het klassepad van het File-object afkomstig is van <project folder path> or ./src, dus gebruik File file = new File("./src/xxx.txt");mijn probleem opgelost


Antwoord 10

Voor mij werkte het met –

   String token = "";
    File fileName = new File("filename.txt").getAbsoluteFile();
    Scanner inFile = null;
    try {
        inFile = new Scanner(fileName);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    while( inFile.hasNext() )
    {
        String temp = inFile.next( );  
        token = token + temp;
    }
    inFile.close(); 
    System.out.println("file contents" +token);

Antwoord 11

String basePath = new File(“myFile.txt”).getAbsolutePath();
dit basispad kun je gebruiken als het juiste pad van je bestand


Antwoord 12

als je het eigenschappenbestand wilt laden uit de bronnenmap die beschikbaar is in de src-map, gebruik dan dit

String resourceFile = "resources/db.properties";
InputStream resourceStream = ClassLoader.getSystemClassLoader().getResourceAsStream(resourceFile);
Properties p=new Properties();  
p.load(resourceStream);  
    System.out.println(p.getProperty("db")); 

db.properties-bestanden bevatten sleutel en waarde db=sybase


Antwoord 13

Als u getClass()probeert aan te roepen vanuit de Static-methode of het statische blok, kunt u dit op de volgende manier doen.

Je kunt getClass()aanroepen op het Properties-object waarin je laadt.

public static Properties pathProperties = null;
static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

Antwoord 14

Als het tekstbestand niet wordt gelezen, probeer dan een dichter absoluut pad te gebruiken (als je wilt .)
je zou het volledige absolute pad kunnen gebruiken,) als volgt:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

neem aan dat het absolute pad is:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt

Other episodes