I can't directly answer to you "the best way" question. But here some
information that may help.
For RFCOMM InputStream.read() will return -1 if connection has been
closed gracefully on another end.
As to BlueCove "boolean timeouts" param in Connector.open has effect
only for obex connections. There not much in specification and in
native stacks APIs that will suggest how this can should be properly
implemented.
For OS X. Error codes can be found on this page:
http://developer.apple.com/documentation/Darwin/Reference/IOKit/IOReturn/CompositePage.html
Your case: The device is offline (0xe00002d7).