2009-02-04 8 views
8

मुझे एक जावा प्रोग्राम बनाने की आवश्यकता है जो विशेष फ़ोल्डर (स्रोत फ़ोल्डर) में फ़ाइल खोजने के लिए थ्रेड बनाएगा और प्रक्रिया के काम के लिए तुरंत फ़ाइल को चुनें (इसे सीएसवी फ़ाइल प्रारूप में परिवर्तित करें) एक बार जब यह फ़ाइल में मिले सोर्स फोल्डर। अब मुझे जिस समस्या का सामना करना पड़ रहा है वह फ़ाइल है जो स्रोत फ़ोल्डर में आता है बड़ा आकार है (एफ़टीपी उपकरण सर्वर से स्रोत फ़ोल्डर में फ़ाइल की प्रतिलिपि बनाने के लिए प्रयोग किया जाता है), थ्रेड उस फ़ाइल को तुरंत स्रोत फ़ोल्डर में प्रतिलिपि बनाने और अपवाद फेंकने से पहले उस फ़ाइल को चुन रहा है। फ़ाइल थ्रेड को स्रोत फ़ोल्डर में पूरी तरह से तब तक थ्रेड कैसे रोकूं? फाइल को पूरी तरह से स्रोत फ़ोल्डर में कॉपी करने के बाद इसे प्रसंस्करण के लिए फ़ाइल को चुनना होगा।अपूर्ण फ़ाइलों को कैसे संभालें? अपवाद प्राप्त करना

+0

यह जानना अच्छा है, क्या अपवाद? –

उत्तर

1

आप एफ़टीपी प्रक्रिया पर कोई नियंत्रण नहीं ...

इसे इस तरह हो गए हैं मान लिया जाये। जब आप अपवाद प्राप्त करते हैं, तो अगली बार इसे फिर से संसाधित करने का प्रयास करें। फाइल को संसाधित होने तक इसे दोहराएं। इसे बाद में जांचने के अपवाद के मामले में कुछ विशेषताओं को रखने के लिए अच्छा है, जैसे; नाम, अंतिम संशोधित, आकार।

चेक बाद में यह कार्रवाई करने के लिए निर्णय लेने से पहले सटीक अपवाद अपवाद किसी अन्य कारण से हो सकता है।

2

आप प्रक्रिया है कि एफ़टीपी करता है पर कुछ नियंत्रण है, तो आप संभवतः यह एक "झंडा फ़ाइल" स्रोत निर्देशिका में बनाने के तुरंत बाद एफ़टीपी के लिए बड़ी फ़ाइल समाप्त हो गया है हो सकता था।

फिर अपने जावा धागा, इस ध्वज फ़ाइल की उपस्थिति की जांच करने के अगर यह मौजूद है फिर वहाँ एक फ़ाइल स्रोत निर्देशिका में संसाधित किया जा करने के लिए तैयार है। बड़ी फ़ाइल को संसाधित करने से पहले, थ्रेड को ध्वज फ़ाइल को हटा देना चाहिए।

ध्वज फ़ाइल कुछ भी हो सकती है (यहां तक ​​कि एक खाली फ़ाइल)।

3

आप अलग अलग बातें की कोशिश कर सकते:

  • बार बार अंतिम संशोधन दिनांक और फ़ाइल के आकार की जाँच जब तक यह समय की एक निश्चित राशि के लिए अब और नहीं बदलता है, तो यह प्रक्रिया करते हैं। (जैसा कि qbeuek द्वारा बताया यह न सुरक्षित है और न ही नियतात्मक है।)
  • नाम जो निश्चित सीमा (जैसे * .dat) से मेल के साथ केवल प्रक्रिया फ़ाइलें। एक अलग नाम (उदा। * .dat.temp) फ़ाइलों को अपलोड/डाउनलोड करने के लिए एफ़टीपी अपलोड/डाउनलोड प्रक्रिया बदलें और फ़ाइलों को पूर्ण होने के बाद नाम बदलें।
  • फ़ाइलों को एक अलग स्थान पर डाउनलोड करें और उन्हें पूरा होने के बाद उन्हें अपनी प्रोसेसिंग निर्देशिका में ले जाएं।
  • जैसा कि सिरका ने कहा, अगर यह पहली बार काम नहीं करता है, तो बाद में पुनः प्रयास करें। :)
+0

मुझे नहीं पता कि हमारे पास डाउनवॉट क्यों हैं, कभी-कभी। लोग इसे हर जगह शूटिंग शुरू करते हैं। 100 प्रतिष्ठा किसी को कम करने के लिए बहुत कम है। यह उच्च होना चाहिए, 1000 या 2000 हो सकता है। –

+0

ठीक है, कभी-कभी मैं डाउनवोट्स को संतुलित करने के लिए सामान को वोट देता हूं, वो वोट +8 अंक देता हूं जो उन्हें अन्यथा प्राप्त नहीं होता है, इसलिए यह कुछ है। इस मामले में मैंने वैसे भी अपना जवाब वोट दिया होगा, कठिन। – itsadok

