2011-10-14 11 views
7

Java NIOはWindowsで特別な権限が必要ですか?私は、Windows Server 2003上の次のJavaコードを実行するとJava NIOとWindowsのディスクアクセス

、それはで失敗し、「アクセスが拒否されました」エラー(それはcygwinのターミナルウィンドウで全体のメッセージです):

new FileOutputStream(outputFile).getChannel() 
    .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE); 

が、私は、Apacheのコモンズを使用する場合-io(私はNIOを使用していないと仮定している、それは同じ入力ファイルと出力ファイルで動作します。

final FileInputStream inputStream = new FileInputStream(inputFile) 
final FileOutputStream outputStream = new FileOutputStream(outputStream) 
IOUtils.copy(inputStream, outputStream); 

私は管理者アカウントを使用してJava 5で実行しています設定する必要がありますいくつかの特別なファイルのアクセス権があります

+0

これはJVMバグです。あなたはJava 6または7を試しましたか? –

+0

現時点ではアップグレードできません。企業の問題。 – Ralph

+0

他のアプリケーションでoutputFileを開いていますか?すべてのアプリケーションは、このoutputFileを一点で開いた状態で閉じていますか? Windowsでは、使用していると思われるファイルには奇妙な問題がある可能性があります。言い換えれば、マシンをリブートして、すぐにそのテストを実行してみてください。 – sjngm

答えて

4

理由はコードである:

new FileOutputStream(outputFile).getChannel() .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);

コードはいくつかのレベルで間違っています。

  • ストリームがクローズされていない場合、例外はほとんどの場合、ファイルが書き込みに使用できない可能性が高いことを意味します。ユーザーが実際にアクセスできる場合、他の操作が終了するのを防ぐリソース・リーク(つまり、クローズではない)に対する例外の「拒否アクセス」タイプのタイプ。

  • w/oループのように転送することはできません。 Windows上で動作しますが、transferTo/Fromはすべてを一度に読み書きしません。これはinputStream.read() - > outputStream.write()と同じですが、OSによってマッピングされたDMAを使用できる点を除いて同様です。

  • OSはサポートしていないため、WindowsではTransferTo/Fromは役に立たないため、実際には動作します。エミュレートされます。 Linux/Solaris/MacOSでは、Xバイトを転送して完了できます。

+0

いい説明。 – Ralph

+0

btw、sun.io.ch(およびすべてのsun。***)コードが利用可能です:http://download.java.net/openjdk/jdk6/ – bestsss

+0

私はWindows APIに慣れていません。 TransferTo/FromはAPIに何か不足しているか、まだ実装されていないために機能しないのですか? – Ralph

0

実行中のコンテキストは?同じファイルを使用する同時スレッドがありますか?

この場合、FileChannelは、使用しているファイルのすべてまたは一部をロックします。ロック方法(部分ファイルまたはすべてのファイル)は、プラタフォームに依存し、この技術のためにWindows 2003が時代遅れのプラタフォームである可能性があります。

解決方法:OSを変更するか、ApacheコモンズIOを使用してください。

注:1つの要求でファイルをブロックし、ブロックを解除しない場合は、jvmを再起動する必要があります。

+0

Windows以外のものでは、コードは(ファイルをコピーするために)機能しません。 – bestsss

+0

@bestsss 3番目のポイント(http://docs.oracle.com/javase/6/docs/api/java/nio/channels/FileLock.html)への1rsポイントと2番目の段落参照への注釈参照。 あなたの答えに1つの投票。 私の英語が貧しい人にはお詫び申し上げます。おかげさまで – angelcervera

関連する問題