سؤال

أحاول قراءة ملف ثم إلحاق بعض النص إلى مكان معين في الملف (أي @ Offset Jabjab). تحدث المشكلة عندما أحاول الكتابة إلى الملف في Offset Jabjab. ما الخطأ؟

محتويات الملف:

Mi
<?xml Version="1.0"?>

_

File f = new File("data.dat");
    String brstring = null;
    String entrystring = null;
    try {
        BufferedReader br = new BufferedReader(new FileReader(f));
        String line;
        StringBuilder result = new StringBuilder();
        while ((line = br.readLine()) != null) {
        result.append(line+"\r\n");
        }
        br.close();
        System.out.print(result);
        int jabjab = result.indexOf("?>");
        System.out.println(jabjab);
        PrintWriter fo = new PrintWriter(f);
        fo.write("ok", jabjab, 2);
        fo.flush();
        fo.close();
    } catch (Exception ex) {
        System.out.print(ex.getMessage());
    }

إخراج وحدة التحكم بما في ذلك الخطأ:

Mi// output of the result string
<?xml Version="1.0"?>//output of the result string
23//output of jabjab
String index out of range: 25String index out of range: 25//output of exception

أيضا، بعد انتهاء هذه الطريقة، أصبح الملف الأصلي فارغا الآن ...

هل كانت مفيدة؟

المحلول

أعتقد أنك أسيء فهم تعريف كتابة PrintWriter.Write (سلسلة، الإزاحة، الطول). إذا قرأت سؤالك بشكل صحيح، تعتقد أنه سيكتب في ملف الإخراج في تلك الإزاحة. ومع ذلك، تحدد الإزاحة أين يتم كتابة السلسلة للبدء، لذلك أنت تحاول الكتابة من السلسلة "موافق" بدءا من Offset 23. نظرا لأن السلسلة تحتوي فقط على 2 حرفا تحصل على الاستثناء.

ألق نظرة على java.io.randomaccessfile إذا كنت ترغب حقا في الكتابة فوق بايت محددة في ملف. لاحظ أنه، في حين يمكنك الكتابة فوق بايت محددة في ملف مع البايتات الأخرى، لا يمكنك "إدراج" البيانات أو حذف البيانات من ملف (مما يؤدي إلى ملف من طول مختلف) دون قراءةه في الذاكرة وكتابة نسخة جديدة إلى القرص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top