Как относительные пути к файлам работают в 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 со скомпилированным файлом .файл класса.

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

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

Итак, в основном, мой вопрос в том, что я делаю неправильно? Или затмение ответственно за это в некотором роде?

Спасибо за все и вся помогите!

7   51  

7 ответов:

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

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

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

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

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

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

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/

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

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

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

C:\your\project\file.txt

это плохо!

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

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

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

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

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

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

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

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

У меня такая же проблема. Если ваш класс и 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))
//<...>

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

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

Это дает ценную информацию о том, где размещать файлы и ресурсы.