Как относительные пути к файлам работают в Eclipse? - PullRequest
53 голосов
/ 13 января 2009

Итак, мое новогоднее решение 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 как-то отвечает за это?

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

Ответы [ 7 ]

75 голосов
/ 13 января 2009

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

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

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

7 голосов
/ 14 января 2009

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

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

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

C:\your\project\file.txt

это плохо!

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

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

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

7 голосов
/ 13 января 2009

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

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

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

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/
5 голосов
/ 13 января 2009

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

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

2 голосов
/ 25 июля 2017

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

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

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

2 голосов
/ 13 января 2009

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

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

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

1 голос
/ 09 июля 2009

У меня та же проблема. Если у YourClass и Hankees.txt есть один каталог в вашем проекте, тогда я нахожу следующее - не так уж и плохо.

import java.net.URL;
//<...>
URL url = YourClass.class.getClassLoader().getResource("Hankees.txt");
String filesPathAndName = url.getPath();        
Scanner myScanner = new Scanner(new File(filesPathAndName))
//<...>
...