2010-03-18 6 views
3

Ok. java로 텍스트 파일에서 행을 삭제하려고합니다. 현재 내가하고있는 방식은 라인 번호를 추적하고 색인을 입력하는 것입니다. 인덱스는 삭제하고 싶은 라인입니다. 그래서 새로운 데이터 라인을 읽을 때마다 라인 수를 증가시킵니다. 이제 동일한 인덱스 인 줄 수에 도달하면 임시 파일에 데이터를 쓰지 않습니다. 이제는 작동하지만, 예를 들어 거대한 파일 작업을하고 메모리 제한에 대해 걱정해야한다면 어떨까요? 파일 마커로 어떻게 할 수 있습니까? 예를 들어 .. 파일 마커를 삭제하려는 행에 배치하십시오. 그런 다음 해당 행을 삭제 하시겠습니까? 아니면 너무 많은 일입니까?Java에서 파일에서 행을 삭제하십시오.

+0

내가 파일을 메모리로 읽어 들여 사용자가 색인을 입력하도록 허용 한 다음 파일을 다시 쓸 수 있는지 의문을 갖도록하려면? –

+0

또한 파일의 크기는 얼마나됩니까? –

답변

1

nio을 사용하여 해당 줄에 해당하는 파일 영역을 삭제할 수 있습니다.

편집FileChannel을 만들고 Buffer, 당신은, 파일을 열고 그 위에 후 제공되는 컨텐츠를 밀어 필요한 라인을 지울 수 사용하여 몇 가지 힌트를

을 추가했다.

불행히도, 나는 approximatly 여기 중지 NIO의 내 지식 ...

+0

자세한 내용? 그 기술은 그 링크에서 전혀 명백하지 않습니다. –

0

당신은 랜덤 액세스 파일을 사용할 수를 고백해야합니다. 읽고있는 바이트와 쓰고있는 바이트에 대한 포인터를 유지하십시오. 버퍼로 데이터를 채우십시오. 그리고 읽으면 버퍼가 계산됩니다. 삭제할 것이 없으면 채널을 쓰기 포인터로 재설정하고 버퍼를 출력 한 다음 채널을 읽기 포인터로 재설정하십시오. 삭제할 줄을 찾으면 쓰기 색인의 해당 지점으로 버퍼를 출력 한 다음 줄의 끝을 찾을 때까지 읽기 포인터를 증가시킨 다음 버퍼의 나머지를 출력합니다 (필요에 따라 버퍼 다시 채우기). 다음과 같이 반복하십시오. 삭제할 각 행에 대해

0

이상적으로, 나는 일종의 배치 작업을 수행하기 위해 ETL 도구를 사용합니다. 이러한 도구에 액세스 할 수 없다고 가정하면 파일을 먼저 압축 해제 한 다음 java.util.zip을 사용하여 읽을 것을 권장합니다.

여기에 좋은 방법은 tutorial입니다.

희망이 도움이됩니다.

+1

필자는 파일을 압축하면 메모리 사용량이나 실행 속도가 향상 될 것이라고 생각하지 않습니다. –

+0

내가 당신을 팔로우하는지 모르겠다. 압축을하면 파일 크기가 작아지고 데이터가 적게 저장됩니다. 추가 된 실행 시간은 압축에 걸리는 시간입니다. – CoolBeans

+0

디스크에 압축 한 다음 읽는 동안 압축을 풀면 원래 크기와 동일한 크기의 메모리와 압축 메커니즘의 오버 헤드가 추가됩니다. 그렇게하면 다른 하나는 둥글게되고 메모리에서 바이트 버퍼로 압축됩니다. 크기가 더 작아 지므로 공간이 부족해질 때까지 조금 더 걸리 겠지만 어떤 시점에서는 여전히 메모리가 부족합니다. –

2

파일을 메모리에 보관하지 말고 한 번에 한 줄씩 읽은 다음 삭제할 줄을 건너 뛰고 한 줄에 임시 파일에 한 줄씩 쓰십시오.

+2

그가 이미하고있는 것처럼 들리는군요. –

관련 문제