Перейти к содержимому

Как сохранить txt файл в бд spring

  • автор:

Как правильно сохранять файлы на сервере. Spring MVC

Хелп ми!!
Как правильно сохранить картинку в базе или в файловой системе?
Сейчас я сохраняю по пути что мне дает getRealPath(), но при пересборке проекта папки и файлы все удаляются( оно и понятно.

Лучшие ответы ( 2 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Spring MVC как правильно сочетать .html и .jsp страницы
Здравствуйте! Возник такой вопрос: как правильно совместить .html страницы и .jsp, используя.

Intellij IDEA 14 + spring MVC, как правильно установить готовый проект на сервер?
Приветствую! Не могу нагуглить ответ на вопрос, заданный в теме топика. Т.к. почти закончил.

Путь для сохранения файла на сервере (Spring Hibernate MVC)
Добрый день. Фйал загружает, пользователь в форме и передает на сервер. А какой правильно путь.

Как правильно сохранять файлы Аccess через SaveFileDialog()?
Stream myStream; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); .

1240 / 853 / 264
Регистрация: 02.04.2009
Сообщений: 3,225
AndreyMag, https://examples.javacodegeeks. framework/

Kukstyler, ух, зачетный сайтег!

Меню пользователя @ iSmokeJC

Эксперт Java

3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
iSmokeJC, https://spring.io/guides/gs/uploading-files/
вот зачетный сайтик
Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

18968 / 9663 / 2710
Регистрация: 21.10.2017
Сообщений: 21,473
xoraxax, ну, это известный зачетный сайтег, а тот неизвестный
1240 / 853 / 264
Регистрация: 02.04.2009
Сообщений: 3,225

xoraxax, на вкус и цвет.

iSmokeJC,
Регистрация: 09.10.2015
Сообщений: 34
Kukstyler, Т.е хранить в базе это хорошее решение?

Эксперт Java

2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672

Лучший ответ

Сообщение было отмечено Kukstyler как решение

Решение

ЦитатаСообщение от AndreyMag Посмотреть сообщение

Т.е хранить в базе это хорошее решение?
нет. Хранить надо на диске и маппить папку как статический ресурс. в БД только пути к картинкам
Регистрация: 09.10.2015
Сообщений: 34

KEKCoGEN, В том решении, что Вы кинули там запись идет в бд. Какой путь лучше использовать для хранения файлов?

Эксперт Java

2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672

Лучший ответ

Сообщение было отмечено AndreyMag как решение

Решение

ЦитатаСообщение от AndreyMag Посмотреть сообщение

В том решении, что Вы кинули там запись идет в бд. Какой путь лучше использовать для хранения файлов?

я не кидал никакого решения.
Если это настоящее продакшн решение, то использовать замаунтенный диск который реплицируется и бекапится
Если просто для себя потренироваться, то любуй путь.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как правильно открыть и сохранять файлы, которые используются текущим приложением
Есть программа, результаты её работы я могу сохранять в текстовый файл и потом открывать его. Всё.

Правильно ли все файлы сохранять в одну папку
Ребят,я только начинающий и совсем нуб в этом деле. В общем у меня есть готовый скрипт,точнее.

Spring MVC. 404 ошибка при включении Spring Data JPA в проект
Добрый день. Есть простой шаблонный проект с использованием Spring MVC и Maven. С зависимостями.

задания по spring core и spring mvc для новичков
Какие задания можно предложить новичкам для выполнения после знакомства их с spring core и mvc ?

Перевод проекта из Spring Maven в обычный Spring MVC
Здравствуйте. Подскажите, реально ли взять готовый проект, например -.

Jetty embedded + Spring MVC + Spring Security
Добрый день. По роду работы приходилось писать на JavaSE, в том числе и сложные клиент/серверные.

Загрузка файлов

Этот урок освещает процесс создания серверного приложения, которое может принимать загружаемый файл.

Что вы создадите

Вы создадите Spring MVC приложение, которое принимает загружаемый файл. Вы также соберете простой клиент для загрузки тестового файла.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше
  • Gradle 1.11+ или Maven 3.0+
  • Вы также можете импортировать код этого урока, а также просматривать web-страницы прямо из Spring Tool Suite (STS), собственно как и работать дальше из него.

Как проходить этот урок

Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.

Чтобы начать с нуля, перейдите в Настройка проекта.

  • Загрузите и распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью Git: git clone https://github.com/spring-guides/gs-uploading-files.git
  • Перейдите в каталог gs-uploading-files/initial
  • Забегая вперед, создайте класс конфигурации

Когда вы закончите, можете сравнить получившийся результат с образцом в gs-uploading-files/complete .

Настройка проекта

Для начала вам необходимо настроить базовый скрипт сборки. Вы можете использовать любую систему сборки, которая вам нравится для сборки проетов Spring, но в этом уроке рассмотрим код для работы с Gradle и Maven. Если вы не знакомы ни с одним из них, ознакомьтесь с соответсвующими уроками Сборка Java-проекта с использованием Gradle или Сборка Java-проекта с использованием Maven.

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:

└── src └── main └── java └── hello

Создание файла сборки Gradle

Ниже представлен начальный файл сборки Gradle. Файл pom.xml находится здесь. Если вы используете Spring Tool Suite (STS), то можете импортировать урок прямо из него.

Если вы посмотрите на pom.xml , вы найдете, что указана версия для maven-compiler-plugin. В общем, это не рекомендуется делать. В данном случае он предназначен для решения проблем с нашей CI системы, которая по умолчанию имеет старую(до Java 5) версию этого плагина.

buildscript < repositories < maven < url "http://repo.spring.io/libs-release" >mavenLocal() mavenCentral() > dependencies < classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.6.RELEASE") >> apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'spring-boot' apply plugin: 'application' run < args 'sample.txt' >jar < baseName = 'gs-uploading-files' version = '0.1.0' >repositories < mavenLocal() mavenCentral() maven < url "http://repo.spring.io/libs-release" >> dependencies < compile("org.springframework.boot:spring-boot-starter-web") testCompile("junit:junit") >task wrapper(type: Wrapper)

Spring Boot gradle plugin предоставляет множество удобных возможностей:

  • Он собирает все jar’ы в classpath и собирает единое, исполняемое «über-jar», что делает более удобным выполнение и доставку вашего сервиса
  • Он ищет public static void main() метод, как признак исполняемого класса
  • Он предоставляет встроенное разрешение зависимостей, с определенными номерами версий для соответсвующих Spring Boot зависимостей. Вы можете переопределить на любые версии, какие захотите, но он будет по умолчанию для Boot выбранным набором версий

Создание класса конфигурации

Для загрузки файлов с использованием контейнеров Servlet 3.0, вам необходимо зарегистрировать класс MultipartConfigElement (который соответствует в web.xml).

package hello; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.context.embedded.MultipartConfigFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import javax.servlet.MultipartConfigElement; @Configuration @ComponentScan @EnableAutoConfiguration public class Application < @Bean MultipartConfigElement multipartConfigElement() < MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setMaxFileSize("128KB"); factory.setMaxRequestSize("128KB"); return factory.createMultipartConfig(); >>

Этот класс использован для настройки сервера приложений, чтобы получить загружаемый файл, блогодаря аннотации @Configuration .

Скоро вы добавите Spring MVC контроллер, поэтому вам необходимы обе @EnableAutoConfiguration и @ComponentScan аннотации. Обычно вы использовали @EnableWebMvc для Spring MVC приложения, но Spring Boot автоматически добавляет эту аннотацию, когда обнаруживает spring-webmvc в вашем classpath. @ComponentScan делает возможным автоматический поиск классов с @Controller аннотацией.

Используя @EnableAutoConfiguration , приложение будет также обнаруживать MultipartConfigElement бин и делать его работоспособным для загрузки файла.

MultipartConfigElement Является стандартным Servlet 3.0 элементом, который задает ограничения на загрузку файлов. Он поддерживается всеми совместимыми контейнерами, такими как Tomcat и Jetty. В данном случае он настроен, изпользуя удобный MultiPartConfigFactory, на ограничение загрузки в 128KB. Но вы можете изменить настройки по своему усмотрению.

Создание контроллера загрузки файла

В Spring, REST обработкой занимаются Spring MVC контроллеры. Ниже приведенный код обеспечивает web-приложению возможность загрузки файлов.

package hello; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; @Controller public class FileUploadController < @RequestMapping(value="/upload", method=RequestMethod.GET) public @ResponseBody String provideUploadInfo() < return "Вы можете загружать файл с использованием того же URL."; >@RequestMapping(value="/upload", method=RequestMethod.POST) public @ResponseBody String handleFileUpload(@RequestParam("name") String name, @RequestParam("file") MultipartFile file) < if (!file.isEmpty()) < try < byte[] bytes = file.getBytes(); BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(name + "-uploaded"))); stream.write(bytes); stream.close(); return "Вы удачно загрузили " + name + " в " + name + "-uploaded !"; >catch (Exception e) < return "Вам не удалось загрузить " + name + " =>" + e.getMessage(); > > else < return "Вам не удалось загрузить " + name + " потому что файл пустой."; >> >

