2008-11-28 15 views
11

का उपयोग कर फ़ाइल खोलने के लिए क्रॉस-प्लेटफार्म तरीका मैं जावा 1.5 का उपयोग कर रहा हूं और मैं फ़ाइल खोलने के लिए संबंधित एप्लिकेशन लॉन्च करना चाहता हूं। मुझे पता है कि जावा 1.6 ने Desktop API पेश किया है, लेकिन मुझे जावा 1.5 के लिए समाधान की आवश्यकता है।जावा 1.5

Runtime.getRuntime().exec(new String[]{ "rundll32", 
          "url.dll,FileProtocolHandler", fileName }); 

वहाँ एक पार मंच तरीका यह करने के लिए है:

अब तक मैं एक तरह से Windows में यह करने के लिए मिल गया? या कम से कम लिनक्स के लिए एक समान समाधान?

उत्तर

11

+1 this answer

इसके अतिरिक्त मैं निम्नलिखित कार्यान्वयन बहुरूपता उपयोग करने का सुझाव होगा।

क्लाइंट कोड:

Desktop desktop = Desktop.getDesktop(); 

desktop.open(aFile); 
desktop.imaginaryAction(aFile); 

डेस्कटॉप impl:

package your.pack.name; 

import java.io.File; 

public class Desktop{ 

    // hide the constructor. 
    Desktop(){} 

    // Created the appropriate instance 
    public static Desktop getDesktop(){ 

     String os = System.getProperty("os.name").toLowerCase(); 

     Desktop desktop = new Desktop(); 
     // This uf/elseif/else code is used only once: here 
     if (os.indexOf("windows") != -1 || os.indexOf("nt") != -1){ 

      desktop = new WindowsDesktop(); 

     } else if (os.equals("windows 95") || os.equals("windows 98")){ 

      desktop = new Windows9xDesktop(); 

     } else if (os.indexOf("mac") != -1) { 

      desktop = new OSXDesktop(); 

     } else if (os.indexOf("linux") != -1 && isGnome()) { 

      desktop = new GnomeDesktop(); 

     } else if (os.indexOf("linux") != -1 && isKde()) { 

      desktop = new KdeDesktop(); 

     } else { 
      throw new UnsupportedOperationException(String.format("The platform %s is not supported ",os)); 
     } 
     return desktop; 
    } 

    // default implementation :( 
    public void open(File file){ 
     throw new UnsupportedOperationException(); 
    } 

    // default implementation :( 
    public void imaginaryAction(File file ){ 
     throw new UnsupportedOperationException(); 
    } 
} 

// One subclass per platform below: 
// Each one knows how to handle its own platform 


class GnomeDesktop extends Desktop{ 

    public void open(File file){ 
     // Runtime.getRuntime().exec: execute gnome-open <file> 
    } 

    public void imaginaryAction(File file){ 
     // Runtime.getRuntime().exec:gnome-something-else <file> 
    } 

} 
class KdeDesktop extends Desktop{ 

    public void open(File file){ 
     // Runtime.getRuntime().exec: kfmclient exec <file> 
    } 

    public void imaginaryAction(File file){ 
     // Runtime.getRuntime().exec: kfm-imaginary.sh <file> 
    } 
} 
class OSXDesktop extends Desktop{ 

    public void open(File file){ 
     // Runtime.getRuntime().exec: open <file> 
    } 

    public void imaginaryAction(File file){ 
     // Runtime.getRuntime().exec: wow!! <file> 
    } 
} 
class WindowsDesktop extends Desktop{ 

    public void open(File file){ 
     // Runtime.getRuntime().exec: cmd /c start <file> 
    } 

    public void imaginaryAction(File file){ 
     // Runtime.getRuntime().exec: ipconfig /relese /c/d/e 
    } 
} 
class Windows9xDesktop extends Desktop{ 

    public void open(File file){ 
     //Runtime.getRuntime().exec: command.com /C start <file> 
    } 

    public void imaginaryAction(File file){ 
     //Runtime.getRuntime().exec: command.com /C otherCommandHere <file> 
    } 
} 

यह केवल एक उदाहरण है, में वास्तविक जीवन parametrize को केवल एक नया वर्ग पैदा करने के लिए लायक नहीं है है एक मान (कमांड स्ट्रिंग% s) लेकिन आइए कल्पना करें कि प्रत्येक विधि प्लेटफार्म विशिष्ट तरीके से एक और कदम करती है।

इस तरह के दृष्टिकोण को करने से, अनइडेड हटाया जा सकता है अगर/elseif/else यह कहता है कि समय के साथ बग पेश कर सकते हैं (यदि कोड में इनमें से 6 हैं और बदलाव की ज़रूरत है, तो आप उनमें से एक को अपडेट करना भूल सकते हैं, या प्रतिलिपि/पेस्ट करके आप निष्पादित करने के लिए कमांड को बदलना भूल सकते हैं)

+0

यह समाधान नहीं है –

+0

@ क्रिज़िज़टोफिकोकी आप यह समझाने में असफल हो जाते हैं कि आपको ऐसा क्यों लगता है कि यह समाधान नहीं है, इस तरह, इस उत्तर को पढ़ने वाले लोग मूल्यांकन कर सकते हैं कि इसका उपयोग करना है या नहीं यह या नहीं। – OscarRyz

+0

आपने कोई भी कोड नहीं दिखाया जो वास्तव में काम करता है और जावा 1.5 के लिए डिफ़ॉल्ट ब्राउज़र खोलता है, इसके लिए केवल कुछ कंकाल बिना किसी उपयोगी कार्यान्वयन के, यह एक समाधान नहीं है। –

4

SWT आप के माध्यम से एक फ़ाइल खोलने के लिए मानक कार्यक्रम के लिए lokk की संभावना देता है:

