Java will Bite You

Jon Yurek

You know that burning flushed feeling you get when you just got a really good zinger tossed in your face, possibly by your best friend, possibly by your worst enemy. Doesn’t matter. Anyway, on the “worst enemy” part, Java just threw one of those my way, except it wasn’t a zinger, it was the stinging burn of a day and a half of wasted effort.

In Windows, a File object will report false to the functions delete() and renameTo() if the file is currently in use. This does not happen on Linux, where I had originally tested it. I was trying to be all nice about it and use those functions because I figured they were the “right” way of doing it.

Java only responds to authority, it seems.

Changing to a flat out frontal assault (that is, FileOutputStream) on the file in question resulted in it being properly overwritten. What annoys me about this is that when I was originally testing yesterday whether or not I could copy over running files in Windows, I was using the copy command. This, like File.renameTo(), politely says the file is in use and to come back when the other program is finished, thank you and have a nice day. Later, I was messing around with xcopy because I was desperately seeking another venue for copying the damned files, and it overwrote them no problem. I guess, being xcopy, was more eXtreme than copy and the filesystem’s culture shock allowed xcopy to slip by. As such, I emulated its barbarian tactics, broke the door down, and I was in.

The moral of the story is, no more Mr. Nice Java for me. Forcibly inserting a URL into the System Classloader at runtime?

Yes, ma'am. I’ll do all that and more. I’m a bad boy now.