весь класс отмечен как @Controller , поэтому Spring MVC может выбрать его и просмотреть все маршруты.

Каждый метод помечен @RequestMapping , означая путь и REST действие. В этом случае, GET вернут очень простое сообщение о доступности POST операции.

Метод handleFileUpload предназначен для обработки двух частей сообщения: name и file . Он проверяет, что файл не пустой и, если это так, то скачивает байты. Далее, он записывает их через BufferedOutputStream . В итоге, добавляет -uploaded к имени файла, чтобы показать, что файл загружен.

В рабочем сценарии вы, вероятнее всего, будете помещать файлы во временный каталог, базу данных или даже NoSQL хранилище, как например в Mongo’s GridFS. Вам также необходимо контролировать место хранения во избежание заполнения файловой системы, а также избавить себя от таких уязвимостей, как загрузка исполняемых и перезапись существующих файлов.

Создание HTML формы для загрузки файла

Создайте «index.html» файл в src/main/resources/static (который будет соответствовать /static ):

   
File to upload:
Name:

Press here to upload the file!

Создание приложения исполняемым

Несмотря на то, что пакет этого сервиса может быть в составе web-приложения и WAR файлов, более простой подход, продемонстрированный ниже создает отдельное самостоятельное приложение. Вы упаковываете все в единый, исполняемый JAR-файл, который запускается через хорошо знакомый старый main() Java-метод. Попутно, вы используете поддержку Spring для встроенного Tomcat контейнера сервлетов как HTTP среду выполнения вместо развертывания на сторонний экземпляр.

