return new String(b);
Таким образом, вы зависите от кодировки символов по умолчанию на сервере, которая сама по себе может быть неправильной. Представьте, что byte[]
содержит байты UTF-8 и серверный компьютер настроен на использование ISO-8859-1 в качестве кодировки по умолчанию, тогда new String(b)
может возвращать mojibake . Вы хотите указать кодировку символов явно.
return new String(b, "UTF-8");
Что касается подхода, я бы порекомендовал использовать сервлет, который возвращает полноценный файл .css
выше, помещая стили raw в <style>
. Таким образом, вы получаете страницу меньшего размера (в байтах) и можете контролировать кэширование возвращенного файла CSS, так что вам не обязательно возвращать его при каждом запросе. Это, наконец, более эффективно с точки зрения использования полосы пропускания сети и ресурсов процессора / памяти сервера.
<link rel="stylesheet" href="cssservlet?id=123" />
где файловый сервлет делает что-то вроде этого:
byte[] bytes = themeDAO.get(request.getParameter("id"));
response.setContentType("text/css;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setDateHeader("Expires", System.currentTimeMillis() + 604800000L); // Cache for one week.
response.getOutputStream().write(bytes);
Чтобы улучшить его, пусть он возвращает InputStream
вместо byte[]
, так что это немного более эффективно использует память (byte[]
сохраняется полностью в памяти, в то время как InputStream
это просто указатель). Затем запишите его в OutputStream
обычным способом ввода-вывода Java с небольшим байтовым буфером.
Смотри также: