Вместо UTF-16 подумайте о «внутреннем представлении» вашей строки. Строка в Java - это какие-то символы, вам все равно, какая кодировка используется внутри. Кодирование становится актуальным, если вы взаимодействуете с внешним миром программы. В вашем примере saveTextInDb, readTextFromDb и write делают это. Каждый раз, когда вы обмениваетесь строками с внешней стороной, используется кодировка для преобразования. saveTextInDb (и read) выглядят как самодельные методы, по крайней мере, я их не знаю. Поэтому вы должны посмотреть, какая кодировка используется для этих методов. Метод write of Writer всегда создает байты, которые представляют кодировку, связанную с Writer. Если вы получаете ваш Writer от HttpServletResponse, ассоциированная кодировка используется для вывода ответа (который будет отправлен в заголовках).
response.setEncoding("UTF-8");
Writer out = response.getWriter();
Этот код возвращается без Writer, который переводит строки в кодировку UTF-8. Похоже если пишешь в файл:
Writer fileout = new OutputStreamWriter(new FileOutputStream(myfile), "ISO8859-1");
Если вы обращаетесь к БД, используемая вами структура должна обеспечивать согласованный обмен строками с базой данных.