質問

特定のファイルを開き、すぐにファイルをc:\ tempフォルダーに保存するJEdit(BeanShell)マクロがあります(実際のファイルを誤って更新しないように)。

Beanシェルコードは次のとおりです。

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()がtrueになるまで待機するwhileループを追加しようとしましたが、無限ループに入ります。
動作しているように見えるのは、メッセージボックス( Macros.message )をポップアップすることです。しかし、私は本当にこの不必要な対話を持ちたくありません。

Javaの知識があまりないので、ルーキーのミスを犯しているかどうか教えてください。

更新:

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()の戻り値を使用します。これは既にBufferであり、getBuffer()は不要です
  2. すべてのリクエストが完了するまで待機するVFSManager.waitForRequests()を呼び出さないでください。jEdit.openFile()から取得したBufferListenerにBufferListenerを追加し、このリスナーのbufferLoadedメソッドでsave呼び出しを行ってください。 )
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top