#java #spring-boot #file #download
Вопрос:
Я хочу загрузить текстовый файл, нажав на кнопку, все работает нормально, как и ожидалось. Но проблема в том, что данные, которые я хочу вставить в текстовый файл, состоят всего из одной строки.
Строка fileContent = «Простое решение Загрузить пример 1»; здесь n не работает. Это приводит к выходу в виде:
Simple Solution Download Example 1
Фрагменты кода:
интерфейс:
реализация интерфейса в моем классе обслуживания:
контроллер:
Комментарии:
1. Пожалуйста, опубликуйте код в виде текста, а не в виде изображений.
2. В Windows конец строки состоит из двух символов «rn».
3. Я сам не знаю, как это сделать, но вам лучше сохранить
n
единственное, но записывать в файл в виде текста, а не двоичного файла, иначе пользователи Linux и Mac будут жаловаться на лишнееr
, когда они пишут.4. Из моего офиса я не могу видеть ваш код, пожалуйста, опубликуйте код как код, а не как внешнюю ссылку
Ответ №1:
Не используйте жестко n
rn
закодированные разделители строк — разделители строк зависят от платформы (Windows отличается от всех других ОС).
Что вы можете сделать, так это:
- Воспользуйся
System.lineSeparator()
- Создавайте контент с
String.format()
помощью и заменяйтеn
его%n
Комментарии:
1. Мне нужно развернуть приложение в моем Linux env, поэтому я использовал System.LineSeparator(); в противном случае rn отлично работает в Windows. Спасибо за рекомендацию.
Ответ №2:
Основная проблема заключается в том, что серверный компьютер и клиентский компьютер в основном независимы в отношении кодировки набора символов и разделителей строк. По умолчанию не подойдет.
- Поскольку мы живем в мире, ориентированном на Windows (я линуксер), пользователь
"rn"
. - Затем java может смешивать любой сценарий Unicode. Файл не содержит информации о его кодировке. Если он возникает на другом компьютере/платформе, это вызывает проблемы.
String fileContent = "Simple Solution façade, mañana, €rn" "Download Обичам ĉĝĥĵŝŭ Example 1";
Таким образом, исходный компьютер явно определяет кодировку. Этого не должно быть:
fileContent.getBytes(); // Default platform encoding Charset.defaultCharset().
Таким образом, исходный компьютер может выполнять:
fileContent.getBytes(StandardCharsets.UTF_8); // UTF-8, full Unicode. fileContent.getBytes("Windows-1252); // MS Windows Latin 1, some ? failures.
Тип содержимого может быть установлен соответствующим образом в
"text/plain;charset=UTF-8"
Windows-1252 или для Windows-1252"text/plain;charset=ISO-8859-1"
.И из этого
byte[]
вы должны сделать вывод.length
о длине содержимого. - Для записи в файл можно использовать Files.WriteString
В этом случае используйте
Files.size(exportedPath)
для длины содержимого. Files.newInputStream(exportedPath)
это третий товар из файлов.