(Я думаю, что "без строковой части" вы ссылаетесь на байты, которые ObjectOutputStream испускает при его создании. Возможно, вы не хотите использовать ObjectOutputStream, но я не знаю ваших требований.)
Просто FYI, Unicode и UTF-8 - это не одно и то же. Юникод - это стандарт, который определяет, среди прочего, какие символы доступны. UTF-8 - это кодировка символов, которая определяет, как эти символы должны быть физически закодированы в 1 и 0. UTF-8 может использовать 1 байт для ASCII (<= 127) и до 4 байтов для представления других символов Юникода. </p>
UTF-8 является строгим надмножеством ASCII. Таким образом, даже если вы зададите для файла кодировку UTF-8 и напишите в него «abcd», он будет содержать только эти четыре байта: они имеют ту же физическую кодировку в ASCII, что и в UTF-8.
Ваш метод использует ObjectOutputStream
, кодировка которого существенно отличается от кодировки ASCII или UTF-8! Если вы внимательно прочитаете Javadoc, если obj
является строкой и уже произошла в потоке, последующие вызовы writeObject
приведут к отправке ссылки на предыдущую строку, что может привести к тому, что в регистр повторяющихся строк.
Если вы серьезно относитесь к пониманию этого, вам действительно следует потратить много времени на чтение о Unicode и системах кодирования символов. В Википедии есть отличная статья о Юникод в качестве начала.