package hello; import javax.servlet.MultipartConfigElement; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.context.embedded.MultipartConfigFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan @EnableAutoConfiguration public class Application < @Bean public MultipartConfigElement multipartConfigElement() < MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setMaxFileSize("128KB"); factory.setMaxRequestSize("128KB"); return factory.createMultipartConfig(); >public static void main(String[] args) < SpringApplication.run(Application.class, args); >>

Метод main() передает управление вспомогательному классу SpringApplication , предоставляя Application.class как аргумент его run() методу. Это говорит Spring о том, чтобы прочитать аннотацию метаданных из Application и управлять им как компонентом в Spring Application Context.

Аннотация @ComponentScan сообщает Spring о запуске рекурсивного поиска в пакете hello и потомках классов, отмеченных прямо или косвенно Spring аннотацией @Component . При этом гарантируется, что Spring найдет и зарегистрирует FileUploadController , потому что он отмечен @Controller , что в свою очередь является своего рода @Component аннотацией.

@EnableAutoConfiguration аннотация переключает на доступные по умолчанию настройки, основанные на содержимом вашего classpath. К примеру, т.к. приложение зависит от встраиваемой версии Tomcat(tomcat-embed-core.jar), то Tomcat сервер установлен и настроен по умолчанию от вашего имени. И также, т.к. приложение зависит от Spring MVC (spring-webmvc.jar), Spring MVC DispatcherServlet настроен и зарегистрирован за вас — web.xml не нужен! Поэтому здесь MultipartConfigElement , он настроен DispatcherServlet с функциональностью загрузки файлов. Автонастройка является мощным и гибким механизмом. Более подробно вы можете ознакомиться в API документации.

Сборка исполняемого JAR

Вы можете собрать единый исполняемый JAR-файл, который содержит все необходимые зависимости, классы и ресурсы. Это делает его легким в загрузке, версионировании и развертывании сервиса как приложения на протяжении всего периода разработки, на различных средах и так далее.

./gradlew build

Затем вы можете запустить JAR-файл:

java -jar build/libs/gs-uploading-files-0.1.0.jar

Если вы используете Maven, вы можете запустить приложение, используя mvn spring-boot:run , либо вы можете собрать приложение с mvn clean package и запустить JAR примерно так:

java -jar target/gs-uploading-files-0.1.0.jar

Процедура, описанная выше, создает исполняемый JAR. Вы также можете вместо него собрать классический WAR-файл.

Запуск сервиса

