좋아,이 질문은 꽤 오래지만, FileChannels 자바 1.4부터 존재의 문제를 다룰 때 그들은 어디서나 언급되지 않은 이유를 모르겠어요 파일의 내용 바꾸기 또는 삽입하기. FileChannels이 빠르면 사용하십시오.
여기 예입니다 (예외 및 다른 물건을 무시) : 당신이 이해 너무
public void insert(String filename, long offset, byte[] content) {
RandomAccessFile r = new RandomAccessFile(new File(filename), "rw");
RandomAccessFile rtemp = new RandomAccessFile(new File(filename + "~"), "rw");
long fileSize = r.length();
FileChannel sourceChannel = r.getChannel();
FileChannel targetChannel = rtemp.getChannel();
sourceChannel.transferTo(offset, (fileSize - offset), targetChannel);
sourceChannel.truncate(offset);
r.seek(offset);
r.write(content);
long newOffset = r.getFilePointer();
targetChannel.position(0L);
sourceChannel.transferFrom(targetChannel, newOffset, (fileSize - offset));
sourceChannel.close();
targetChannel.close();
}
을,이 자바 단지 제한하지 않습니다. 이것은 모든 I/O가 작동하는 방식입니다. 기본 OS가 제공하는 기능입니다. –
아마 파일의 중간에 빠른 데이터 삽입을 허용 할 수있는 연결 목록 데이터 블록과 같은 것을 지원하는 파일 시스템 구현이 있습니다. 그러나 이것을 달성하기 위해서는 꽤 낮은 수준의 시스템 호출이 필요합니다. –
정확한 기사를 찾을 수 없지만 간단한 텍스트 편집기를 구동하는 데이터 구조로 로프를 사용하는 방법을 설명하는 기사를 읽었습니다. http://en.wikipedia.org/wiki/Rope_%28computer_science%29 – Albert