FileNotfoundException على فتح FileOutputStream على نفس الملف اقرأ باستخدام Java Nio

StackOverflow https://stackoverflow.com/questions/2146656

  •  23-09-2019
  •  | 
  •  

سؤال

لدي محرر نصوص يستخدم التعليمات البرمجية تقريبًا مع القراءة والكتابة. عندما أفتح ملفات صغيرة للتحرير ، أحصل دائمًا على هذا الخطأ عندما أحاول حفظها مرة أخرى. إن الشيء المثير للاهتمام حقًا هو أن محرر النصوص الخاص بي يعمل بشكل جيد للملفات التي تحتوي على حوالي 600 بايت أو أكثر (يبدو أنه يختلف في كل مرة) ، السلوك الذي لم أتمكن من تكراره هنا.

الحل الحالي هو التحقق من حجم الملف <1024 بايت ، واستخدام java.io إذا كان هذا هو الحال.

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;

public class Test {
    public static void main(String[] args) {
        String text = null;
        try {
            FileInputStream fis = new FileInputStream("test.txt");
            FileChannel ifc = fis.getChannel();
            CharBuffer cb = Charset.forName("ISO-8859-15").newDecoder().
                    decode(ifc.map(FileChannel.MapMode.READ_ONLY, 0,
                    (int) ifc.size()));
            text = cb.toString();
            ifc.close();
            fis.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        try {
            FileOutputStream fos = new FileOutputStream("test.txt");
            OutputStreamWriter osw = new OutputStreamWriter(
                    fos, "ISO-8859-15");
            osw.write(text);
            osw.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

بالنسبة للرمز أعلاه ، أحصل على هذا الخطأ لأحجام مختلفة من test.txt من 4 بايت إلى 10 كيلو بايت:

java.io.FileNotFoundException: test.txt (The requested operation cannot be perfo
rmed on a file with a user-mapped section open)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at Test.main(Test.java:23)

هل يمكن لأي شخص أن يشرح ما أفعله خطأ وكيف يمكنني تشغيل هذا أثناء القراءة مع NIO؟

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

المحلول

ستيفن ج أخبرتك أن تضعف المخزن المؤقت.

ومع ذلك ، ها هو أ حلقة الوصل لاستمرار Open (من 2002) طلب طريقة medbyBebuffer.unmap.

يحتوي على عدد قليل من الحلول المقترحة ، لذلك يمكنك تجربتها.

نصائح أخرى

تحتاج إلى إلغاء تصنيف المنطقة بشكل صريح الذي قمت بتعيينه مع FileChannel.map(...) يتصل.

جافادوك ل map(...) يقول هذا:

التعيين ، بمجرد إنشاء ، لا يعتمد على قناة الملفات التي تم استخدامها لإنشاءها. إن إغلاق القناة ، على وجه الخصوص ، ليس له أي تأثير على صحة التعيين.

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