Если вы используете Gradle, вы можете запустить ваш сервис из командной строки:

./gradlew clean build && java -jar build/libs/gs-uploading-files-0.1.0.jar

Если вы используете Maven, то можете запустить ваш сервис таким образом: mvn clean package && java -jar target/gs-uploading-files-0.1.0.jar .

Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:

./gradlew bootRun

С mvn — mvn spring-boot:run .

Этим запускается серверная часть для получения загружаемого файла. Отладочные данные отображены. Сервис должен быть поднят и запущен через несколько секунд.

Когда сервер запустится, вам необходимо будет открыть браузер и зайти на http://localhost:8080, чтобы увидеть форму загрузки. Выберите (небольшой) файл и нажмите «Upload», вы должны увидеть страницу об успешной работе контроллера. Выбрав файл больше, вы получите некрасивую страницу об ошибке.

Вы должны в итоге увидеть следующее в окне вашего браузера:

You successfully uploaded into -uploaded!

Сам контроллер ничего не печатает, но вместо этого он возвращает сообщение, размещая в окне браузера.

Итог

Поздравляем! Вы только что написали web-приложение, которое используя Spring, обрабатывает загрузку файла.

С оригинальным текстом урока вы можете ознакомиться на spring.io.

Как сохранить текстовый файл на Java

Давайте сгенерируем строку из случайных символов на Java и затем сохраним её в текстовый файл. На этом примере рассмотрим несколько вариантов сохранения. Строка должна быть очень большой (более 100 миллионов символов), чтобы мы могли легко заметить разницу во времени, которое требуется на сохранение файла.

Генерируем большую случайную строку

Приведу код метода, который в цикле генерирует случайные UUID и формирует результирующую строку, в которой эти UUID разделены символом перевода строки.

public String prepareData( int count) <
var data = new StringBuilder();
for ( int i = 0 ; i < count; i++) <
data.append( UUID .randomUUID()).append(System.lineSeparator());
>
return data.toString();
>

Для формирования результирующей строки используем StringBuilder, который не вызовет накладных расходов при большом количестве конкатенаций строк в цикле. Чтобы ставить правильный символ перевода строки, который зависит от вашей ОС, используем метод lineSeparator(). Каждый UUID имеет фиксированную длину, равную 36 символам.

Запись с помощью FileWriter

Один из самых простых способов записать данные в текстовый файл – это использовать класс FileWriter. Метод принимает на вход экземпляр класса File и сами данные в виде строки. Данные пишем с помощью метода write().

public void writeFileSimple(File file, String content) <
try ( var fw = new FileWriter(file)) <
fw.write(content);
> catch (Exception e) <
throw new RuntimeException(e);
>
>

Обратите внимание, что FileWriter нужно обязательно инициализировать в конструкции try-with-resources, который автоматически освободит ресурс, связанный с этим файлом, при выходе из этого блока. Иначе пришлось бы явно вызывать метод close(). Для удобства перехватываем все исключения и оборачиваем их в RuntimeException, чтобы не прописывать их в сигнатуре метода.

Данный метод сохраняет текстовый файл размером 111 МБ на моём ноуте с SSD примерно за 300 миллисекунд.

Добавляем буферизацию

Этот метод можно значительно ускорить, добавив буферизацию потока. Для этого «обернём» FileWriter в BufferedWriter. Он также должен быть в секции инициализации try-with-resources.

public void writeFileBuffered(File file, String content) <
try (
var fw = new FileWriter(file);
var bw = new BufferedWriter(fw)
) <
bw.write(content);
> catch (Exception e) <
throw new RuntimeException(e);
>
>

Метод write() будем вызывать уже у буферизованного потока. Когда выйдем из блока try, JVM автоматически закроет BufferedWriter, а заодно с ним и FileWriter, поскольку один «обёрнут» в другой.

Данный метод сохраняет тот же файл размером 111 МБ примерно за 170 миллисекунд. То есть буферизация потока ускоряет запись файла почти в 2 раза!

Неблокирующая запись файла

Запись можно ещё немного ускорить, если использовать статический класс Files из пакета nio (неблокирующий ввод-вывод). В нём есть метод writeString(), который принимает экземпляр класса Path (его получаем из File), саму строку для записи и параметры открытия файла (мы здесь всегда создаём файл заново, поэтому CREATE).

public void writeFileNio(File file, String content) <
try <
Files.writeString(Paths.get(file.toURI()), content, StandardOpenOption. CREATE );
> catch (Exception e) <
throw new RuntimeException(e);
>
>

