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.