Hirdetés
- Szívós, szép és kitartó az új OnePlus óra
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Indiában Philips okostelefonokat is lehet majd választani
- Samsung Galaxy A56 - megbízható középszerűség
- Kis méret, nagy változás a Motorolánál
- Megérkezett a Google Pixel 7 és 7 Pro
- Kapható a strapamobil, aminek kikapcsolása nélkül lehet kicserélni az aksiját
- Bemutatkozott a Poco X7 és X7 Pro
- Külföldi prepaid SIM-ek itthon
- EarFun Air Pro 4+ – érdemi plusz
Új hozzászólás Aktív témák
-
válasz
#68216320
#10800
üzenetére
Az exe futtatása megoldható a
Runtime.getRuntime().exec(...)hívással. Visszakapsz egy processz-t, aminek a lefutásátwaitFor()-ral megvárod. Itt van rá egy kis példa program, ami már demonstrálja azt is, hogy hogyan lehet az exe outputját (stdout) megszerezni. (Alternatíva, hogy az exe egy fájlba írja az outputját, amit futás után normál módon fájlként felolvasol.)A parsolásra régebben még azt mondtam volna, hogy kell írni egy parsert, de manapság ez nem divat... Ha tényleg ennyire rögzített a szerkezet, akkor a sorban szereplő négy komponens (csoport, adatnév, értéknév, érték) előbányászható egy reguláris kifejezéssel is, pl. ezzel:
^([^.]+)\.([^.]+)\.([^.]+): *(.*?) *$Az outputot soronként célszerű feldolgozni, az elején vagy ki kell hagyni fix számú sort, vagy egyszerűen ki kell hagyni azokat, amire nem illeszkedik a regex:
Pattern pattern = Pattern.compile(<a fenti regex>);
while (<van sor>) {
Matcher m = pattern.matcher(<a sor tartalma>);
if (m.find()) {
String sensorGroup = m.group(1);
// ...
String sensorValue = m.group(4);
// DB mentés
}
}Alternatív szervezés: linux-ban oldod meg, amit lehet. A java program nem hajt végre exec-et, helyette a standard input-ot olvassa, és dolgozza fel. Hívni meg valahogy így:
>sensor.exe <opciók> | java -jar sensorprocessor.jarÉs az egészet lehet futtatni pl. cron-ból. (Hátránya, hogy a JVM indítás kissé erőforrásigényes, 30 másodpercenként meg pláne.)
Megjegyzések: (1) fejből írtam, a kódot tekintsük pszeudokódnak, (2) a regex pattern-ben a
\-eket duplikálni kell a Java string konstansban.Szerk: A korábbi válaszokat nem láttam, pár dolog így ismétlés, bocs.
-
A praxisomban ilyesmivel még nem találkoztam. Standard nyelvi eszközről nem tudok (legalábbis Java 8-ig bezárólag) - ettől persze még létezhet. A probléma viszont nyilván nem megoldhatatlan. Az első lehetőség a java fordító meghívása (lásd az előző hozzászólást), majd a gyártott osztály dinamikus betöltése (mint a JDBC driver-nél) és végrehajtása. Lásd pl. itt. Ennél a megoldásnál az a korlát, hogy a fordítási egység az osztály. A másik lehetőség, ami eszembe jut, a byte kód manipuláció (bytecode instrumentation), amivel lehet turkálni a már lefordított osztályok belsejében (új eljárásokat hozzáadni, meglévőeket kiegészíteni, stb.) Lásd pl. itt. Elképzelhető, hogy vannak ezekre alapozva kész megoldások is, bár én egy gyors kereséssel nem találtam ilyet.
Én nem vetném el teljesen a script nyelveket sem. (Bár nem tudom, hogy pontosan mi a feladat...
) A Groovy nagyjából felülről kompatibilis a Javával (azaz a Java forráskód érvényes Groovy forráskód is), legalábbis kb. a 7-es nyelvi szintig, bár a szemantikában vannak apróbb eltérések. A script nyelvek és a java kölcsönösen hívhatják egymást (azaz egy programon belül keverhetők). A script nyelvek mellett szól még, hogy tömörebbek (elhagyhatók a változó deklarációk, stb.), azaz pár soros kódokhoz alkalmasabbak. -
válasz
Szmeby
#10764
üzenetére
A finalize általában nem fog működni:
public class T {
static void p(String msg) { System.out.print(msg); }
public static void main(String[] args) {
p("started"); T t = new T(); t = null; p(" finished");
}
private T() { p(" constructed"); }
@Override protected void finalize() { p(" finalized"); }
}
(Kimenet: started constructed finished)Ha a teszt JVM-emen beszúrok egy GC-t, akkor javul a helyzet:
p("started"); T t = new T(); t = null; System.gc(); p(" finished");
(Kimenet: started constructed finished finalized)De azon túl, hogy egy normális programot nyilván nem lehet telehinteni GC hívásokkal, az egész viselkedés még a garbage collector implementációjától is függ, szóval a finalize egyáltalán nem megoldás a problémára.
-
Destruktor nincs. Finalizálás van, de az a garbage collector futásához kapcsolódik, és nincs garancia arra, hogy egy adott objektum esetén valaha is lefut - program exit-kor meg pláne, hiszen akkor majd az oprendszer úgyis takarít...
Nem teljesen értem, hogy minek az exit hook. Egy java programnak jól meghatározott exit pontjai vannak: pl. a
main()return pontja, vagy aSystem.exit()hívás, ezért ha kilépéskor akarsz menteni, akkor ezek elé kell elhelyezni a megfelelő kódot. Ha a program interaktív, akkor nyilván lesz valahol egy "exit" menüpont, vagy window close hook, ahová a mentés ugyancsak beköthető. Ha valamilyen egyéb keretrendszert használsz (pl. servlet engine), ami saját maga intézi a startup és shutdown tevékenységet, akkor ott lesznek specifikus exit hook-ok (pl. a servletnek vaninit()megdestroy()eljárása, vagy ott aServletContextListener).Mint arra fentebb már felhívták a figyelmet, ha a program abnormális módon terminál (kilövik az oprendszerből, vagy pl.
OutOfMemoryErrorkivétel keletkezik), akkor semmilyen exit hook nem fog működni. Ha erre is fel szeretnél készülni, akkor érdemesebb inkább minden alkalommal automatikusan menteni, ha az ini fájlban tárolt adatok változnak. (És ebben az esetben a kilépéskori mentés eleve felesleges is.) Persze nem tudom mi lenne itt az adatkör: az inicializációs fájl mint fogalom, néhány kilobájtnyi ritkán változó adatot sugall. -
válasz
Taoharcos
#10749
üzenetére
Ha van olyan oszlophalmaz, amiből lehet kulcsot képezni (azaz pl. lehet(ne) rájuk unique indexet definiálni az adatbázisban), akkor az ezen oszlopoknak megfelelő objektumváltozóból lehet összetett kulcsot (composite key) gyártani. (Pl. az
@EmbeddedIdannotációval.)Ha Oracle az adatbázis, akkor lehet próbálkozni azzal is, hogy a ROWID-et rámapeljük valamilyen dummy változóra:
@Id @Column(name="ROWID") String id;
(Magam sohasem próbáltam, de lekérdezésnél akár működhet is...
Persze a hordozhatóságnak ilyenkor annyi.)
Új hozzászólás Aktív témák
A topicot kiemeltem. Valaki nem akar egy nyitó hsz-t írni?:))
- Házimozi belépő szinten
- Vigneau interaktív lokálblogja
- Milyen monitort vegyek?
- Azonnali VGA-s kérdések órája
- Garancia kérdés, fogyasztóvédelem
- BMW topik
- CADA, Polymobil, és más építőkockák
- Szívós, szép és kitartó az új OnePlus óra
- Feltörték a regisztrációmat vagy elvesztettem a belépési emailcímet, 2FA-t
- sziku69: Szólánc.
- További aktív témák...
- Lenovo ThinkPad P1 Gen 4 i7 32GB RAM 512GB SSD NVIDIA T1200 16 2560 1600 Garancia
- Dell Precision 7550 i7 32GB RAM 512GB SSD NVIDIA Quadro T1000 FHD
- Dell Precision 5560 i7 32GB RAM 512GB SSD NVIDIA RTX A2000 FHD+
- BOMBA áron eladó új Microsoft Surface Laptop 4 garanciával! AMD Ryzen 5 /16GB /256 SSD/TOUCH/13.5"/
- Dell Latitude 7420 i7 / 32GB /1TB SSD / FHD IPS
- Bomba ár! Lenovo X1 Yoga 3rd - i5-8GEN I 8GB I 256GB SSD I 14" FHD Touch I W11 I CAM I Garancia!
- AKCIÓ! DELL PowerEdge R630 rack szerver - 2xE5-2660v4 (28c/56t, 2.0/3.2GHz), 96GB RAM, 4x1G, áfás
- BESZÁMÍTÁS! ASUS PRIME H510M i5 10400F 16GB DDR4 512GB SSD RX 6600 XT OC 8GB CHIEFTEC Libra 600W
- GYÖNYÖRŰ iPhone 14 Pro Max 128GB Black -1 ÉV GARANCIA - Kártyafüggetlen, MS3915, 100% Akkumulátor
- Törött, Hibás iPhone felvásárlás!!
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
) A Groovy nagyjából felülről kompatibilis a Javával (azaz a Java forráskód érvényes Groovy forráskód is), legalábbis kb. a 7-es nyelvi szintig, bár a szemantikában vannak apróbb eltérések. A script nyelvek és a java kölcsönösen hívhatják egymást (azaz egy programon belül keverhetők). A script nyelvek mellett szól még, hogy tömörebbek (elhagyhatók a változó deklarációk, stb.), azaz pár soros kódokhoz alkalmasabbak.