Данный метод сохраняет файл размером в 111 МБ в среднем за 145 миллисекунд, то есть ещё чуть быстрее.

Выводы

Как видите, даже огромные текстовые файлы по 100 МБ Java сохраняет менее, чем за секунду. Если вы работаете с маленькими файлами, разницы между рассмотренными реализациями почти нет. Однако быстрее всех оказался неблокирующий Files.writeString(). Если он вам по каким-то причинам не подходит, то обязательно используйте BufferedWriter.

База данных в текстовом файле

Создаю простое приложение которое должно хранить данные пользователя в текстовом файле (один для всех пользователей), авторизация также должна проходить на основе этого файла. Подскажите пожалуйста как это правильно организовать? Может у кого есть пример такого решения. Библиотеки использовать нельзя, также как и xml и json.

Отслеживать
задан 22 янв 2018 в 12:24
Андрей Оробец Андрей Оробец
3 3 3 бронзовых знака

Реализуйте на коленке csv, в случае если не требуется использование экранируемых символов (т.е. приложение запрещает использование запятых и прочего) это тривиально

22 янв 2018 в 12:28

Та в java даже готовый Properties есть, который что то на вроде ini строит. Даже на коленке не надо ничего писать. mkyong.com/java/java-properties-file-examples

22 янв 2018 в 12:45

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

у меня есть пример но не знаю может быть полезно для вас или нет ! И так! Во первых создайте папку и внутри создайте FILE в формате текст это будет служить для хранилище данных.Нужно создать папку с именем model и внутри создать класс который будет хранить переменние например String name,String surname и.т.д . необходимо чтобы этот класс был implemets на Serializable в этом классе нужно ovveride-ить Getter Setter EqualsAndHashCode Constructor defaultConstructor и в этом классе всё. потом нужно создать папку с именем util внутри создать класс с иминем SerializeUtil и объявлять следующее
public static final String USER-FILE-PATH = «И ЗДЕСТЬ ДАТЬ РЕЛАТИВ ПУТЬ В ЭТОМУ ФАЙЛУ ПРИМЕР -src\mailService\data\users»; И ПОД ЭТОМУ ПИШЕМ СЛЕДУЮЩИЙ ЧТОБЫ ПОТОМ ЗВАТЬ ЭТОТ МЕТОД ЧТОБЫ КИНУТЬ USER А В ФАЙЛ

public static void serializeUser(Map userMap) throws IOException

И ПОД ЭТОМУ КОДУ ПИШЕМ СЛЕДУЮЩИЙ КОТОРЫЙ БУДЕТ ПОКАЗАТЬ ВСЕХ USER ОВ В КОНСОЛЬ потом этот метод можно звать когда хотите увидеть всех user ов но извините я забыл логику который нужно было писать и звать этот метод

public static Map deserializeUser() throws IOException, ClassNotFoundException < ObjectInputStream objectInputStream = new ObjectInputStream( new FileInputStream(USER_FILE_PATH)); return (Map) objectInputStream.readObject(); > 

ТЕПЕРЬ СОЗДАЕМ ПАПКУ С ИМЕНЕМ storage И ВНУТРИ СОЗДАЕМ КЛАСС UserStorage И ВНУТРИ ПИШЕМ СЛЕДУЮЩИЙ КОД ЧТОБЫ КИНУТЬ USER А В ФАЙЛ

private Map users = new HashMap<>(); public void add(User user) < users.put(user.getEmail(), user); try < SerializeUtil.serializeUser(users); >catch (IOException e) < System.out.println(e); >> 

И В ГЛАВНЫЙ КЛАСС КОТОРЫЙ Я НАЗЫВАЛ TEST НУЖНО ЗВАТЬ ЭТИ МЕТОДЫ НАПРИМЕР ЭТОТ МЕТОД ДЛЯ РЕГИСТРАЦИИ

 `private static void register() < System.out.println("Please input name,surname,email,password"); String userDataStr = SCANNER.nextLine(); String[] userData = userDataStr.split(","); User user = new User(); user.setName(userData[0]); user.setSurname(userData[1]); user.setEmail(userData[2]); user.setPassword(userData[3]); USER_STORAGE.add(user); System.out.println("User was successfully added"); >>` 

И когда регистрировали все данные буду падать в файл

ну и скажите от куда у меня такой странный русский язык . я не русский ))))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *