2017-03-16 2 views
0

RandomAcessFile을 사용하여 동일한 파일을 읽고 쓰려고 할 때 문제가 발생합니다.바이트 블록 쓰기 후 파일 변경 권한

파일에서 16 바이트 블록을 읽고 주어진 위치 (예 : 256 번째)에 같은 파일에 씁니다.

문제는 ra.write(b) 라인에 있습니다. 다음 줄이 실행되면 내가 말하는 텍스트 편집기 케이트에 메시지 (I 리눅스 Manjaro을 사용하고 있습니다) 가지고 :

파일 /home/mite/IdeaProjects/IspitJuni2015/dat.txt과 함께 연을 UTF-8 인코딩했지만 잘못된 문자가 포함되어 있습니다. 저장 모드가 내용을 파괴 할 수 있으므로 읽기 전용 모드로 설정됩니다. 올바른 인코딩을 선택하여 파일을 다시 열거 나 도구 메뉴에서 읽기 - 쓰기 모드를 다시 활성화하여 편집 할 수있게하십시오.

읽기 전용 모드로 설정됩니다. 또한 수동으로 Kate의 읽기 전용 권한을 선택 취소했지만 작동하지 않습니다. 무슨 문제가있는 것 같습니까?

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

안녕하세요 Mitko. 아래에 답변이 있습니다. 답변을 드릴 수 있습니까? 답이 도움이되었는지 여부에 관해 답장을 보낼 수 있습니까? – halfer

+1

@halfer 안녕하세요, 나는 재생과 가능한 해결책을 떠납니다. 너는 볼 수있다 –

답변

1

편집자가 귀하에게 알리는 내용을 오해 한 것 같습니다.

우선 가능한 모든 바이트 시퀀스가 ​​유효한 UTF-8 문자열은 아닙니다 (예 : "UTF-8 decoder capability and stress test" 참조). 따라서 UTF-8 파일의 한 위치에서 다른 위치로 16 바이트를 복사하면 유효한 UTF-8 텍스트가 더 이상 포함되지 않은 파일을 가져올 수 있습니다.

나는 케이트에서 열어 본 것과 같은 파일을 가지고 편집 결과를보고 싶습니다. 편집자가 말한 것은 열어 본 파일이 유효한 UTF-8 파일이 아니므로 파일을 올바르게 처리하는 방법을 알지 못해서 현재 잠재적 인 귀중한 데이터가 우연히 손상되는 것을 방지한다는 것입니다. 바이너리 (텍스트가 아님)를 에디터에 보내면, 에디터는 UI의 내용을 그 파일로 다시 저장하는 것을 거부합니다. 이것은 파일 시스템 레벨에 대한 허가를 변경시키지 않으며 아마 다른 (멍청한) 편집자는 그러한 가능한 손상에 대해 경고하지 않을 것입니다.

0

답장을 보내 주셔서 감사합니다. 나는 그 문제를 알아 냈다.

가끔 텍스트 편집기가 Java에서 바이트로 지원되지 않는 파일 끝에 하나의 여분의 바이트를 추가하는 경우가 있습니다. 대개 이것은 EOF 바이트이며 UTF-8로 처리됩니다. Java는 writeUTF() 메소드를 통한 조작을 제외하고는 ASCI 바이트 쓰기/읽기 만 허용합니다.

또한이 바이트는 텍스트 편집기에서 볼 수 없으므로이 게시물을 작성한 이유가 여기에 있습니다.

문제가 무엇인지 알아 내는데 이틀이 걸렸지 만, 누군가가 여기에 걸린다면 EOF 바이트를 유념하십시오.