2009-01-12 16 views
51

तो 200 9 के नए साल के संकल्प जावा सीखना है। मैंने हाल ही में "डमीज़ के लिए जावा" हासिल किया है और पुस्तक में डेमो कोड के साथ ग्रहण का उपयोग करके इसे फिर से लिखकर निम्नलिखित किया है। वैसे भी, एक सापेक्ष पथ का उपयोग करने वाली पुस्तक में प्रत्येक उदाहरण उस .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 संकलित फाइलों के साथ बिन फ़ोल्डर में रखा गया है निर्माण।

आखिरकार, यदि मैं निम्नलिखित पंक्तियों को पंक्ति 12 में बदलता हूं और मेरे सी: \ ड्राइव की जड़ में Hankees.txt डालता हूं तो प्रोग्राम संकलित करता है और ठीक चलता है।

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

तो मूल रूप से, मेरा सवाल यह है कि मैं क्या गलत कर रहा हूं? या ग्रहण किसी के लिए जिम्मेदार है?

किसी भी और सभी मदद के लिए धन्यवाद!

+1

स्पर्शपूर्ण टिप्पणी: मैं किसी भी पुस्तक की नींद लेता हूं जिसमें शीर्षक में "डमी" है। ब्रूस एकल की "जावा इन थिंकिंग" या निमेयर एंड न्यूडसेन की "लर्निंग जावा" आज़माएं, दोनों बहुत अच्छे हैं। –

+0

पिछली बार मैंने डमीज़ के लिए जावा की जांच की, यह जावा 1.2-आधारित था। क्या उन्होंने हाल ही में इसे अपडेट किया है? –

उत्तर

69

आप की जरूरत है "src/Hankees.txt"

आपकी फ़ाइल जो कार्यशील निर्देशिका के रूप में नहीं गिना जाता है स्रोत फ़ोल्डर पर है। \

या आप अपनी परियोजना के रूट निर्देशिका में फाइल को स्थानांतरित कर सकते हैं और सिर्फ "Hankees.txt" का उपयोग

+0

यूप, यह काम किया! क्या आप समझा सकते हैं कि ऐसा क्यों होता है? आखिरकार, फ़ाइल उस src फ़ोल्डर में है जहां .class फ़ाइलें संग्रहीत हैं, मुझे फिर से src फ़ोल्डर को परिभाषित क्यों करना है? – PHLAK

+4

उम, मेरा मानना ​​है कि डिज़ाइन द्वारा ग्रहण कार्यक्रम आपके प्रोजेक्ट की कार्यशील निर्देशिका की अपूर्ण निर्देशिका बनाता है। मुझे नहीं पता कि वे ऐसा क्यों करते हैं। और बहुत से लोगों में/bin और/src फ़ोल्डर्स हैं, इसलिए/src नहीं है जहां .class फ़ाइलें हैं। – jjnguy

+0

क्या होगा यदि आपके पास रूट निर्देशिका के अंतर्गत किसी फ़ोल्डर में फ़ाइल है, जैसे बेसबॉल/प्लेयर/Hankees.txt? –

5

हाँ, ग्रहण पथ के उद्देश्यों के लिए शीर्ष निर्देशिका को कार्य/रूट निर्देशिका के रूप में देखता है।

... बस सोचा कि मैं कुछ अतिरिक्त जानकारी जोड़ूंगा। मैं यहाँ नया हूँ! मैं मदद करना चाहता हूँ।

2

http://java.sun.com/javase/6/docs/api/java/io/File.html से Paraphrasing:

वर्तमान उपयोगकर्ता निर्देशिका, जो आम तौर निर्देशिका जिसमें आभासी मशीन शुरू किया गया था है के खिलाफ java.io संकल्प रिश्तेदार pathnames के तहत कक्षाएं।

ग्रहण कार्यशील निर्देशिका को शीर्ष-स्तरीय प्रोजेक्ट फ़ोल्डर में सेट करता है।

7

एक प्रोजेक्ट का निर्माण पथ परिभाषित करता है कि आपके स्रोत फ़ोल्डर से कौन से संसाधन आपके आउटपुट फ़ोल्डर्स में कॉपी किए गए हैं। आमतौर पर यह सभी फाइलों को शामिल करने के लिए सेट है।

नई रन कॉन्फ़िगरेशन कार्यशील निर्देशिका के लिए प्रोजेक्ट निर्देशिका का उपयोग करने के लिए डिफ़ॉल्ट है, हालांकि इसे भी बदला जा सकता है।

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

यह वह जगह है

इस कोड को कार्यशील निर्देशिका के बीच का अंतर है, और जहां वर्ग से लोड किया गया था के स्थान से पता चलता वास्तव में एक और सवाल के समान। How should I load files into my Java application?

मुझे अपने जावा एप्लिकेशन में अपनी फ़ाइलों को कैसे लोड करना चाहिए?

आप नहीं द्वारा अपनी फ़ाइलें लोड करना चाहते हैं :

C:\your\project\file.txt 

इस बुरा है!

आपको getResourceAsStream का उपयोग करना चाहिए।

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

और यह भी आप का उपयोग करना चाहिए File.separator; जो सिस्टम-निर्भर नाम-विभाजक चरित्र है, जो सुविधा के लिए स्ट्रिंग के रूप में दर्शाया गया है।

+0

अच्छी जानकारी जानने के लिए, धन्यवाद! – PHLAK

+1

आपको कहना चाहिए कि 'यह बुरा क्यों है' – jason

+1

"यह क्यों बुरा है" मेरे द्वारा पोस्ट किए गए लिंक में बेहतर वर्णन किया गया है।यह tldr है; उत्तर :) –

1

मुझे एक ही समस्या है। यदि आपकी परियोजना में YourClass और Hankees.txt की एक निर्देशिका है, तो मुझे निम्न मिलता है - इतना बुरा नहीं।

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

यह जहां फ़ाइलों और संसाधनों डाल करने के लिए के बारे में महत्वपूर्ण जानकारी प्रदान करता है:

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

यह काम नहीं करता है, यह मेरे समान प्रोग्राम में FileNotFound (जावा 1.7) के साथ एक शून्य वापस लौटाता है। – Pille

1

तुम हमेशा का उपयोग करके अपने क्रम पथ प्राप्त कर सकते हैं।

संबंधित मुद्दे