2009-01-12 31 views
51

Bu yüzden 2009 yılındaki yeni çözümüm Java'yı öğrenmek. Kısa süre önce "Aptallar için Java" satın aldım ve Eclipse kullanarak tekrar yazarak kitaptaki demo kodunu takip ettim. Her neyse, kitaptaki göreli bir yol kullanan her örnek, okumak istediği .txt dosyasını okumaz gibi görünmüyor. İşte Göreli dosya yolları Eclipse'de nasıl çalışır?

örnek kod:

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

Ve ben bu dosyayı dahil ettik Aşağıdaki ekran resminde görebilirsiniz.

resim artık Ayrıca

mevcuttur, Doğruladım ben Hankees.txt bir kopyası .class derlenmiş dosyaları ile bin klasöre yerleştirilir uygulama oluşturduğunuzda.

Son olarak, satır 12'yi aşağıdaki şekilde değiştirir ve Hankees.txt dosyasını C: \ drive'ımın kök dizinine yerleştirirsem, program derler ve çalışır.

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

, benim sorum ben yanlış yapıyorum edilir? Ya da bir şekilde Eclipse sorumludur?

Yardımlarınız için teşekkürler!

+1

teğetsel yorum: Başlıkta "mankenler" bulunan herhangi bir kitabın temeli. Bruce Eckel'in "Java'da Düşünme" ya da Niemeyer & Knudsen'in "Java'yı Öğrenme" yi deneyin, her ikisi de çok iyi. –

+0

Son kez Dummies için Java'yı kontrol ettim, Java 1.2 tabanlıydı. Son zamanlarda güncellediler mi? –

cevap

69

İhtiyacınız "src/Hankees.txt"

Dosyanız. Çalışma dizini olarak sayılmaz kaynak klasöründe \

olduğu Yoksa projenizin kök dizinine dosyayı taşımak ve sadece "Hankees.txt" kullanabilirsiniz

+0

Yup, işe yaradı! Bunun neden olduğunu açıklayabilir misiniz? Afterall, dosya .class dosyalarının saklandığı src klasöründedir, neden tekrar src klasörünü tanımlamalıyım? – PHLAK

+4

Um, tasarımdan kaynaklanan eklerin, projenizin üst düzey dizinini programın çalışma dizinini oluşturduğuna inanıyorum. Bunu neden böyle yaptığını bilmiyorum. Ve birçok kişi/bin ve/src klasörlerine sahiptir, bu yüzden/src .class dosyalarının olmadığı yerdir. – jjnguy

+0

Dosyada, kök dizinin altında, Beyzbol/oyuncular/Hankees.txt gibi bir klasörde ne var? –

5

Evet, tutulma, yolların amaçları için üst dizini çalışma/kök dizini olarak görür.

... sadece biraz fazladan bilgi ekleyeceğimi düşündüm. Ben burada yeniyim! Yardımcı olmak isterim.

2

http://java.sun.com/javase/6/docs/api/java/io/File.html dan alıntı yapan: genellikle sanal makine başlandı dizindir geçerli kullanıcı dizininde, karşı java.io gidermek göreli yol adlarının altında

sınıflar.

Eclipse, çalışma dizinini en üst düzey proje klasörüne ayarlar.

7

Bir projenin oluşturma yolu, kaynak klasörlerinizden hangi kaynakların çıktı klasörlerine kopyalandığını tanımlar. Genellikle bu, tüm dosyaları içerecek şekilde ayarlanır.

Yeni çalışma yapılandırmaları varsayılan olarak, çalışma dizini için proje dizini kullanılmasına rağmen, bu da değiştirilebilir.Bu

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

: çıktı gibi bir şey olması muhtemeldir

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

:

Bu kod çalışma dizinine arasındaki farkı ve sınıf yüklenen yerin konumunu gösterir başka bir soruya gerçekten benzer. How should I load files into my Java application?

Dosyalarımı Java Uygulamamda nasıl yüklemeliyim?

Sen tarafından dosyalarınızı yüklemek ister misiniz :

C:\your\project\file.txt 

bu kötü!

GetResourceAsStream'i kullanmalısınız.

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

Ve ayrıca kullanmalısınız File.separator; kolaylık için bir dize olarak gösterilen sisteme bağlı isim ayırıcı karakteridir.

+0

Bilmekte fayda var, teşekkürler! – PHLAK

+1

'Neden bu' kötü ' – jason

+1

' Neden bunun kötü olduğunu 'niçin yayınladığım linkte daha iyi tarif edildiğini söylemelisiniz.Bu tldr; cevap :) –

1

Aynı sorunu yaşıyorum. Eğer YourClass ve Hankees.txt projenizde bir dizin varsa o zaman, o kadar da kötü değil.

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

Bu işe yaramaz, benzer programımda FileNotFound (Java 1.7) ile boş bir değer döndürür. – Pille

1

Hep kullanarak çalışma zamanı yolunu alabilirsiniz:

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

Bu dosyaları ve kaynakları nereye hakkında değerli bilgiler sağlar.

İlgili konular