Как относительные пути к файлам работают в Eclipse?

Итак, мое решение на Новый 2009 год — изучить Java. Недавно я приобрел "Java для чайников" и следил за демонстрационным кодом в книге, переписывая его с помощью Eclipse. Во всяком случае, каждый пример в книге, использующий относительный путь, похоже, не читает файл .txt, из которого он должен читать.

Вот пример кода:

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

И вы можете видеть на снимке экрана ниже, что я включил этот файл.

изображение больше недоступно

Кроме того, я проверил, что при сборке приложения копия Hankees.txt помещается в папку bin с скомпилированными файлами .class.

Наконец, если я изменю строку 12 на следующую и помещу Hankees.txt в корень моего диска C:\, программа скомпилируется и запустится нормально.

Scanner myScanner = new Scanner(new File("C:\\Hankees.txt"));

В общем, у меня вопрос, что я делаю не так? Или Eclipse как-то отвечает за это?

Спасибо за любую помощь!


person PHLAK    schedule 12.01.2009    source источник
comment
Попутный комментарий: я с подозрением отношусь к любой книге, в названии которой есть пустышки. Попробуйте «Мышление на Java» Брюса Экеля или «Изучение Java» Нимейера и Кнудсена, оба очень хороши.   -  person Jason S    schedule 13.01.2009
comment
В прошлый раз, когда я проверял Java для чайников, он был основан на Java 1.2. Они обновили его недавно?   -  person Michael Myers    schedule 14.01.2009


Ответы (6)


Вам нужно "src/Hankees.txt"

Ваш файл находится в исходной папке, которая не считается рабочим каталогом.\

Или вы можете переместить файл в корневой каталог вашего проекта и просто использовать "Hankees.txt"

person jjnguy    schedule 12.01.2009
comment
Да, это сработало! Можете ли вы объяснить, почему это происходит? В конце концов, файл находится в папке src, где хранятся файлы .class, зачем мне снова определять папку src? - person PHLAK; 13.01.2009
comment
Гм, я считаю, что затмения по замыслу делают каталог верхнего уровня вашего проекта рабочим каталогом программы. Я не знаю, почему они так делают. И у многих людей есть папки /bin и /src, поэтому /src не там, где файлы .class. - person jjnguy; 13.01.2009
comment
что, если у вас есть файл в папке в корневом каталоге, например Baseball/players/Hankees.txt? - person elemjay19; 11.11.2009
comment
Это путь, который вы должны использовать тогда. Baseball/players/Hankees.txt - person jjnguy; 11.11.2009
comment
Предположим, у вас есть: ProjectName : Baseball : players : Hankees.txt - person jjnguy; 11.11.2009
comment
Что, если это просто имя проекта : игроки : Hankees.txt? - person elemjay19; 11.11.2009
comment
Затем используйте путь - players/Hankees.txt - person jjnguy; 11.11.2009
comment
Понятно! Спасибо за вашу помощь! - person elemjay19; 11.11.2009
comment
Я смущен. Он говорит, что я должен переместить файл Hankees.txt в корневой каталог или класс java? - person Lawful Lazy; 10.05.2016
comment
У меня есть файл с именем names.dat в папке src, но когда я пытаюсь его открыть, я получаю java.io.FileNotFoundException: names.dat (No such file or directory). Мой основной класс находится в пакете. Я также пытался поместить файл в пакет, но это не сработало. - person Aaron Franke; 14.02.2018

Путь сборки проекта определяет, какие ресурсы из исходных папок копируются в выходные папки. Обычно для этого параметра установлено значение «Включить все файлы».

Новые конфигурации запуска по умолчанию используют каталог проекта в качестве рабочего каталога, хотя это также можно изменить.

Этот код показывает разницу между рабочим каталогом и местом, откуда был загружен класс:

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

Вывод, вероятно, будет примерно таким:

C:\your\project\directory
/C:/your/project/directory/bin/
person Stephen Denne    schedule 12.01.2009

Это действительно похоже на другой вопрос. Как мне загружать файлы в мое приложение Java?

Как мне загрузить файлы в приложение Java?

Вы не хотите загружать свои файлы:

C:\your\project\file.txt

это плохо!

Вы должны использовать getResourceAsStream.

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

А также вы должны использовать File.separator; который является системно-зависимым символом-разделителем имен, представленным в виде строки для удобства.

person Bernie Perez    schedule 13.01.2009
comment
Вы должны сказать, почему «это плохо» - person jason; 27.06.2011
comment
Почему это плохо, лучше описано в ссылке, которую я разместил. Это TLDR; отвечать :) - person Bernie Perez; 21.07.2011
comment
docs.oracle .com/javase/7/docs/api/java/lang/ говорит: The name of a resource is a '/'-separated path name that identifies the resource. Поэтому вам не следует использовать File.separator. Вы указываете здесь имя ресурса, а не путь к файловой системе. - person Vsevolod Golovanov; 18.08.2015
comment
Как насчет DataInputStream? - person Aaron Franke; 14.02.2018

Да, eclipse видит верхний каталог как рабочий/корневой каталог для целей путей.

... просто подумал, что добавлю дополнительную информацию. Я здесь новенький! Я хотел бы помочь.

person nasty pasty    schedule 12.01.2009

Вы всегда можете получить свой путь выполнения, используя:

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

Это предоставляет ценную информацию о том, куда поместить файлы и ресурсы.

person Sudip Bhandari    schedule 25.07.2017
comment
Потрясающий! Большое спасибо, это действительно вернуло путь, содержащий папку src (без \ в конце). Знаете ли вы о каких-либо ограничениях его функциональности? Например. зависимость от платформы/ОС. - person a.t.; 04.06.2019

Перефразируя с http://java.sun.com/javase/6/docs/api/java/io/File.html:

Классы под java.io разрешают относительные пути к текущему пользовательскому каталогу, который обычно является каталогом, в котором была запущена виртуальная машина.

Eclipse устанавливает рабочий каталог в папку проекта верхнего уровня.

person Rob    schedule 12.01.2009