final Program p = Program.findProgram(fileExtension); 
p.execute(file.getAbsolutePath()); 

कड़ाई से इस पार मंच के बाद से SWT मंच निर्भर है नहीं है, लेकिन हर मंच के लिए आप एक का उपयोग कर सकते diffenrent SWT जार।

+0

नोट: प्रोग्राम.जावा का स्रोत यहां http://kickjava.com/src/org/eclipse/swt/program/Program.java.htm है। हो सकता है कि – VonC

+0

मदद कर सकता है शायद यह जावा 1.5 + एसडब्ल्यूटी उपयोगकर्ताओं के लिए बहुत उपयोगी है। लेकिन केवल एसडब्ल्यूटी का उपयोग करने के लिए यह इष्टतम नहीं हो सकता है। – asalamon74

0

आप इसे खोलने के लिए ओएस डिफ़ॉल्ट तरीके का उपयोग कर सकते हैं।

  • विंडोज: "cmd/सी fileName
  • लिनक्स डब्ल्यू/सूक्ति" GNOME खुले फ़ाइल नाम "
  • लिनक्स डब्ल्यू/केडीई ??
  • OSx" खुला फ़ाइल नाम "
12
public static boolean isWindows() { 
    String os = System.getProperty("os.name").toLowerCase(); 
    return os.indexOf("windows") != -1 || os.indexOf("nt") != -1; 
} 
public static boolean isMac() { 
    String os = System.getProperty("os.name").toLowerCase(); 
    return os.indexOf("mac") != -1; 
} 
public static boolean isLinux() { 
    String os = System.getProperty("os.name").toLowerCase(); 
    return os.indexOf("linux") != -1; 
} 
public static boolean isWindows9X() { 
    String os = System.getProperty("os.name").toLowerCase(); 
    return os.equals("windows 95") || os.equals("windows 98"); 
} 

और

if (isLinux()) 
    { 
    cmds.add(String.format("gnome-open %s", fileName)); 
    String subCmd = (exec) ? "exec" : "openURL"; 
    cmds.add(String.format("kfmclient "+subCmd+" %s", fileName)); 
    } 
    else if (isMac()) 
    { 
    cmds.add(String.format("open %s", fileName)); 
    } 
    else if (isWindows() && isWindows9X()) 
    { 
    cmds.add(String.format("command.com /C start %s", fileName)); 
    } 
    else if (isWindows()) 
    { 
    cmds.add(String.format("cmd /c start %s", fileName)); 
    } 
+0

आप इसके साथ बहुरूपता भी ले सकते हैं। इस तरह आप कार्यान्वयन में लचीलापन जोड़ सकते हैं। फिर आप अगले ऑपरेशन के लिए/elseif/else श्रृंखला अगर किसी और से बच सकते हैं। – OscarRyz

+0

आपको 'gnome-open' या' kfmclient' या जो भी हो, के बजाय 'xdg-open' का उपयोग करना चाहिए, इसलिए यह xfce या अन्य वातावरण में अधिक अच्छी तरह से काम करता है। –

12

JDIC एक लाइब्रेरी है जो जावा 1.5 में डेस्कटॉप जैसी कार्यक्षमता प्रदान करती है।

इस तरह आप वर्गों के बीच युग्मन को कम करके आसान नए मंच जोड़ सकते हैं:

+1

यह पुस्तकालय समस्या को हल करने लगता है। मुझे समझ में नहीं आता कि लोग पहिया को पुनर्निर्मित करने के लिए क्यों मतदान कर रहे हैं ... –

-3

हम कॉन्फ़िगरेशन फ़ाइल में कहीं बाहर आदेश डालते हैं।

आपका "जार और स्रोत कोड" "क्रॉस-प्लेटफ़ॉर्म" होगा, लेकिन आपकी परिनियोजन नहीं है।

आप this answer जैसे कुछ भी कर सकते हैं। आप सेटअप फ़ाइल में "डेस्कॉप" कार्यान्वयन के फैक्टरी वर्ग का वर्गनाम डाल सकते हैं। (यदि आप चाहें तो गाइड या वसंत हो सकता है)

5

बस एक अतिरिक्त के रूप में: gnome-open के बजाय, xdg-open का उपयोग करें। यह XdgUtils का हिस्सा है, जो एलएसबी डेस्कटॉप समर्थन पैकेज (3.2 से शुरू) के बदले में हैं।

आप अभी भी gnome-open का उपयोग फॉलबैक के रूप में कर सकते हैं, लेकिन xdg-open गैर-गनोम डेस्कटॉप पर भी काम करेगा।

+0

ग्रेट एडिशन। मुझे इस पैकेज से अवगत नहीं था। – asalamon74

0

एक और उत्तर (बुटा द्वारा) SWT का उपयोग करने का सुझाव देता है। मैं केवल इस उद्देश्य के लिए पुस्तकालय संदर्भित की सिफारिश नहीं होगा, लेकिन अगर तुम यह पहले से ही प्रयोग कर रहे हैं, बस निष्पादित करें:

Program.launch("http://google.com/"); 

लें ध्यान दें कि यह विधि केवल काम करेंगे (और true वापसी) अगर एक Display वस्तु पहले से ही है बनाया गया है (उदाहरण के लिए Shell बनाकर)। यह भी ध्यान रखें कि इसे मुख्य धागे में चलाना चाहिए; उदाहरण:

Display.syncExec(new Runnable() { 
    public void run() { 
     Program.launch("http://google.com/"); 
    } 
}); 

ऊपर दिए गए उदाहरण में मैंने एक यूआरएल लॉन्च किया है, लेकिन फ़ाइलों को लॉन्च करना उसी तरह काम करता है।

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