2013-06-18 8 views
23

मैं इस तरह java.nio.file.Files के साथ एक फ़ाइल की प्रतिलिपि कोशिश कर रहा हूँ की जगह:जावा में फाइल कॉपी और मौजूदा लक्ष्य

Files.copy(cfgFilePath, strTarget, StandardCopyOption.REPLACE_EXISTING); 

समस्या यह है कि ग्रहण कहते हैं, "विधि प्रतिलिपि (पथ है, पथ, CopyOption ...) प्रकार में फ़ाइलें तर्क (फ़ाइल, स्ट्रिंग, मानक कॉपीऑप्शन) के लिए लागू नहीं हैं "

मैं Win7 x64 पर एक्लिप्स और जावा 7 का उपयोग कर रहा हूं। मेरी परियोजना जावा 1.6 संगतता का उपयोग करने के लिए स्थापित है।

वहाँ इस के लिए एक समाधान है या मैं एक समाधान के रूप कुछ इस तरह बनाने के लिए कार्य करें:

File temp = new File(target); 

if(temp.exists()) 
    temp.delete(); 

धन्यवाद।

Path from = cfgFilePath.toPath(); //convert from File to Path 
Path to = Paths.get(strTarget); //convert from String to Path 
Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING); 

कि आपके strTarget मान लिया गया एक मान्य पथ है:

उत्तर

8

@assylias 'जवाब देने के लिए एक पूरक के रूप में है। आप इसके बजाय Path चाहते हैं।

और अपने फाइल सिस्टम पर एक पथ मिलान एक Path वस्तु प्राप्त करने के लिए, आप करते हैं:

Paths.get("path/to/file"); // argument may also be absolute 

असली तेजी से इसकी आदत हो जाओ। ध्यान दें कि यदि आप अभी भी एपीआई का उपयोग करते हैं जिसके लिए File, Path की .toFile() विधि है।

ध्यान दें कि यदि आप दुर्भाग्यपूर्ण मामले में जहां आपके एपीआई जो File वस्तुओं रिटर्न का उपयोग कर रहे हैं, तो आप हमेशा कर सकते हैं:

theFileObject.toPath() 

लेकिन तुम्हारा कूट में Path का उपयोग करें। व्यवस्थित। बिना किसी दूसरी सोच के।

EDIT एनआईओ का उपयोग करके 1.6 का उपयोग करके फ़ाइल को दूसरे में कॉपी करना इस प्रकार किया जा सकता है; ,

public final class Closer 
    implements Closeable 
{ 
    private final List<Closeable> closeables = new ArrayList<Closeable>(); 

    // @Nullable is a JSR 305 annotation 
    public <T extends Closeable> T add(@Nullable final T closeable) 
    { 
     closeables.add(closeable); 
     return closeable; 
    } 

    public void closeQuietly() 
    { 
     try { 
      close(); 
     } catch (IOException ignored) { 
     } 
    } 

    @Override 
    public void close() 
     throws IOException 
    { 
     IOException toThrow = null; 
     final List<Closeable> l = new ArrayList<Closeable>(closeables); 
     Collections.reverse(l); 

     for (final Closeable closeable: l) { 
      if (closeable == null) 
       continue; 
      try { 
       closeable.close(); 
      } catch (IOException e) { 
       if (toThrow == null) 
        toThrow = e; 
      } 
     } 

     if (toThrow != null) 
      throw toThrow; 
    } 
} 

// Copy one file to another using NIO 
public static void doCopy(final File source, final File destination) 
    throws IOException 
{ 
    final Closer closer = new Closer(); 
    final RandomAccessFile src, dst; 
    final FileChannel in, out; 

    try { 
     src = closer.add(new RandomAccessFile(source.getCanonicalFile(), "r"); 
     dst = closer.add(new RandomAccessFile(destination.getCanonicalFile(), "rw"); 
     in = closer.add(src.getChannel()); 
     out = closer.add(dst.getChannel()); 
     in.transferTo(0L, in.size(), out); 
     out.force(false); 
    } finally { 
     closer.close(); 
    } 
} 
+0

+1 पूरी तरह से सहमत है - मैं शायद ही कभी फ़ाइलों का उपयोग करता हूं। – assylias

+0

मुझे आश्चर्य है कि यह काम करेगा जब मैं जावा 1.6 के अनुपालन स्तर के साथ संकलित करता हूं, लेकिन किसी भी मामले में नोट के लिए धन्यवाद, भविष्य के लिए इसे ध्यान में रखेगा। –

+0

@commander_keen क्या आपका मतलब है कि कोड 1.6 जेवीएम चलाने के लिए तैनात होगा? – fge

55

आप के रूप में त्रुटि संदेश के द्वारा समझाया Path तर्क पारित करने के लिए की जरूरत है।

आप जावा 7 उपयोग करते हैं, File पूरी तरह छोड़:

+0

Arg क्यों मुझे लगता है कि था कि यह copyOption के साथ कोई समस्या ... पूरी तरह से पहले दो पैरामीटर प्रकार पर ध्यान नहीं दिया था, धन्यवाद: ध्यान दें कि Closer वर्ग Guava द्वारा inspited है। ऐसा लगता है कि मैं गर्मी में बहुत लंबे समय तक कोडिंग कर रहा हूं। ;-) –

+0

उफ, जावा 1.6 के साथ एक पीसी में निर्यात किए गए जार की प्रतिलिपि बनाने के बाद (यही कारण है कि मैंने उल्लेख किया है कि मुझे 1.6 संगत होने की आवश्यकता है हालांकि मैं जावा 7 के साथ विकसित करता हूं और 1.6 के लिए संकलित करता हूं), यह "थ्रेड में अपवाद" मुख्य रूप से moans "java.lang.No.SuchMethodError: java.io.File.toPath() Lja va/nio/file/path;" दस्तावेजों के मुताबिक यह सही है, यह विधि केवल जावा 7 के बाद उपलब्ध है। (मुझे आश्चर्य है कि क्यों विकास/डिजाइन-समय के दौरान इसकी आलोचना नहीं की गई थी, जैसे कि मैंने जावा 7 से पहले उपयोग करने की कोशिश की थी, अब मुझे सबकुछ जांचना है हाथ से ...) –

+0

@commander_keen 'Files.copy' जावा 6 में नहीं है। – assylias

1

strTarget एक "स्ट्रिंग" वस्तु और नहीं एक "पथ" वस्तु

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