문제

특정 파일을 열어주는 Jedit (Beanshell) 매크로가 있으며 파일을 즉시 C : Temp 폴더에 저장합니다 (실수로 실제 파일을 업데이트하지 않도록).

Bean Shell 코드는 다음과 같습니다.

logFilePath = "c:\\temp\\aj.txt";
jEdit.openFile( view , logFilePath );
_buffer = jEdit.getBuffer(logFilePath);
_buffer.save(view,"c:\\temp\\backup.txt",true);

이것은 다음과 같은 오류를줍니다.

I/O Error
Each buffer can only execute one input/output operation at a time.  
Please wait until the current operation finishes 
(or abort it in the I/O progress monitor) before starting another one.  

나는 기다릴 때까지 기다릴 루프를 추가하려고 노력했다. buffer.isLoaded() 사실이지만, 그것은 단지 무한 루프로 들어갑니다.
효과가있는 것 같다는 것은 메시지 상자를 팝업하는 것입니다. Macros.message ). 그러나 나는이 불필요한 대화를하고 싶지 않습니다.

나는 자바를 많이 모른다. 그래서 내가 신인 실수를하고 있는지 말해줘.

업데이트:

내 자신의 답변을 추가하여 Serhii의 대답.

도움이 되었습니까?

해결책

당신은 시도 할 수 있습니다 이 솔루션, 전화 VFSManager.waitForRequests();.

다른 팁

이것은 작동합니다

이것은에 의해 지적 된 코드입니다 Serhii의 대답, 위에.

추가하다 VFSManager.waitForRequests(); jEdit.openFile() 명령.

전체 코드

logFilePath = "c:\\temp\\aj.txt";
jEdit.openFile( view , logFilePath );

VFSManager.waitForRequests();

/* 
    VFSManager.waitForRequests();

    jEdit waits then for the file to be completely loaded before continuing 
    ... It's designed for waiting on all 'pending I/O requests'".
*/

_buffer = jEdit.getBuffer(logFilePath);
_buffer.save(view,"c:\\temp\\backup.txt",true);

당신은 또한 그것을 덜 대담하게 할 수 있습니다.

  1. jedit.openfile ()의 반환 값을 사용하십시오. 이것은 이미 버퍼이며 getbuffer ()가 필요하지 않습니다.
  2. 모든 요청을 기다리는 vfsmanager.waitforRequests ()를 호출하지 말고 Jedit.openFile ()에서 얻은 버퍼에 버퍼 리스트너를 추가 하고이 리스너의 버퍼로드 메소드에서 저장 호출을 수행하십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top