LINUX.ORG.RU
ФорумTalks

А в чём профит Java

 


1

4

САБЖ, никогда не писал на жабке, был уверен что оно везде более-менее одинаковое и не прибито к платформе, имеем честно взятый отсюда код https://stackoverflow.com/questions/21406401/java-7-watchservice-entry-modify...

import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Main
{
    public static void main(String[] args) throws Exception
    {
        FileSystem fs = FileSystems.getDefault();
        WatchService ws = fs.newWatchService();
        Path pTemp = Paths.get("/home/user/Документы/tmptest");
        pTemp.register(ws, new WatchEvent.Kind[] {ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE}, FILE_TREE);
        while(true)
        {
            WatchKey k = ws.take();
            for (WatchEvent<?> e : k.pollEvents())
            {
                Object c = e.context();
                System.out.printf("%s %d %s\n", e.kind(), e.count(), c);
            }
            k.reset();
        }
    }
}
в онтопике крашится в рантайме с невнятным сообщением о том что Modifier not supported как я понимаю это ему от FILE_TREE так плохо. А какой тогда смысл в Java, когда надо под каждую ОС свою прослойку делать ручками поверх inotify/fsevents/FindFirstChangeNotification/FindNextChangeNotification/ReadDirectoryChangesW

Понятно что можно и рекурсивный обход поддиректорий ручками прикрутить (тут не стал прикручивать, чисто найти виновника)

import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Main
{
    public static void main(String[] args) throws Exception
    {
        FileSystem fs = FileSystems.getDefault();
        WatchService ws = fs.newWatchService();
        Path pTemp = Paths.get("/home/user/Документы/tmptest");
        pTemp.register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
        while(true)
        {
            WatchKey k = ws.take();
            for (WatchEvent<?> e : k.pollEvents())
            {
                Object c = e.context();
                System.out.printf("%s %d %s\n", e.kind(), e.count(), c);
            }
            k.reset();
        }
    }
}

Или это между версиями её так ломают или челики на ней писать не умеют совсем?

ЗЫ

Вообще может кто-то подскажет как изменения файлов на максимальном числе платформ удобнее всего мониторить? Может что-то готовое есть? Хочется Windows, OSX, Android, Linux, BSD. Ну и всё остальное экзотическое если есть возможность. Конечно можно на C#, но там в Android с производительностью не очень хорошо и жором батарейки как следствие.

★★★★★

Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от FishHook

А какая разница то? Или там как с питоном 2/3 принято ломать обратную совместимость между версиями которые отличаются цифрой? Вон на шарпе код который работал в 2011 году внезапно работает и в 2025

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от peregrine

ну хорошо, идем почитаем. Ой, что это


It's not very well documented, but changes to a file's metadata such as last accessed time will trigger a ENTRY_MODIFY event. My guess is your operating system and file system are changing the last accessed time when the editor opens the file. This would cause the watch service to return with ENTRY_MODIFY even though the editor doesn't change the contents of the file.

The OS and FS behavior can vary widely. For example, some file systems like NTFS have access times disabled by default. Other filesystems like EXT4 can have them disabled as an option (mounting with -noatime). This is done for performance reasons, especially historically with HDDs because modifying metadata would incur an expensive disk seek. For Windows/NTFS, even if accessed times are enabled, there's a separate registry setting that determines the delay with atimes are updated, which I assume is also for performance reasons - it's faster to update atime once every hour instead of every time the file is actually accessed.

To get more watch events, you need to do both of the following:

wrap your polling and events loop in a while (true) loop or similar to keep re-polling for new changes
after handling the WatchEvents, call key.reset()
If you don't call key.reset(), then the poll (and related methods like take) will not return with that key again. Not sure why Java has this behavior, maybe it's a way to "unsubscribe" from watch events of that type.

So here are the minimal changes:

