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)

Жаба 7, свежак подъехал. Ты б ещё по j2me маны нашёл и спросил почему в ведроиде не запускаются.

В восьмой жаба тонна изменений была, а потом в 10 куча depreciation

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

Я могу назвать такие ЯП.

C# (в линуксах оно работает если не привязываться к оффтопику), Kotlin, Python, Lua, D (правда оно никому не нужно почему-то, хотя все перечисленные фичи есть как и замашка на «серьёзность», видимо серьёзной корпорации за ним не хватает чтоб пиарила и проталкивала его из каждого утюга, то что там какой-то Digital Mars вроде как есть и D Language Foundation это так, полтора калеки, у того же Digital Mars-а какие-то перспективы были в 1988 году, а в 1990 оно уже ни о чем было, turbo C++ от Borland-а их рынок кушать начало, правда к 2005 году уже и Borland стал бесперспективной компанией и его скушали в 2007 британцы со своим микрофокусом, который был известен своим компилятором кобола, в свою очередь к 2018 году стало совершенно понятно что и микрофокус никому не нужен и его в 2022 году тоже скушали американцы из opentext-а который в свою очередь не имеет никаких известных продуктов и ИМХО будет кем-то поглощён в начале 2030-ых годов)

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

C#

Либы платные и заточены под офтопик. Синтаксис переусложнён не по делу. Фичи ради фич. Ну, а в нём вотчер по дереву из коробки заведётся под все платформы?

Kotlin

Закапывайте стюардесу, оно ещё живо из-за андроида, но не более.

Python, Lua, D

Цирк уехал, клоуны остались…

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

в линуксах оно работает если не привязываться к оффтопику

И в оп ты вкинул ос специфичный код. Хмм.

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

как изменения файлов на максимальном числе платформ

Опа, а ты попал. У каждой системы свой вариант. Пиши базовый в виде «обойти все файлы и сравнить данные», а потом подключай по одному варианту для каждой операционки, типа inotify, fswatch…

Это не в кроссплатформенности дело, это тупо у всех свои реализации

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

Ну, а в нём вотчер по дереву из коробки заведётся под все платформы?

завёлся на удивление

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

Уж лучше обёртку напишу на сишке и закину на гитхаб, чтоб у мелкомягких и огрызка жопка сгорела

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

так проблема как раз в inotify, он не может нормально подписываться на изменения в папке рекурсивно с другими папками внутри, и вроде бы засирает open_files, когда пытаешься уследить за чем-то большим.

fswatch это делает без костылей. А вот что в винде - не знаю.

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

У нас так-то есть ещё и fanotify который эту проблему решил как-то. Правда надо смотреть как, может они свой модуль ядра слепили? Или оно из коробки идёт?

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

Говорят вот такое:

Inotify is slow, inefficient and error-prone for recursively watching file systems. fanotify is not an alternative because it cannot monitor file deletion or renames and it requires root permission

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