A driver is a piece of code that connects a piece of hardware to an operating system. C/C++ code complies to assember for a particular OS. Java requires a runtime environment to be interpreted or be just-in-time compiled. For hardaware that needs to run fairly fast, like a sound or video card, performance would drop signifigantly.
Furthermore, Java doesn't bind very well to hardware (assembler) requirements like addresses in pointers and interrupts. Even if it did, there's a chance Java wouldn't offer what your hardware needs from a driver perspective.
But worst of all, also there's a problem of support. Java is _supposedly_ "write once, run anywhere." Hah, it's more like write once, break everywhere. It ideally runs on all hardware with a compatible run-time environment. But reality is not ideal, each platform has to implement the runtime, and there can be differences, even pieces not implemented yet. And if a bug fix changes the runtime down the road, it may break your driver, even though you are running on the same hardware. Imagine installing a service pack then not being able to boot because some of your drivers are hosed. Complied code that does not use a runtime would never have this problem.
Bottom line: C/C++ .is stabler and faster than Java. Java is good for applications (particularly web-based) but C is king of system-level code.