while (true) { // FIRST CHANGE: keep polling for more events
    key = watcher.poll(MAX_WAIT_TIME, TimeUnit.SECONDS);
    if (key != null) {
        for (WatchEvent<?> events : key.pollEvents()) {
            WatchEvent<Path> ev = cast(events);
            Path fileName = ev.context();
        }
        key.reset() // SECOND CHANGE: reset key so service will return it again
    }
}

и нафига такие гнилые вбросы?

FishHook
()

Так ты жабадок на этот классик почитай просто. Очевидно, что дело не в жабе а винде.

Defines extended watch event modifiers supported on some platforms by Sun's provider implementation.

ya-betmen ★★★★★
()
Ответ на: комментарий от peregrine

А какая разница то?

да большая разница, кто чего, а кто дразнится. Ты видимо долго рыл интернет в надежде найти, где у джавы ломается кроссплатформенность, что докопался аж до топиков 11-ти летней выдержки. Тебя, конечно, можно похвалить за настойчивость, но… чувак, неужели так сильно чешется?

FishHook
()
Ответ на: комментарий от ya-betmen

Т.е. есть жаба для винды и подмножество для всего остального. Понял принял. Смысла в ней тогда не больше чем в C#. Он тоже есть для винды (удобный и полнофункциональный) и всего остального (обрубок у которого части фич нет).

peregrine ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Так ты не используй ту часть которая ос-специфичная, на них обычно это явно написано, часто даже в названии.

Желающим отстрелить себе жопу жаба этого запретить не может.

ya-betmen ★★★★★
()
Ответ на: комментарий от FishHook

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

peregrine ★★★★★
() автор топика
Ответ на: комментарий от FishHook

Тебе перевести или сам сможешь? Если что тут не про то что FILE_TREE очень специфичен как оказывается, а про то что ENTRY_MODIFY гадит информацией которая не всегда полезна или не несёт смысла или наоборот не даёт некоторую информацию.

peregrine ★★★★★
() автор топика
Ответ на: комментарий от peregrine

меня немного расстроила смерть Syncthing под андрюшку,

под адрюшку, ага, а кросспалтформенность здесь при том, что

FishHook
()
Ответ на: комментарий от ya-betmen

А при том что Syncthing внезапно умеет работать и в винде. Вот мне надо папку синхронизировать без гугл/яндекс/вставь свой зонд дисков между виндой, линуксом и андроидом, Syncthing раньше так умел, теперь только форк от мутного васяна остался.

peregrine ★★★★★
() автор топика
Ответ на: комментарий от FishHook

Воспользуйся гугл транслейтом, бро, пока его не забанили. Ну или у чат гопоты спроси перевод. Вообще не надо так агрессивно. Я не вбрасываю, просто удивился очень. ya-betmen вон сразу правильно написал

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

вопрос

In the above code, watcher.poll waits for MAX_WAIT_TIME for an ENTRY_MODIFY event. However, when I open a file within the directory being watched, and close without changing its contents… the watcher.poll receives an event and stops waiting. Is there some parameter that needs to be set and I am missing?

ответ

If you save the file before closing, the OS will see the file as modified even if there is no change to it and these will trigger the ENTRY_MODIFY event. Also your code is taking only one watch key. If you want continue watching the directory you need to put your watcher.poll instruction into a loop.

при чем тут нафиг твои домыслы?

Если что тут не про то что FILE_TREE очень специфичен как оказывается, а про то что ENTRY_MODIFY гадит информацией которая не всегда полезна или не несёт смысла или наоборот не даёт некоторую информацию.

FishHook
()
Ответ на: комментарий от peregrine

Так а чего сам не воспользовался для поиска какой-нибудь либки где за тебя уже сделали платформенные обертки и выставили обобщенный интерфейс?

cobold ★★★★★
()
Ответ на: комментарий от peregrine

Syncthing раньше так умел

Погоди, ты вкинул код, который будет работать в нормальных ос, и не будет в винде. Но тогда же автор должен был дропнуть поддержку винды, а не андроида.

ya-betmen ★★★★★
()
Ответ на: комментарий от FishHook

