मैं एक लूप बनाने की कोशिश कर रहा हूं जो कुछ मानदंडों के आधार पर फाइलें बनाता है। (कुछ डेटाबेस का आकार)

समस्या यह है कि जब मैं फ़ाइल के नाम के रूप में स्ट्रिंग संदर्भ का उपयोग करता हूं तो यह विफल हो जाता है, लेकिन अगर मैं सीधे तर्क के भीतर स्ट्रिंग बनाता हूं तो यह ठीक काम करता है।

for(int i = 0; i < (sizeOf/dataPerFile+1) ; i++){
            Date date = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            String strDate= formatter.format(date);

            System.out.println((strDate+"_Backup"+i+".txt"));
            System.out.println(System.getProperty("user.dir").replace("/someproject", "")+"/backup/");
            new File((System.getProperty("user.dir").replace("/someproject", "")+"/backup/"+(strDate+"_Backup"+i+".txt"))).createNewFile();
        }

    }catch (IOException | SQLException | NumberFormatException a){
        System.out.println("Failed");
        System.out.println(a.fillInStackTrace());
    }

विफलता संदेश

Connected
30/10/2020_Backup0.txt
java.io.IOException: No such file or directory

मेरा पहला अनुमान यह है कि मेरा कंप्यूटर दिए गए स्ट्रिंग मानों का उपयोग करने से पहले उनकी गणना ठीक से नहीं करता है। लेकिन पक्का नहीं।

कोई विचार?

-1
user11119570 30 अक्टूबर 2020, 15:58

4 जवाब

सबसे बढ़िया उत्तर

मुझे लगता है कि इसे तारीख के स्वरूपण के साथ करना है। दिनांक में "/" वर्ण हैं, जिसे फ़ाइल निर्माता अगली निर्देशिका में जाने के रूप में व्याख्या करता है, कोशिश करें

strDate.replaceAll("/"," ");

मैबी उसके बाद काम करता है

2
carlos.gmz 30 अक्टूबर 2020, 16:16

उत्तर के ऊपर अधिकांश प्रतिक्रियाओं के रूप में, त्रुटि आगे की स्लैश के साथ दिनांक प्रारूप के भीतर थी। - वो छोटी लेकिन विनाशकारी गलतियाँ...

दिनांक प्रारूप के फ़ॉरवर्ड स्लैश को बदल दिया और इसे ठीक कर दिया। यह अब बढ़िया चल रहा है। :-)

धन्यवाद!

0
theDev 30 अक्टूबर 2020, 16:32

आपने फ़ॉरवर्ड स्लैश का उपयोग करके दिनांक को स्वरूपित किया है, इसलिए, पारित की गई वास्तविक स्ट्रिंग कुछ इस प्रकार है: "/Users/theDev/projects/backup/30/10/2020_Backup0.txt"

वह निर्देशिका "/Users/theDev/projects/backup/30/10" में "2020_Backup0.txt" नाम की फ़ाइल बनाने का प्रयास करेगा। यह तब तक काम नहीं करता जब तक कि निर्देशिका मौजूद न हो, और ऐसा नहीं है, इसलिए, आपको एक FNFEx मिलता है।

अधिकांश OS फ़ाइल नामों में स्लैश की अनुमति नहीं देते हैं।

यदि वास्तव में यह फ़ाइल बनाना चाहते हैं (मुझे वास्तव में इसमें संदेह है), तो करें:

File f = new File(...);
f.getParent().mkdirs();
f.createNewFile();

और नई फ़ाइल एपीआई (java.nio.file) का उपयोग करने पर विचार करें।

यदि आप नहीं चाहते कि फ़ाइल का नाम इस तरह रखा जाए, तो अपने SDF पैटर्न को डैश या अंडरस्कोर या व्हाट्नॉट से बदलें। और नए टाइम एपीआई (java.time) का उपयोग करने पर विचार करें - आप जिन एपीआई का उपयोग कर रहे हैं वे दोनों अप्रचलित हैं।

मेरा कंप्यूटर दिए गए स्ट्रिंग मानों की ठीक से गणना नहीं करता है

कंप्यूटर वही करता है जो चश्मा कहता है कि उसे करना चाहिए, जो इसलिए उचित है।

आपका अपवाद हैंडलर टूट गया है; ऐसा नहीं है कि आप ऐसा करते हैं। आम तौर पर, 'लॉग इट' 'हैंडलिंग इट' नहीं है, इसलिए, किसी भी चेक किए गए अपवाद को आगे फेंक दें (इस पद्धति के हस्ताक्षर में throws SQLException, IOException जोड़ें। ध्यान दें कि आपकी psv main(String[] args) विधि (और चाहिए!) throws Exception को घोषित किया गया।

fillInStackTrace() जब आप fillInStackTrace को कॉल करते हैं तो ट्रेस के साथ एक अपवाद से जुड़े ट्रेस को ओवरराइट कर देता है - यह निश्चित रूप से वह नहीं है जो आप चाहते हैं (और यह कैच ब्लॉक में 'बस लॉग इट' न लिखने का ज्ञान दिखाता है: यह एक उल्लंघन है DRY का और यह केवल गड़बड़ करने का एक अवसर है। जावा इन्फ्रास्ट्रक्चर पहले से ही इसे आप से बेहतर कर सकता है।

यदि वह सिर्फ एक विकल्प नहीं है, तो इसका मतलब है कि आप इससे ठीक से निपटने के लिए साइन अप कर रहे हैं (और जैसा कि हमने कवर किया, 'लॉग इट', ठीक नहीं है)। यदि आपको कोई जानकारी नहीं है, तो, 'मैं हार मानता हूं, मुझे नहीं पता कि क्या करना है' कोड catch (SomethingICantReallyHandle e) { throw new RuntimeException("Unhandled", e); } है।

आपने जो किया है वह उपयोगी डिबगिंग जानकारी का एक बोतलबंद हटा दिया गया है, संभवतः, यही कारण है कि अब आप SO पर प्रश्न पूछ रहे हैं।

1
rzwitserloot 30 अक्टूबर 2020, 16:16

आपको यह सुनिश्चित करने की ज़रूरत है कि जब आप createNewFile का आह्वान करते हैं तो सभी उपनिर्देशिकाएं मौजूद होती हैं।

चूंकि फ़ाइल नाम के लिए पैटर्न dd/MM/yyyy का उपयोग किया जाता है, इसका मतलब है कि निर्देशिका 30/10 backup निर्देशिका के अंदर मौजूद होनी चाहिए।

इसे निर्देशिका संरचना बनाने के लिए File.mkdirs() कमांड का उपयोग करके और फिर मौजूदा निर्देशिका में फ़ाइल बनाने के लिए कंस्ट्रक्टर File(String path, String filename) का उपयोग करके फ़ाइलें बनाकर हल किया जा सकता है।

try {
    for (int i = 0; i < 5; i++) {
        Date date = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        String strDate = formatter.format(date);

        String dirName = System.getProperty("user.dir").replace("/someproject", "") + "/backup/" + strDate;
        File dir = new File(dirName);

        if (dir.mkdirs()) { // create directory structure
            System.out.println("Created backup directory: " + dirName);
        }
        // create files when directory is available
        new File(dirName, "_Backup" + i + ".txt").createNewFile();
    }
} catch (IOException a) {
    System.out.println("Failed: " + a);
    a.printStackTrace();
}

ध्यान दें: दिनांक के अनुसार बैकअप के समूहन को बढ़ाने के लिए दिनांक प्रारूप को yyyy-MM-dd में बदलना उचित हो सकता है

2
Alex Rudenko 30 अक्टूबर 2020, 16:25