File#renameTo(File file)で、移動できない
事象
- Java
- Linuxだとファイル移動できるのだけれど、Windowsだと移動できない。
- renameToの引数のFileオブジェクトとなるファイル自体を 直前の処理で、FileInputStreamでオブジェクトを生成し、そのStreamを使っていた。
- Streamを閉じていないから移動できないというだけだった。とほほ・・・。
内部の動き
renameToはファイルシステムの機能?を利用してファイルを移動する。
renameToのソースを追ってみると、
java.io.Fileの renameTo(File) ↓ java.io.Win32FileSystemの rename(File file, File file1) ↓ java.io.WinNTFileSystemの native boolean rename0(File file, File file1);
native が付いてる。もう追えない。
native修飾子:メソッドの実装がJava以外の言語で記述されコンパイルされていることを示す。
それぞれのクラスのコードは、以下のような感じ。jadclipseを使って
表示した結果に基づき表示しています。
Fileクラス
package java.io; public boolean renameTo(File file) { SecurityManager securitymanager = System.getSecurityManager(); if(securitymanager != null) { securitymanager.checkWrite(path); securitymanager.checkWrite(file.path); } return fs.rename(this, file); }
Win32FileSystemクラス
package java.io; public boolean rename(File file, File file1) { cache.clear(); prefixCache.clear(); return rename0(file, file1); }
WinNTFileSystemクラス
package java.io; protected native boolean rename0(File file, File file1);