Блин а ты правда поспи и с трезвой головы перечитай. Давай переведу за тебя, может поможет, если у тебя нейронка с ума сошла и не может перевести.

В коде сверху watcher.poll ждёт MAX_WAIT_TIME для события ENTRY_MODIFY. Несмотря на это когда я открываю файл в директории которая просматривается и закрываю его без изменения контента watcher.poll получает событие и перестаёт ожидать. Есть ли некоторый параметр который нужно установить или я что-то упускаю?

ответ

Если вы сохранили файл перед закрытием, то ОС увидит что файл модифицирован даже если не было никаких изменений и нагадит событием ENTRY_MODIFY. Такжек ваш код принимает ктольо один ключ наблюдения. Если вы хотите продолжить наблюдение за директорией вам надо засунуть watcher.poll в цикл

Знаешь как это обобщить? У челика эвенты лишние гадятся и он думает как от них избавиться. Вторая часть про недостаток информации раскрывается тут

The OS and FS behavior can vary widely. For example, some file systems like NTFS have access times disabled by default. Other filesystems like EXT4 can have them disabled as an option (mounting with -noatime). This is done for performance reasons, especially historically with HDDs because modifying metadata would incur an expensive disk seek. For Windows/NTFS, even if accessed times are enabled, there's a separate registry setting that determines the delay with atimes are updated, which I assume is also for performance reasons - it's faster to update atime once every hour instead of every time the file is actually accessed.

тоже надо переводить или сам сможешь? Мне лениво если честно печатать

peregrine ★★★★★
() автор топика
Ответ на: комментарий от cobold

Вот я и ищу либку. А с ними всё печально как-то. Если знаешь такую, то назови пожалуйста.

ЗЫ

Хочется ловить не только изменение содержимого файла, но и прав в том числе расширенных, xattr(unix)/EA(windows), время последнего доступа и так далее. xattr и ea я готов хоть в тектовом файле хранить отдельном, хоть в БД, если ФС их не поддерживает и при синхронизации на ФС которая их поддерживает их оттуда назад писать.

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

Если ты про Syncthing, то он вообще на сишке написан и к джаве отношения не имеет. Меня удивило что для софтины которая должна по дизайну работать на разных платформах взяли не жабку, а сишку.

peregrine ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Жабу нельзя зарегать службой в винде. Еще один трололо, который не умеет выбирать инструмент по задаче. День наверное такой.

Lordwind ★★★★★
()
Ответ на: комментарий от peregrine

Он есть на уровне win32 api, не знаю как в жабке. Причем не такой всратый как в linux из-за того что из коробки умеет мониторить поддиректории не нужно заморачиваться с тем чтобы оббежать все поддиректории текущей директории и добавить watch на каждую из них

cobold ★★★★★
()
Ответ на: комментарий от peregrine

Не понимаю как ты не понимаешь. Работа с файлами, это то о чём syncthing, это тесно связанная с системой вещь. А на чем ещё писать системные вещи как не на сишке? Это же не крудошлепить

cobold ★★★★★
()
Ответ на: комментарий от peregrine

Обычно это значит, что автор лучше знает сишку.

ya-betmen ★★★★★
()
Ответ на: комментарий от peregrine

Т.е. в винде файл вотчера вообще нет?

В самой винде он есть достаточно давно, во всяком случае в NT4 уже точно был, я в своей софтине это пользовал.

anc ★★★★★
()
Ответ на: комментарий от peregrine

А что тут удивительного? Сишка же задумывалась как кроссплатформенный ассемблер. Это у джавы ломают совместимость, а сишку можно и современным компилятором собрать программу написанную с использованием старого стандарта, например того же c89

vbcnthfkmnth123 ★★★★★
()

Предположение, что в системе вообще есть ФС - очень ограничивающее. Для питона (который как браузер, для трёх платформ есть - и сойдёт) или другой скриптухи сойдёт.

seiken ★★★★★
()

А какой тогда смысл в Java, когда надо под каждую ОС свою прослойку делать ручками

