जावा फाइलिंग को आर्गन्स में क्यों नहीं डालता है?


20

सी और सी ++ में, मुख्य विधि argv पर सरणी की पहली स्थिति में फ़ाइल नाम रखती है [0]। जावा में, हालांकि, फ़ाइल नाम को args स्ट्रिंग ऐरे में शामिल नहीं किया गया है।

क्या इसका कोई व्यावहारिक कारण है? मैं समझता हूं कि यह 1-आधारित के बजाय कमांड-लाइन तर्कों को 0-आधारित के माध्यम से पुनरावृत्त करता है, लेकिन क्या कोई लाभ है? क्या नाम मात्र को बेकार समझा गया?

जवाबों:


17

कुछ मामलों में एक कार्यक्रम को अलग-अलग तरीकों से चलाया जा सकता है और इसे कैसे कहा जाता है, इस पर अलग-अलग व्यवहार प्रदर्शित करते हैं। यदि आप कॉल vimकरते हैं vi, तो यह संगतता मोड में चलता है। कभी-कभी यह कई संबंधित कार्यक्रमों के एक संस्करण को बनाए रखने की कोशिश करता है - उदाहरण के लिए mailqऔर newaliasesकई यूनिक्स सिस्टम पर एक कड़ी है sendmailताकि ये कार्यक्रम सिंक में रहें)


जावा प्रोग्राम आम तौर पर इस प्रकार लागू होते हैं:

% जव -जर। foo.jar args
% जव फउ आगर

पहला संस्करण वह है जहां आपके पास एक मेनिफेस्ट फ़ाइल है जो मुख्य वर्ग को इंगित करती है, दूसरा संस्करण Fooवर्ग पथ में पाए गए वर्ग में मुख्य विधि को चलाता है ।

जावा के लिए प्रस्तुत की गई जानकारी या तो जार के लिए एक रास्ता है या वर्ग का नाम है।

जार का स्थान इतना महत्वपूर्ण नहीं है कि वह कोड से कुछ हो (और वास्तव में मूल कल्पना का हिस्सा नहीं था)। एक जार को वास्तव में कुछ भी नाम दिया जा सकता है, और अक्सर संस्करण संख्याएं शामिल होती हैं। और अधिक, कोई गारंटी नहीं है कि वर्ग को .jar में भी संग्रहीत किया गया था (इसे निकाला जा सकता था)।

जावा एप्लिकेशन के साथ -jarइसे दर्ज करने का केवल एक ही तरीका है - मैनिफेस्ट में परिभाषित वर्ग। कोई नाम नहीं है जो किया जा सकता है।

अन्य नाम, वर्ग नाम के साथ इसे लागू करने के लिए सीधे निष्पादन इकाई को इंगित करता है। Furthemore, इसे गुणा नहीं किया Bar.classजा सकता है - आप class Fooइसके लिए कोड नहीं हो सकते हैं बस इस तरह से काम नहीं करता है।

इससे पता चलता है कि वास्तव argv[0]में जावा एप्लिकेशन के लिए C अर्थ की जानकारी को पास करने का कोई मतलब नहीं है - इसका या तो javaअर्थहीन और मनमाना होना है, या उस वर्ग का नाम है जिसे आमंत्रित किया जा रहा है (जो आप पहले से ही कोड निष्पादित कर रहे हैं (आप कुछ कर सकते हैं जैसे getClass().getEnclosingClass().getName()कि आप हताश थे ...))।

यहाँ एक बिंदु है, आप एक .jar या वर्ग पथ पर कक्षाओं में कई मुख्य तरीकों को परिभाषित कर सकते हैं। और आप उन्हें अलग तरह से व्यवहार कर सकते हैं जैसे कि क्या बयानों की एक श्रृंखला argv[0]थी जो कि क्या था के आधार पर थी।

मेरे पास अतीत में कोड एंकिन है java -cp Foo.jar com.me.foo.Testजिसमें Testमैनिफेस्ट में परिभाषित एक के बजाय कक्षा की मुख्य विधि को लागू किया गया था।


उससे कहीं अधिक होना है। C # में, पैरामीटर में फ़ाइल का नाम नहीं है, लेकिन एप्लिकेशन को आमतौर पर सीधे निष्पादित किया जाता है, बस foo.exe
svick

@svick मैं C # से परिचित नहीं हूँ, और न ही कोई exe कैसे पैक किया जाता है। कुछ ओएस में आप एक जार निष्पादन योग्य (देखें बना सकते हैं इस ) जो प्रवेश बिंदु प्रकट में परिभाषित की शुरूआत। इसी तरह की बातें C # के लिए की जा सकती हैं। मुख्य बातें यह हैं कि आप फ़ाइल का नाम बदलकर प्रवेश बिंदु नहीं बदल सकते हैं, और फ़ाइल नाम का उपयोग एप्लिकेशन के किसी भी अन्य भाग (वर्ग लोडर के बाहर) द्वारा किया जाना नहीं है।

@nqzero ( संदर्भ ) - यदि मैं java com.me.Fooकमांड लाइन के रूप में निर्दिष्ट करता हूं , तो विधि com.me.Foo.main(String...)को लागू किया जा रहा है। उसके आसपास कोई रास्ता नहीं है। और मुझे पता है कि यह फू है जो आह्वान किया जा रहा है - अरगव में छड़ी करने का कोई कारण नहीं है। यह विशुद्ध रूप से बेमानी जानकारी होगी। ज़रूर, यह सुपरक्लास में हो सकता है, लेकिन मुझे कमांड लाइन मंगलाचरण क्या था की वांछित जानकारी के साथ इसे इंटरसेप्ट करने का तुच्छ अवसर है - इसे आरजीवी में डालने की कोई आवश्यकता नहीं है।

... और कृपया उत्तर को सुझाव देने के बजाय 50 प्रतिनिधि और टिप्पणी प्राप्त करना याद रखें। किसी दिए गए पोस्ट के साथ मुद्दों को उठाना एक बहुत ही खराब तरीका है।

कभी-कभी व्यवहार मौलिक रूप से भिन्न होता है। उदाहरण के लिए विप्र वास्तव में wget है।
मैकेंज़्म

-4

वास्तव में इसके साथ कोई लाभ नहीं है, यह वास्तव में उस प्रोग्रामिंग भाषा के सिंटैक्स पर निर्भर करता है जिसे आप उपयोग कर रहे हैं यदि यह 0-आधारित या 1-आधारित है। चर (आप फ़ाइल नाम के रूप में संदर्भित करते हैं) भी भाषा पर निर्भर करता है, यह अन्य भाषाओं में भिन्न हो सकता है बस जिस भाषा का आप उपयोग कर रहे हैं उसका सही सिंटैक्स का पालन करें।


1
यह पूछे गए प्रश्न का उत्तर कैसे देता है?
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.