2017-09-29 11 views
0

사실, 작성한 직후 XML 리소스가 사용하는 파일을 만듭니다. 프로그램 실행이 끝나면 파일을 삭제해야합니다.Java 프로그램이 쓰여진 후에 파일 쓰기를 사용할 수 없습니다.

내가 프로그램을 실행

, 파일은 아직 ... 파일 FileWriter 사용하여 작성해야합니다 존재하지 않습니다 :

File file = new File("src/main/resources/org/avalin/optaplanner/solver/employeeShiftsScoreRules.drl"); 
try (FileWriter fileWriter = new FileWriter(file)) 
{ 
    fileWriter.write("Content..."); 
    fileWriter.flush(); 
    fileWriter.close(); 
} 
catch(IOException e) 
{ 
     e.printStackTrace(); 
} 

를 그리고이 코드가 있습니다

private static synchronized Solver buildSolver() 
{ 
    SolverFactory solverFactory = 
    SolverFactory.createFromXmlResource(SOLVER_CONFIG_XML); 
    return solverFactory.buildSolver(); 
} 
를이 일어나는 것이다

filewriting도 동기화 된 메서드로 래핑됩니다. 그러나 나는 동일한 변수에 직접 액세스하지 않기 때문에 아무런 효과가 없다고 가정합니다. 파일을 위에 표시된 SOLVER_CONFIG_XML에서 읽습니다.

프로그램이 끝나면 지정된 경로의 파일을 삭제하므로 다음에 실행될 때 프로그램에 지정된 매개 변수에 따라 생성됩니다.


지금이 파일이 기록되지 않습니다 말, 내가 오류가 프로그램을 처음 실행 ... 일 것입니다. 스레드 "주요"java.lang.IllegalArgumentException가의

예외 : scoreDrl (조직/avalin/optaplanner/해결사/employeeShiftsScoreRules.drl는) 클래스 로더

I의 클래스 패스 자원으로 존재하지 않는 파일 쓰기 직후에 인쇄물을 만들 수 있지만, 처음에는이 방법을 사용하지 않았지만 어떤 이유로 든 프로그램이 처음 실행되기 전에 파일이 "생성"되지 않았습니다.

두 번째로, 예외가 발생하기 전에 파일이 생성되었으므로 프로그램이 정상적으로 실행됩니까?

내 프로그램의 다음 부분이 실행되기 전에 파일이 "완전 작성"되어 있는지 확인하는 방법이 있습니까? 파일은 사용자가 입력 한 내용에서 동적으로 생성되므로 매번 길이가 다르므로 확인할 수 없습니다. 필자는 fileWriter.close()에서 만든 프린트를 실행 했으므로 완전히 쓰여졌을 것으로 추측 하겠지만 명백하게는 그렇지 않습니다.

+0

시작시 클래스 로더가 사용 가능한 파일을 캐시하는 것처럼 보입니다. 캐시를 무효화하거나 사용자 정의 클래스 로더를 사용해야 할 수도 있습니다. – daniu

답변

1

리소스 소스의 표준 위치 인 src/main/resources 폴더에 파일을 쓰는 것처럼 보입니다. 즉 빌드 시스템이 실행중인 프로그램이 아닌 파일을 읽는 위치입니다. .

실행중인 문제의 클래스 경로에 원본 폴더를 추가 할 수는 있지만 좋지 않은 방법입니다. 빌드 시스템이 출력을 쓰는 위치를 확인하고 (클래스 파일과 복사 된 리소스의 폴더를 구분할 수 있음) 거기에 파일.

+0

당신은 내가 자바 폴더에 그것을 쓰고 다음 리소스에 복사 한 후 제안 할 것이라고? 차이가 있니? – Avalin

+0

리소스 폴더에 복사하는 대신 리소스 폴더로 옮길 수는 있지만 여전히 원본 폴더를 부적절하게 사용하게되며, 경우에 따라 폴더가 보호되는 경우 문제가 될 수 있습니다. 출력 폴더를 시스템 속성/환경 변수로 전달하여 외부에서 제어 할 수 있습니까? – Kunda