2010-03-29 11 views

उत्तर

15

नहीं, जावा में SAFELY करने का कोई तरीका नहीं है।

किसी भी मुख्यधारा के ऑपरेटिंग सिस्टम में कोई फाइल सिस्टम कार्यान्वयन इस तरह की चीज़ का समर्थन नहीं करता है, और आपको यह सुविधा किसी मुख्यधारा प्रोग्रामिंग भाषाओं में समर्थित नहीं मिलेगी।

असली दुनिया फ़ाइल सिस्टम उन डिवाइसों पर लागू किए गए हैं जो डेटा को निश्चित आकार के "ब्लॉक" के रूप में संग्रहीत करते हैं। फ़ाइल सिस्टम मॉडल को कार्यान्वित करना संभव नहीं है, जहां आप फाइल स्थान के बीच में बाइट्स को फ़ाइल I/O को धीमा किए बिना डिस्क स्थान या दोनों को बर्बाद कर सकते हैं।


फ़ाइल के इन-प्लेस रीराइट को शामिल करने वाले समाधान स्वाभाविक रूप से असुरक्षित हैं। यदि आपका आवेदन मारे गए हैं या प्रीपेड/रीराइट प्रक्रिया के बीच में बिजली मर जाती है, तो आप डेटा खोने की संभावना है। मैं अभ्यास में उस दृष्टिकोण का उपयोग करने की सिफारिश नहीं करता।

एक अस्थायी फ़ाइल का उपयोग करें। यह सुरक्षित है।

+3

आप पूरी तरह से असुरक्षित के बारे में सही हैं। मुझे नहीं पता कि मैंने इसके बारे में क्यों उल्लेख नहीं किया। – BalusC

0

आप फ़ाइल सामग्री को स्ट्रिंग में संग्रहीत कर सकते हैं और स्ट्रिंगबिल्डर-ऑब्जेक्ट का उपयोग कर वांछित रेखा को प्रीपेड कर सकते हैं। आपको बस वांछित रेखा को पहले रखना होगा और फिर फ़ाइल-सामग्री-स्ट्रिंग को जोड़ना होगा।
कोई अतिरिक्त अस्थायी फ़ाइल की आवश्यकता नहीं है।

+0

जो मौजूदा फ़ाइल सामग्री को नए से बदल देगा। यह फ़ाइल सिस्टम में सामग्री को स्थानांतरित करके और इससे पहले नई सामग्री डालने से फ़ाइल को स्थानांतरित नहीं करेगा, जो सवाल पूछा गया है। – jwenting

1

नहीं। कोई "इंट्रा-फ़ाइल शिफ्ट" ऑपरेशन नहीं है, केवल अलग-अलग आकारों को पढ़ और लिखना है।

0

यह करना संभव होगा कि आप जिस चीज को प्रीपेन्ड करना चाहते हैं, उसमें नई सामग्री लिखना, बाद में खंड पढ़ना और इसे पहले जो आपने पढ़ा है उसे बदलकर, और इसी तरह, फ़ाइल के अंत तक नीचे rippling।

हालांकि, ऐसा न करें, क्योंकि अगर कुछ भी बंद हो जाता है (आउट-ऑफ-मेमोरी, पावर आउटेज, नकली थ्रेड System.exit) उस प्रक्रिया के मध्य में, डेटा खो जाएगा। इसके बजाय अस्थायी फ़ाइल का प्रयोग करें।

6

एक तरीका है, इसमें पूरी फ़ाइल को फिर से लिखना शामिल है (लेकिन कोई अस्थायी फ़ाइल नहीं)। जैसा कि अन्य ने उल्लेख किया है, कोई फ़ाइल सिस्टम किसी फ़ाइल में पूर्ववत सामग्री का समर्थन नहीं करता है। यहाँ लिख सकते हैं और कुछ स्मृति में बफ़र सामग्री रखते हुए सामग्री पढ़ने के लिए एक RandomAccessFile का उपयोग करता है कुछ नमूना कोड है:

public static void main(final String args[]) throws Exception { 
    File f = File.createTempFile(Main.class.getName(), "tmp"); 
    f.deleteOnExit(); 

    System.out.println(f.getPath()); 

    // put some dummy content into our file 
    BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f))); 
    for (int i = 0; i < 1000; i++) { 
     w.write(UUID.randomUUID().toString()); 
     w.write('\n'); 
    } 
    w.flush(); 
    w.close(); 

      // append "some uuids" to our file 
    int bufLength = 4096; 
    byte[] appendBuf = "some uuids\n".getBytes(); 
    byte[] writeBuf = appendBuf; 
    byte[] readBuf = new byte[bufLength]; 

    int writeBytes = writeBuf.length; 

    RandomAccessFile rw = new RandomAccessFile(f, "rw"); 
    int read = 0; 
    int write = 0; 

    while (true) { 
        // seek to read position and read content into read buffer 
     rw.seek(read); 
     int bytesRead = rw.read(readBuf, 0, readBuf.length); 

        // seek to write position and write content from write buffer 
     rw.seek(write); 
     rw.write(writeBuf, 0, writeBytes); 

        // no bytes read - end of file reached 
     if (bytesRead < 0) { 
          // end of 
      break; 
     } 

        // update seek positions for write and read 
     read += bytesRead; 
     write += writeBytes; 
     writeBytes = bytesRead; 

        // reuse buffer, create new one to replace (short) append buf 
     byte[] nextWrite = writeBuf == appendBuf ? new byte[bufLength] : writeBuf; 
     writeBuf = readBuf; 
     readBuf = nextWrite; 
    }; 

    rw.close(); 

      // now show the content of our file 
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f))); 

    String line; 
    while ((line = reader.readLine()) != null) { 
     System.out.println(line); 
    } 
} 
0

निजी स्थिर शून्य addPreAppnedText (फ़ाइल FILENAME) {

FileOutputStream fileOutputStream = बातिल;

BufferedReader br = null; 
    FileReader fr = null; 
    String newFileName = fileName.getAbsolutePath() + "@"; 

    try { 

     fileOutputStream = new FileOutputStream(newFileName); 
     fileOutputStream.write("preappendTextDataHere".getBytes()); 

     fr = new FileReader(fileName); 
     br = new BufferedReader(fr); 

     String sCurrentLine; 

     while ((sCurrentLine = br.readLine()) != null) { 
      fileOutputStream.write(("\n"+sCurrentLine).getBytes()); 

     } 
     fileOutputStream.flush(); 


    } catch (IOException e) { 

     e.printStackTrace(); 

    } finally { 
     try { 
      fileOutputStream.close(); 
      if (br != null) 
       br.close(); 

      if (fr != null) 
       fr.close(); 


      new File(newFileName).renameTo(new File(newFileName.replace("@", ""))); 


     } catch (IOException ex) { 

      ex.printStackTrace(); 

     } 

    } 

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