2009-01-12 24 views
51

Vì vậy, năm 2009, độ phân giải năm mới của tôi là học Java. Gần đây tôi đã mua "Java for Dummies" và đã được theo dõi cùng với mã trình diễn trong cuốn sách bằng cách viết lại nó bằng Eclipse. Dù sao, mọi ví dụ trong cuốn sách sử dụng đường dẫn tương đối dường như không đọc tệp .txt mà nó phải đọc từ đó.Đường dẫn tệp tương đối hoạt động như thế nào trong Eclipse?

Đây là đoạn mã mẫu:

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

Và bạn có thể nhìn thấy trong ảnh chụp màn hình dưới đây tôi đã bao gồm tập tin này.

ảnh này không còn có sẵn

Ngoài ra, tôi đã xác minh rằng khi tôi xây dựng ứng dụng đó một bản sao của Hankees.txt được đặt trong thư mục bin với các tập tin biên soạn .class.

Cuối cùng, nếu tôi thay đổi dòng 12 thành phần sau và đặt Hankees.txt trong thư mục gốc của C: \, chương trình biên dịch và chạy tốt.

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

Vì vậy, về cơ bản, câu hỏi của tôi là tôi đang làm gì sai? Hoặc là Eclipse chịu trách nhiệm về điều này theo một cách nào đó?

Cảm ơn mọi sự giúp đỡ!

+1

nhận xét tiếp tuyến: Tôi là bất kỳ cuốn sách nào có "núm vú" trong tiêu đề. Hãy thử "Thinking in Java" của Bruce Eckel hoặc "Learning Java" của Niemeyer & Knudsen, cả hai đều rất tốt. –

+0

Thời gian qua tôi đã kiểm tra Java cho Dummies, nó là Java 1.2. Họ đã cập nhật nó gần đây chưa? –

Trả lời

69

Bạn cần "src/Hankees.txt"

tập tin của bạn trong thư mục nguồn mà không được tính là thư mục làm việc. \

Hoặc bạn có thể di chuyển các tập tin đến thư mục gốc của dự án của bạn và chỉ sử dụng "Hankees.txt"

+0

Yup, đã hoạt động! Bạn có thể giải thích tại sao điều này xảy ra? Sau đó, tệp nằm trong thư mục src nơi tệp .class được lưu trữ, tại sao tôi phải định nghĩa lại thư mục src? – PHLAK

+4

Um, tôi tin rằng nhật thực bằng cách thiết kế làm cho thư mục toplevel của dự án của bạn là thư mục làm việc của chương trình. Tôi không biết tại sao họ làm theo cách đó. Và rất nhiều người có/bin và/src thư mục, do đó,/src không phải là nơi các tập tin .class được. – jjnguy

+0

nếu bạn có tệp trong thư mục trong thư mục gốc, như Baseball/players/Hankees.txt? –

5

Vâng, nhật thực thấy thư mục trên cùng là thư mục làm việc/thư mục gốc, cho mục đích của đường dẫn.

... chỉ nghĩ rằng tôi muốn thêm một số thông tin bổ sung. Tôi là người mới ở đây! Tôi muốn giúp đỡ.

2

Trích tóm lược từ http://java.sun.com/javase/6/docs/api/java/io/File.html:

Các lớp dưới tên đường dẫn tương đối java.io quyết tâm chống lại các thư mục người dùng hiện tại, mà thường là thư mục trong đó máy ảo đã được bắt đầu.

Eclipse đặt thư mục làm việc vào thư mục dự án cấp cao nhất.

7

Đường dẫn xây dựng của dự án xác định tài nguyên nào từ thư mục nguồn của bạn được sao chép vào thư mục đầu ra của bạn. Thông thường, cài đặt này được đặt thành Bao gồm tất cả các tệp.

Cấu hình chạy mới mặc định để sử dụng thư mục dự án cho thư mục làm việc, mặc dù điều này cũng có thể được thay đổi.

code này cho thấy sự khác biệt giữa các thư mục làm việc, và vị trí của nơi lớp đã được nạp từ:

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

Sản lượng có khả năng là một cái gì đó như:

C:\your\project\directory 
/C:/your/project/directory/bin/ 
7

Đây là thực sự tương tự như một câu hỏi khác. How should I load files into my Java application?

Tôi nên tải tệp của mình vào ứng dụng Java của mình như thế nào?

Bạn không muốn tải tập tin của bạn trong bởi:

C:\your\project\file.txt 

đây là xấu!

Bạn nên sử dụng getResourceAsStream.

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

Và bạn cũng nên sử dụng File.separator; là ký tự phân tách tên phụ thuộc vào hệ thống, được biểu diễn dưới dạng chuỗi để thuận tiện.

+0

Thông tin tốt để biết, cảm ơn! – PHLAK

+1

Bạn nên nói lý do tại sao 'điều này là xấu' – jason

+1

"Tại sao điều này là xấu" được mô tả tốt hơn trong liên kết tôi đã đăng.Đây là tldr; answer :) –

1

tôi có cùng sự cố. Nếu YourClass và Hankees.txt có một thư mục trong dự án của bạn thì tôi tìm thấy sau đây - không quá tệ.

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

Điều đó không làm việc, nó trả về một null với FileNotFound (Java 1.7) trong chương trình tương tự của tôi. – Pille

1

Bạn luôn có thể con đường thời gian chạy của bạn bằng cách sử dụng:

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

này cung cấp thông tin có giá trị về nơi để đặt các tập tin và tài nguyên.

Các vấn đề liên quan