web-dev-qa-db-ja.com

Eclipseで相対ファイルパスはどのように機能しますか?

したがって、2009年の新年の抱負はJavaを学ぶことです。私は最近「Java for Dummies」を買収し、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のコピーがコンパイル済みの.classファイルとともにbinフォルダーに配置されることを確認しました。

最後に、12行目を次のように変更し、C:\ドライブのルートにHankees.txtを配置すると、プログラムがコンパイルされ、正常に実行されます。

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

だから基本的に、私の質問は私が間違っているのは何ですか?または、Eclipseは何らかの方法でこれを担当していますか?

すべての助けてくれてありがとう!

53
PHLAK

"src/Hankees.txt"が必要です

ファイルは、作業ディレクトリとしてカウントされないソースフォルダーにあります。

または、プロジェクトのルートディレクトリにファイルを移動し、"Hankees.txt"を使用することができます

75
jjnguy

これは別の質問と非常に似ています。 ファイルをJavaアプリケーションに読み込む方法は?

Javaアプリケーションにファイルをロードするにはどうすればよいですか?

あなたはしないでください

C:\your\project\file.txt

これはbad!

GetResourceAsStreamを使用する必要があります。

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

また、File.separator;これは、システムに依存する名前区切り文字であり、便宜上文字列として表されます。

7
Bernie Perez

プロジェクトのビルドパスは、ソースフォルダーのどのリソースを出力フォルダーにコピーするかを定義します。通常、これはすべてのファイルを含めるように設定されます。

新しい実行構成では、デフォルトで作業ディレクトリにプロジェクトディレクトリが使用されますが、これも変更できます。

このコードは、作業ディレクトリとクラスのロード元の場所の違いを示しています。

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/
7
Stephen Denne

ええ、Eclipseはパスの目的で、最上位ディレクトリをworking/rootディレクトリと見なします。

...追加情報を追加すると思いました。ここに新しい!手伝いたいです。

5
nasty pasty

以下を使用することで、いつでもランタイムパスを取得できます。

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

これは、ファイルとリソースを配置する場所に関する貴重な情報を提供します。

2
Sudip Bhandari

http://Java.Sun.com/javase/6/docs/api/Java/io/File.html からの言い換え:

Java.ioの下のクラスは、現在のユーザーディレクトリ(通常は仮想マシンが起動されたディレクトリ)に対して相対パス名を解決します。

Eclipseは、作業ディレクトリを最上位のプロジェクトフォルダーに設定します。

2
Rob

私も同じ問題を抱えています。 YourClassとHankees.txtがプロジェクトに1つのディレクトリを持っている場合、私は以下を見つけます-それほど悪くはありません。

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