Java - write once, debug everywhere.

rupert ★★★★★
()
(ns fswatch
  (:require [babashka.pods :as pods]))

(pods/load-pod 'org.babashka/fswatcher "0.0.5")
(require '[pod.babashka.fswatcher :as fw])

(def watcher (fw/watch "." (fn [event] (prn event))))

@(promise)
$ bb fswatch.clj

Сохраняем ещё раз файл с исходником, видим в терминале

{:type :write, :path "./fswatch.clj"}

А в чём профит Java

В том, что на ней написана бабашка.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от peregrine

Если ты про Syncthing, то он вообще на сишке написан

У меня какой-то другой Syncthing?

Languages
Go 82.6%

MagicMirror ★★
()

Профит джавы в большей оплате труда в среднем по рынку, чем у того же Шарпа.

aiqu6Ait ★★★★
()

А в чём профит Java

  • IDE более-менее

  • ООП есть и статическая типизация

  • либы кое-какие есть

  • сборка мусора из коробки

  • плюс даже дегенерату нужно очень сильно постараться, чтобы написать вырвиглазной код, в отличии от крестов и сей

  • под линукс более-менее заточена

Покажи мне другой ЯП, который хотя бы это умеет? Поэтому и выбираем меньшее из зол.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 2)

А в чём профит Java

За код деньги платят много где.

kaldeon
()
Ответ на: комментарий от peregrine

Если ты про Syncthing, то он вообще на сишке написан

На go он написан.

bdrbt
()
Ответ на: комментарий от foror

IDE более-менее

За всю дорогу более-менее получилось написать только у jetbrains

ООП есть и статическая типизация

Таких языков как говна за баней

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

Когда дегенераты стараются, как раз получается отвратительный читабельный код, вырвиглазное write-only говно пишут люди с головой.

под линукс более-менее заточена

Можно сказать про любой язык.

bdrbt
()

Вообще может кто-то подскажет как изменения файлов на максимальном числе платформ удобнее всего мониторить?

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

вся верхняя логика вообще не понимала на какой оси работает.

alysnix ★★★
()
Ответ на: комментарий от peregrine

Т.е. в винде файл вотчера вообще нет?

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

самый косорукий вотчер в osx. а виндовый и линуховый довольно похожи.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

а виндовый и линуховый довольно похожи.

Разве? Вроде долгое время жопоболью в винде было именно отсутствие аналога inode notify, и самый частый костыль вместо него - периодическое сканирование содержимого иноды. Вроде ещё с селектом тоже косяки какие-то были.

bdrbt
()
Ответ на: комментарий от alysnix

кажется это использовал. могу уточнить детали, но пока смысла нет.

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

bdrbt
()
Ответ на: комментарий от Lordwind

А почему собственно?
Сервис-контроллеру ведь всё равно что запускать
(java.exe -jar srv.jar)
А дальше взаимодействие с сервис-контроллером через JNI.

MirandaUser2
()

Помнишь, был такой слоган «Написанное однажды, работает везде»? Это касалось java во времена Sun.

Вот тогда я и имел опыт написания программ на этом ЯП.

С тех пор ни-ни и, оглядываясь назад, я жалею о потраченном времени. Лучше бы изучал Си++.

sparkie ★★★★★
()
Ответ на: комментарий от bdrbt

Посмотри ещё раз, я не про каждый пунк по отдельности, а про сумму пунктов в целом. Иначе бы не занимался клоунадой, а назвал ЯП.

foror ★★★★★
()

import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE;

Modifier not supported

com.sun — это нестандартный пакет

static_lab ★★★★★
()
Ответ на: комментарий от foror

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

это точно неправда, кодинг на джава как раз известен нагромождением абстракций ради абстракций

next_time ★★★★★
()
Ответ на: комментарий от next_time

динг на джава как раз известен нагромождением абстракций ради абстракций

Ну так-то если по-чесноку, это время сильно давно прошло.

bdrbt
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)