2017-12-27 14 views
2

StringBuilder처럼 기존 파일의 텍스트 삽입, 대체 및 삭제를 처리하는 구현 된 클래스 (Java)를 찾고 있습니다.Java에서 파일 영역을 삽입, 교체 및 삭제하는 방법은 무엇입니까?

StringBuilder를 사용하고 싶지 않은 이유는 모든 파일 내용이 메모리에 저장되는 것을 피하기 위해서입니다.

목적은 모든 프로그래밍 언어의 코드가 포함 된 파일에 패치를 적용하는 것입니다.

+0

어떤 파일입니까? 많은 파일에 임의의 삽입을 처리하지 못할 수도 있습니다 –

+0

변경 될 파일에 프로그래밍 코드가 포함되어 있습니다.이 파일은 정적 코드 분석 도구에 사용됩니다 코드의 오류를 패치합니다. – gibarsin

+0

파일 크기가 변경되는 방식으로 파일 영역을 삭제하거나 대체 할 수있는 클래스가 없습니다. 그러나 [RandomAccessFile] (https://docs.oracle.com/javase/9/docs/api/java/io/RandomAccessFile.html)을 살펴보십시오. 또는 이전 파일에서 새 파일을 만들고 필요에 따라 영역을 바꿉니다. – DodgyCodeException

답변

2

일반적으로 클래스는 한 가지 작업 만 수행하면됩니다.

즉, 코드를 읽고이를 내부 표현 (구문 분석 트리)으로 바꾸고, 문제를 즉시 파악하고, 내부 표현을 변경하고, 내부 표현을 다시 쓰는 단일 클래스를 찾는 일은 거의 없습니다. 디스크로 출력.

원하는 점을 감안하여 원하는 기능을 추가 할 수있는 프로젝트가 많이 있습니다.

Checkstyle은 구문 오류를보고 할 목적으로 Java 코드를 구문 분석합니다. 이렇게하려면 코드를 읽고이를 내부 표현으로 바꾸고 문제를 발견 (형식 지정)해야합니다. 목표에 따라 좋은 출발점이 될 수 있습니다.

PMD은 정적 코드 분석 도구입니다. Java 소스 코드에서 문제를 찾으려면 코드를 읽고 내부 표현으로 바꾸고 구조적 문제를 발견해야합니다.

이러한 도구 중 어느 것도 원하는 모든 작업을 수행 할 수 없습니다. 그러나 그들은 가까이에 있습니다. 발견 된 문제를 수정하여 파싱 된 트리에서 실행되는 "해결사"를 구성하면됩니다. 그런 다음 도구가 내부 구문 분석 (트리) 표현에서 코드 텍스트를 재구성하는 "출력기"를 제공하는지 찾아야하며,이를 사용하여 원하는 텍스트를 생성 한 다음 디스크에 저장합니다.

트리 - 텍스트 모듈이 없으면 작성해야 할 수 있습니다.

소스 코드는 규칙의 적용을받으며 이러한 추가 단계가 필요하지 않을 수도 있지만 코드의 수명이이 단계를 건너 뛸 때보 다 훨씬 커집니다. 단순히 코드 줄에 붙여 넣기 만하면 예기치 않은 입력에 이해할 수 없습니다. 사람이

public 
void 
myMethod(
    String one, 
    String two, 
    String three) 
{ 
    System.out.println("Haha! I broke you!"); 
} 

가능성이

public 
void 
@Overrides 
myMethod(
    String one, 
    String two, 
    String three) 
{ 
    System.out.println("Haha! I broke you!"); 
} 

로 이어지는 코드를 공급 것이기 때문에 예를 들어, 자바 메서드에 @Overrides 태그를 추가 가정이 의사 코드는

currentLine = next(); 
if (currentLine.detectMethod() and isAnOverride(currentLine().getMethod())) { 
    code.insertBefore(currentline, "@Overrides"); 
} 

을 실패합니다 그리고 "글쎄, 아무도 그렇게하지 말아야 해!"라고 말할 수 있습니다. 그러나 언어가 허용하는 경우 언어 자체와는 확연히 구분됩니다.

나를 믿지 않으면 라인별로 프로세서가 메서드로 "public"을 감지하지 못하고 메서드로 "void"도 검색하지 않지만 "myMethod ("를 잘못 식별 된) 패키지 다중 회선 방식

+2

브라보! 여전히 좋은 교육적 답변을 읽는 것이 좋습니다. – gtgaxiola

+0

@gtgaxiola 친절한 서비스를 제공해 주셔서 감사합니다. –

+0

이 포스트는 교육적이지만 모든 OP가 찾고있는 클래스는 abcde.fgh라는 파일을 열고 12345 바이트 오프셋으로 이동하여 다음 6자를 "hello world"로 바꿀 수있는 클래스라고 생각합니다. – DodgyCodeException