2011-01-12 22 views
5

कॉपी करने का प्रयास करते समय एनआईओ के साथ त्रुटि मेरे पास एक फ़ाइल को किसी अन्य स्थान पर कॉपी करने के लिए कोड है।बड़ी फ़ाइल

public static void copyFile(String sourceDest, String newDest) throws IOException { 

    File sourceFile = new File(sourceDest); 
    File destFile = new File(newDest); 
    if (!destFile.exists()) { 
     destFile.createNewFile(); 
    } 

    FileChannel source = null; 
    FileChannel destination = null; 
    try { 
     source = new FileInputStream(sourceFile).getChannel(); 
     destination = new FileOutputStream(destFile).getChannel(); 
     destination.transferFrom(source, 0, source.size()); 
    } finally { 
     if (source != null) { 
      source.close(); 
     } 
     if (destination != null) { 
      destination.close(); 
     } 
    } 

} 
} 

छोटे-छोटे टुकड़ों को कॉपी करते हैं, कहते हैं, 300-400 एमबी, सब कुछ जादू की तरह काम करता है। लेकिन जब मैंने फाइल को 1.5 जीबी के आकार की प्रतिलिपि बनाने की कोशिश की तो यह असफल रहा। ढेर है:

run: 12.01.2011 11:16:36 FileCopier main SEVERE: Exception occured while copying file. Try again. java.io.IOException: Map failed at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:748) at sun.nio.ch.FileChannelImpl.transferFromFileChannel(FileChannelImpl.java:527) at sun.nio.ch.FileChannelImpl.transferFrom(FileChannelImpl.java:590) at FileCopier.copyFile(FileCopier.java:64) at FileCopier.main(FileCopier.java:27) Caused by: java.lang.OutOfMemoryError: Map failed at sun.nio.ch.FileChannelImpl.map0(Native Method) at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:745) ... 4 more BUILD SUCCESSFUL (total time: 0 seconds)

मैं बारीकी से NIO साथ काम नहीं किया। क्या तुमसे मुझे मदद मिल सकती है? अग्रिम में बहुत बहुत धन्यवाद।

+0

Files.copy http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html के साथ प्रयास करें यदि यह काम करता है तो src में एक नज़र डालें – oluies

+0

धन्यवाद। लेकिन मैं इस विशिष्ट मामले में तीसरे पक्ष के पुस्तकालयों का उपयोग नहीं करना चाहूंगा। –

उत्तर

5

मुझे लगता है कि आपको old bug द्वारा मारा गया हो सकता है जो पहले से ही कुछ समय पहले सामने आया था। मैं एक फ़ाइल की प्रतिलिपि बनाने की कोशिश नहीं कर रहा था बल्कि स्मृति-मैप की गई फ़ाइल को ढूंढने की कोशिश नहीं कर रहा था जो असफल रहा। मेरे लिए वर्कअराउंड फ़ाइल को लूप में खोजना है और अब और फिर चलाने के लिए GC और finalizers का अनुरोध करना है।

मेमोरी-मैप किए गए ByteBuffers फाइनल में मैपिंग जारी करें और नए मैपिंग के लिए जगह बनाएं। यह बहुत बदसूरत है, लेकिन कम से कम यह काम करता है। आइए उम्मीद करते हैं कि आने वाले एनआईओ पुनरावृत्ति में उन्होंने इसके बारे में कुछ किया है।

+1

मुझे एक समाधान मिला। परिज्ञान के लिए धन्यवाद। http://snippets.dzone.com/posts/show/4946 –

+0

हां, असल में उन्होंने जेआरई 1.7 में बग का समाधान किया है (मैंने 1.7.0_51 में चेक किया है) –

2

आप एक फ़ाइल मैपिंग मेमोरी कर रहे हैं लेकिन 32-बिट JVM (जो मुझे लगता है कि आप उपयोग कर रहे हैं) में सीमित स्मृति पता स्थान है, इसलिए मानचित्र विधि विफल हो रही है। मुझे नहीं लगता कि आप 1.3-1.4 जीबी डिस्क डेटा से अधिक मैप कर सकते हैं। आप किस आकार का उपयोग कर रहे हैं?

आप अपने ढेर के आकार को कम करने या 64-बिट जेआरई का उपयोग करने का प्रयास कर सकते हैं। वैकल्पिक रूप से, एनआईओ का उपयोग करके स्मृति में मैप करके फ़ाइल को न पढ़ें। इसके बजाय, एक फ़ाइल से डेटा को पढ़ने और लिखने के लिए एक बफर किए गए पाठक और लेखक के पारंपरिक तरीके का उपयोग करें।

+0

धन्यवाद, मैंने एनआईओ से चिपकने का फैसला किया, केवल पुनरावृत्ति दृष्टिकोण का उपयोग करके एक बफर के साथ 64 एमबी का आकार। –

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