Java не может получить доступ к файлу, потому что он используется другим процессом
У меня есть часть кода, которая контролирует каталог для добавления файлов. Всякий раз, когда в каталог добавляется новый файл, содержимое файла выбирается и публикуется на kafka, а затем файл удаляется.
Это работает, когда я делаю один запрос, но как только я подставляю свой код 5 или 10 пользовательским запросам из jMeter, содержимое публикуется на kafka успешно, но код не может удалить файл. Я получаю сообщение FileSystemException с сообщением, что The process cannot access the file because it is being used by another process. .
Я предполагаю, что есть проблема с concurrency, которую я не вижу. Пожалуйста, помогите!
3 ответа
У меня была аналогичная проблема, а также в следующем потоке: Многопоточность в очереди при попытке загрузить динамически созданные файлы в службу очереди, и для меня потребовалось 2 дня. Благодаря Holger, который дал ответ, как описано выше, в результате чего происходит блокировка, возможно, из-за того, что создание не было выполнено полностью при чтении другим потоком, оно значительно меня спасло времени.
Мое первоначальное решение, так как было найдено много из Интернета, было:
Я изменил его на:
И все работает отлично. Чтобы обработать «как-то» несколько запусков событий ENTRY_MODIFY (дублированные файлы загружены), я выполняю удаление в файле внутри метода uploadToQueue() после его загрузки.
Надеюсь, мой подход, основанный на вышеуказанном вкладе, также поможет другим с подобной проблемой.
Глядя на ваш код, кажется, когда один файл выбран потоком для публикации снова, другой поток собирает его для публикации. Вот почему никто не может его удалить. Это должно быть только concurrency. Вы должны перепроектировать код на основе критерия: шаги, которые могут выполняться одновременно, и те, которые не могут быть. Таким образом, шаги во всем процессе:
- возьмите файл (основной поток должен это сделать)
- опубликовать файл (вызвать другой поток, чтобы сделать это)
- удалить файл (так называемый поток должен удалить его)
- проверьте, присутствует ли какой-либо файл (опять же основной поток может это сделать)
Также, когда выбран файл, вы можете прочитать его в буфер, удалить его и продолжить с публикацией. Это позволит убедиться, что основной поток не присваивает этот файл другому потоку.
Перед удалением необходимо закрыть все соединения, которые обращаются к этому файлу.
Как принудительно удалить файл, для которого открыт поток чтения
Я пытаюсь удалить файл для которого открыт поток чтения, но получаю ошибку:
Как удалить файл, для которого открыт поток чтения (и возможности закрыть поток — нет)?
![]()
В общем случае, удалить заблокированный файл средствами Java вряд ли удастся (как с помощью стандартных средств, так и с помощью сторонних библиотек вроде Apache Commons IO).
В Вашем случае, можете попробовать явно вызвать GC:
Однако не стоит сильно полагаться на явный вызов GC, так как он не запускает GC, а просто дает рекомендацию JVM, чтобы она запустила сборщик мусора, а вот запустит ли она его сразу после вызова – далеко не факт.
![]()
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.9.7.43618
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
При запуске Android Studio, процесс не может получить доступ к файлу, так как этот файл занят другим процессом
Когда вы пытаетесь запустить Android Studio, вы можете столкнуться с проблемой, когда процесс не может получить доступ к файлу, так как он занят другим процессом. Эта проблема может возникать по разным причинам, но ее можно решить при помощи некоторых простых шагов.
Причины возникновения ошибки
Существует несколько причин, которые могут привести к ошибке «Процесс не может получить доступ к файлу, так как этот файл занят другим процессом» при запуске Android Studio. Рассмотрим некоторые из них:
1. Другой процесс использует файл, от которого зависит Android Studio.
2. Файл, от которого зависит Android Studio, поврежден или неисправен.
3. Наличие вирусов или других вредоносных программ, которые могут заблокировать доступ к файлам.
4. Недостаточно мощности компьютера для запуска Android Studio.
5. Несовместимость программного обеспечения.
Как решить проблему
1. Закрыть все приложения, которые могут использовать файл, от которого зависит Android Studio.
2. Исполнить команду «Ctrl+Alt+Del» на клавиатуре и перейти на вкладку «Диспетчер задач», нажать на процесс, который использует файл, от которого зависит Android Studio, и нажать кнопку «Завершение процесса».
3. Переименуйте файл, от которого зависит Android Studio, и попробуйте запустить программу снова.
4. Если файл поврежден или неисправен, попробуйте восстановить его из резервной копии.
5. Запустите антивирусную программу и проведите полное сканирование компьютера, чтобы убедиться, что на компьютере не установлены вредоносные программы.
6. Если вы предполагаете, что недостаточно мощности компьютера для запуска Android Studio, попробуйте закрыть все приложения, которые не нужны, чтобы освободить ресурсы компьютера.
7. Если проблема по-прежнему не устранена, попробуйте обновить Android Studio до последней версии или установить предыдущую версию, но большинство экспертов рекомендуют использовать последнюю версию программного обеспечения.
8. Убедитесь, что на вашем компьютере установлена последняя версия Java.
9. Если ничего из вышеперечисленного не помогает, попробуйте связаться с технической поддержкой Android Studio.
Ошибки при запуске Android Studio могут быть разными, но вышеописанные шаги помогут вам решить проблему с файлом, который занят другим процессом. Но помните, что прежде чем принимать любые решения, вы должны понимать, какая проблема скрыта за ошибкой, поэтому внимательность и осторожность – важные аспекты в решении любых проблем в программировании.
Java.nio.file.FileSystemException: процесс не может получить доступ к файлу, поскольку он используется другим процессом
Я пишу программу, которая копирует themselve при первом выполнении в определенную папку, работающую в linux или windows.
В linux он работает отлично, но когда я пытаюсь сделать то же самое на окнах, я получаю следующую ошибку:
java.nio.file.FileSystemException: процесс не может получить доступ к файлу, потому что он используется другим процессом (в sun.nio.fs.WindowsException)
Итак, другой процесс — это сама программа, что я должен использовать, чтобы пропустить эту ошибку?
Мои строки кода:
ОТВЕТЫ
Ответ 1
Ok, Я не нашел идеального решения, но что-то.
Эта копия правильно копирует файл и корректно удаляет оригинал только при выполнении linux.
Я думаю, что для этого мне нужно вызвать класс, используя загрузчик классов.