+0

मैंने आपको वोट दिया है, क्योंकि आपकी सुझाव सूची में पहला आइटम सुरक्षित नहीं है और न ही निर्धारक है। – qbeuek

4

फ़ाइल का एक अलग स्थान पर डाउनलोड करने और फिर इसे लक्षित फ़ोल्डर में स्थानांतरित करने का सबसे सुरक्षित तरीका था।

एक और भिन्नता Bombe ने उल्लेख डाउनलोड करने के बाद कुछ अन्य एक्सटेंशन के लिए फ़ाइल नाम बदल सकते हैं और केवल कि विस्तार के साथ फ़ाइलों के लिए देखने के लिए है।

+0

+1 यह सबसे सुरक्षित तरीका नहीं है लेकिन ऐसा करने का एकमात्र तरीका है। अन्य सभी विकल्प या तो संसाधन बर्बाद करते हैं या असुरक्षित हैं :) –

4

मैं केवल उस फ़ाइल को पढ़ता हूं जो लेखन मोड में नहीं है। यह सबसे सुरक्षित है क्योंकि इसका मतलब है कि इस फाइल में कोई अन्य प्रक्रिया नहीं लिख रही है। फ़ाइल तालिका के CanWrite विधि का उपयोग करके आप यह जांच सकते हैं कि फ़ाइल लिखने के तरीके में नहीं है या नहीं।

यह समाधान मेरे लिए ठीक काम करता है क्योंकि मेरे पास भी वही परिदृश्य है जिसका सामना आप कर रहे हैं।

0

अपने ओएस लिनक्स है, और अपने कर्नेल> 2.6.13 हैं, तो आप फाइल सिस्टम घटना अधिसूचना inotify नामित एपीआई का उपयोग कर सकते हैं। यहां एक जावा कार्यान्वयन है: https://bitbucket.org/nbargnesi/inotify-java

यहां एक नमूना कोड (वेबसाइट से काफी प्रेरित) है।

 try { 
     Inotify i = new Inotify(); 
     InotifyEventListener e = new InotifyEventListener() { 

      @Override 
      public void filesystemEventOccurred(InotifyEvent e) { 
       System.out.println("inotify event occurred!"); 
      } 

      @Override 
      public void queueFull(EventQueueFull e) { 
       System.out.println("inotify event queue: " + e.getSource() + 
         " is full!"); 
      } 

     }; 
     i.addInotifyEventListener(e); 
     i.addWatch(System.getProperty("user.home"), Constants.IN_CLOSE_WRITE); 
    } catch (UnsatisfiedLinkError e) { 
     System.err.println("unsatisfied link error"); 
    } catch (UserLimitException e) { 
     System.err.println("user limit exception"); 
    } catch (SystemLimitException e) { 
     System.err.println("system limit exception"); 
    } catch (InsufficientKernelMemoryException e) { 
     System.err.println("insufficient kernel memory exception"); 
    } 
0

यह Grails में है और मैं अपाचे कॉमन्स प्रसिद्धि से FileUtils लाइब्रेरी का उपयोग कर रहा हूँ। sizeof फ़ंक्शन बाइट्स में आकार देता है।

def fileModified = sourceFile.lastModified() 
    def fileSize = FileUtils.sizeOf(sourceFile) 

    Thread.sleep(3000) //sleep to calculate size difference if the file is currently getting copied 

    if((fileSize != FileUtils.sizeOf(sourceFile)) && (fileModified != sourceFile.lastModified())) //the file is still getting copied to return 
    { 
     if(log.infoEnabled) 
      log.info("File is getting copied!") 
     return 
    } 

    Thread.sleep(1000) //breather for picking up file just copied. 

कृपया ध्यान दें कि यह भी क्या उपयोगिता या ओएस आप फ़ाइलों को हस्तांतरण करने का उपयोग कर रहे पर निर्भर करता है। सबसे सुरक्षित शर्त फ़ाइल की प्रतिलिपि बनाना है जिसे कॉपी किया गया है या अलग-अलग फ़ाइल या निर्देशिका में कॉपी किया गया है। कॉपी प्रक्रिया मजबूत है और यह आपको आश्वस्त करती है कि प्रतिलिपि प्रक्रिया के बाद फ़ाइल मौजूद है। मैं जिसका उपयोग कर रहा हूं वह कॉमन्स एपीआई से है।

FileUtils.copyFileToDirectory (फ़ाइल च, निर्देशिका डी)

आप एक बड़ी फ़ाइल जो की नकल की हो रही है सावधान रहना करने की प्रक्रिया में है कॉपी कर रहे हैं तो इस समय लगेगा और आप समानांतर धागा या सबसे अच्छा में इस शुरू करने के लिए पसंद कर सकते हैं कि स्थानांतरण प्रक्रिया के लिए समर्पित एक अलग आवेदन है।

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