One minor point: Would it be better readStringSafely move to WritableUtils?
Re-looking at the patch, i think it makes sense. +1
One serious question: I am not sure why we need to open up the internal Buffer class of DataOutputBuffer, or need to support the construction based on an external byte. For the least, the ctor should clearly identify the ownership of the byte. But based on the implementation of DataOutputBuffer, it seems that the ownership has to be transferred to DataOutputBuffer and the caller of this ctor should not retain the reference to byte.
HADOOP-6226 was opened to address this. I propose that we actually close that jira, and have the implementation in the mapreduce package as part of MAPREDUCE-318