Jak działają względne ścieżki plików w Eclipse?

Więc moim postanowieniem na Nowy Rok 2009 jest nauka Javy. Niedawno nabyłem "Java for Dummies" i śledziłem wraz z kodem demo w książce, pisząc go ponownie za pomocą Eclipse. W każdym razie, każdy przykład w książce, który używa ścieżki względnej nie wydaje się czytać .plik txt, z którego ma być odczytany.

Oto przykładowy kod:

import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.GridLayout;

class TeamFrame extends JFrame {

    public TeamFrame() throws IOException {
        PlayerPlus player;
        Scanner myScanner = new Scanner(new File("Hankees.txt"));

        for (int num = 1; num <= 9; num++) {
            player = new PlayerPlus(myScanner.nextLine(), myScanner.nextDouble());
            myScanner.nextLine();
            addPlayerInfo(player);
        }      

        add(new JLabel());
        add(new JLabel("   ------"));
        add(new JLabel("Team Batting Aberage:"));
        add(new JLabel(PlayerPlus.findTeamAverageString()));
        setTitle("The Hankees");
        setLayout(new GridLayout(11,2));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    void addPlayerInfo(PlayerPlus player) {
        add(new JLabel(player.getName()));
        add(new JLabel(player.getAverageString()));
    }
}

I widać na poniższym zrzucie ekranu załączam ten plik.

obraz już nie dostępne

Również, zweryfikowałem, że kiedy buduję aplikację, że kopia Hankees.txt jest umieszczony w folderze bin z skompilowanym .pliki klas.

Na koniec, jeśli zmienię linię 12 na następującą i umieszczę Hankees.txt w korzeniu mojego C:\ drive program kompiluje i działa dobrze.

Scanner myScanner = new Scanner(new File("C:\\Hankees.txt"));
Więc moje pytanie brzmi, co robię źle? A może Eclipse jest za to w jakiś sposób odpowiedzialny?

Dzięki za wszelką pomoc!

Author: M. A. Kishawy, 2009-01-13

7 answers

Potrzebujesz "src/Hankees.txt"

Twój plik znajduje się w folderze źródłowym, który nie jest liczony jako katalog roboczy.\

Lub możesz przenieść plik do katalogu głównego projektu i po prostu użyć "Hankees.txt"

 71
Author: jjnguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-12 23:10:25

Ścieżka budowania projektu określa, które zasoby z folderów źródłowych są kopiowane do folderów wyjściowych. Zazwyczaj jest to ustawione tak, aby obejmowały wszystkie pliki.

Nowe konfiguracje uruchamiania domyślnie używają katalogu projektu dla katalogu roboczego, choć można to również zmienić.

Ten kod pokazuje różnicę między katalogiem roboczym, a lokalizacją, z której klasa została załadowana:

public class TellMeMyWorkingDirectory {
    public static void main(String[] args) {
        System.out.println(new java.io.File("").getAbsolutePath());
        System.out.println(TellMeMyWorkingDirectory.class.getClassLoader().getResource("").getPath());
    }
}

Wyjście prawdopodobnie będzie wyglądało tak:

C:\your\project\directory
/C:/your/project/directory/bin/
 7
Author: Stephen Denne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-12 23:37:43

To jest naprawdę podobne do innego pytania. Jak ładować pliki do aplikacji Java?

Jak załadować pliki do aplikacji Java?

You do not want to load your files in by:

C:\your\project\file.txt

To jest złe!

Powinieneś użyć getResourceAsStream.

InputStream inputStream = YourClass.class.getResourceAsStream(“file.txt”);

A także należy użyć pliku .separator ; który jest zależnym od systemu znakiem separatora nazw, reprezentowanym jako ciąg znaków dla wygoda.

 7
Author: Bernie Perez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:44

Tak, eclipse widzi katalog górny jako działający/główny, dla celów ścieżek.

...pomyślałem, że dodam jakieś dodatkowe informacje. Jestem tu nowy! Chciałbym pomóc.

 5
Author: nasty pasty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-12 23:23:33

Parafrazując z http://java.sun.com/javase/6/docs/api/java/io/File.html :

Klasy pod java.io rozwiązują ścieżki względne względem bieżącego katalogu użytkownika, który jest zazwyczaj katalogiem, w którym uruchomiona została maszyna wirtualna.

Eclipse ustawia katalog roboczy na folder projektu najwyższego poziomu.

 2
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-12 23:33:41

Mam ten sam problem. Jeśli Twoja klasa i Hankees.txt mieć jeden katalog w projekcie, a następnie, uważam, że następujące-nie tak źle.

import java.net.URL;
//<...>
URL url = YourClass.class.getClassLoader().getResource("Hankees.txt");
String filesPathAndName = url.getPath();        
Scanner myScanner = new Scanner(new File(filesPathAndName))
//<...>
 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 09:46:56

Możesz zawsze uzyskać ścieżkę runtime używając:

 String path = new File(".").getCanonicalPath();

Dostarcza cennych informacji o tym, gdzie umieścić pliki i zasoby.

 1
Author: Sudip Bhandari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 06:13:05