2017-03-16 60 views
0

嘗試使用RandomAcessFile讀取和寫入同一文件時出現問題。寫入字節塊後的文件更改權限

我正在從一個文件讀取16個字節的塊,並將它們寫入給定位置(例如256個)的同一個文件中。

問題出在ra.write(b)一行。當下面一行是執行我上了文本編輯器凱特消息(我使用Linux Manjaro)說:

文件/home/mite/IdeaProjects/IspitJuni2015/dat.txt與打開UTF-8編碼但包含無效字符。 它被設置爲只讀模式,因爲保存可能會破壞其內容。 可以選擇正確的編碼重新打開文件,也可以在工具菜單中再次啓用讀寫模式以編輯它。

它打開只讀模式。 另外我嘗試手動取消在凱特只讀權限,但它也不工作。什麼似乎是問題?

public static byte[] read(long i) throws IOException{ 
    File in = new File("./dat.txt"); 
    RandomAccessFile ra = new RandomAccessFile(in,"rw"); 
    byte[] readObj= new byte[16]; 
    if (i>in.length()/16) 
    { 
     return null; 
    } 
    ra.seek(i*16); 
    ra.read(readObj); 
    ra.close(); 
    return readObj; 
} 
public static void write(long i, byte[] obj) throws IOException{ 
    File out=new File("./dat.txt"); 
    RandomAccessFile ra=new RandomAccessFile(out,"rw"); 
    if (!out.exists()) 
    { 
     out.createNewFile(); 
    } 
    long size=out.length(); 
    if (i*16>size) 
    { 
     ra.seek(out.length()); 
     for (long j=size;j<i*16;j+=16) 
     { 
      byte[] b=new byte[16]; 
      ra.write(b); 
     } 
    } 
    ra.seek((i)*16); 
    System.out.println(new String(obj)); 
    ra.write(obj); 
    ra.close(); 
} 
public static void main(String[] args) throws IOException{ 
    write(35,read(4)); 
} 
+1

'out.exists()/ createNewFile()'塊在最好情況下毫無意義,但尤其如此*在構建了'RandomAccessFile'之後。去掉它。 – EJP

+0

Hi Mitko。答案已在下面提出,你是否能夠回覆它,並回答它是否幫助你? – halfer

+1

@halfer嗨,我留下重播和可能的解決方案。你可以看下面的 –

回答

1

我想你誤解了你的編輯告訴你的。

首先,並非每個可能的字節序列都是有效的UTF-8字符串,請參閱"UTF-8 decoder capability and stress test"。因此,當您將16個字節從UTF-8文件的一個位置複製到另一個位置時,您可能會收到一個不再包含有效UTF-8文本的文件。

我懷疑你在凱特打開了相同的文件來查看你的編輯結果。編輯對你說的是,它注意到你打開的文件不是一個有效的UTF-8文件,因此它不知道如何正確處理它,從而防止意外損壞你潛在的寶貴數據,現在看起來像二進制(不是文本)到編輯器,編輯器拒絕將任何內容從UI保存回該文件。這不會更改文件系統級別的任何權限,可能其他(dumber)編輯器不會警告您這種可能的損壞。

0

謝謝你的回覆。我解決了這個問題。

有時候文本編輯器在文件末尾增加一個額外的字節,在Java中不支持該字節。通常這是EOF字節,並被視爲UTF-8,其中Java只接受寫入/讀取ASCI字節,但通過writeUTF()方法進行操作除外。

此字節在文本編輯器中是不可見的,這就是我寫這篇文章的原因。

花了我兩天的時間才發現問題所在,但如果有人被卡在這裏,請記住EOF字節。