#java
#java
Вопрос:
Я ищу код или библиотеку, которую я мог бы использовать для копирования файлов между серверами Windows с использованием Java. Представьте основной сервер, который запускает фоновый поток, так что всякий раз, когда транзакция завершается, он создает резервные копии файлов базы данных на резервном сервере. (Это обязательный протокол, поэтому нет необходимости обсуждать плюсы / минусы этого действия). Другими словами, транзакция завершается, выполняется Java-код, который копирует один каталог на резервный сервер.
Способ настройки компьютеров с Windows заключается в том, что на основном сервере C: диск резервного сервера отображается как его собственный Z: диск. На обеих машинах работает Windows 2003 или 2008 Server. Java 1.6.
Ответ №1:
Нашел правильный ответ на другом форуме и немного повозился с настройками. Проблема с копированием файлов с одного компьютера на другой в Windows (с использованием либо файла .bat, либо простого Java-кода) заключается в разрешениях пользователя. На основном сервере вы ДОЛЖНЫ настроить процесс Tomcat на запуск от имени администратора, используя имя пользователя и пароль этого администратора. (Щелкните правой кнопкой мыши на сервисе Tomcat, выберите вкладку «Войти», введите имя пользователя / пароль администратора). Пользователь по умолчанию, на котором запускается Tomcat (локальный пользователь), недостаточен для копирования файлов между сетевыми дисками в Windows. Когда я установил это правильно, как файловое решение .bat, которое я пробовал до этого поста, так и предложенное здесь простое Java-решение работали просто отлично.
Надеюсь, это поможет кому-то еще, и спасибо за предложения.
Комментарии:
1. Обратите внимание, что это не отвечает на конкретный вопрос, как указано в сообщении с вопросом. Это всего лишь решает неразрешимую проблему, которая заставила вас задать вопрос в том виде, в каком он есть сейчас (и о которой никто из нас не имел ни малейшего представления, пока вы публиковали исходный вопрос).
2. Когда у вас когда-либо возникала «конкретная проблема» в программировании? Для любой проблемы всегда существует множество переменных, некоторые из которых известны, некоторые неизвестны.
Ответ №2:
Получить файлы с помощью File#listFiles()
каталога с одного диска, выполнить итерацию по каждому из них, создать новый File
на другом диске, прочитать из FileInputStream
файла с одного диска и записать его в FileOutputStream
файл на другом диске.
В орехе:
for (File file : new File("C:/path/to/files").listFiles()) {
if (!file.isDirectory()) {
File destination = new File("Z:/path/to/files", file.&etName());
// Do the usual read InputStream, write OutputStream job here.
}
}
Смотрите также:
Кстати, если бы вы использовали Java 7, вы бы использовали Path#copyTo()
для этого.
Paths.&et("C:/path/to/files").copyTo(Paths.&et("Z:/path/to/files"));
Комментарии:
1. Вы уверены, что это будет работать на нескольких компьютерах с Windows? Кажется, я помню, как пробовал это, и это отлично работало между разными дисками на одном компьютере, но не на разных машинах. Хотя я не пробовал ваш точный код.
2. Java 7? Разве это не просто миф?
3. Вы сказали, что другой диск был сопоставлен. Это полностью прозрачно для Java. Любые потенциальные проблемы могут быть связаны с платформой, например, разрешения на чтение / запись и так далее.
4. Это сопоставлено. Я думаю, что здесь задействованы некоторые элементы разрешений, хотя это зависит от имени пользователя, запускающего процесс Java. Я надеюсь обойти эту проблему.
5. Согласен с BalusC. Пока у вас есть права доступа к отображаемому диску, вы должны просто иметь возможность использовать классы ввода-вывода для записи файлов туда. Однако, если вы абсолютно не могли этого сделать… Я предположил, что вы могли бы запустить свой Java-код из файла .bat, который выполнял бы копирование файла. Но использование классов ввода-вывода, вероятно, было бы чище.
Ответ №3:
Я бы действительно рекомендовал использовать для этого Apache Commons IO.
FileUtils
Класс предоставляет методы для перебора каталогов и копирования файлов из одного каталога в другой. Вам не нужно беспокоиться о чтении и записи файлов самостоятельно, потому что библиотека все делает за вас.