Clob.setCharacterStream behaves differently depending on whether you use the embedded or the client driver.
Sample output from the repro:
(embedded) Initial : 123456789
(embedded) After : 12__56789
(client) Initial : 123456789
(client) After : 12__
As can be seen, the client driver truncates the Clob value when it writes to it, whereas the embedded driver does not and instead replaces existing characters with those written to the character stream.
(BTW: I know the title is not perfectly accurate, but it got so long when explaining that it is when you actually write to the stream returned by Clob.setCharacterStream the result differs.)