DataInputStream.readUTF is using a public String constructor, which forces the char array to always be reallocated and copied. It is frequently the case that the char array created by readUTF will be of exactly the right length, and could be used as-is, without copying, if only there was a privilged way for it to create a String.
In an RMI server that I have, which involves serialization via RMI and then serialization to a file for persistent storage, over 4Kb of heap is allocated and then discarded by readUTF per single RMI call to the server. It would be very beneficial to eliminate this overhead.