Title: Ερώτηση σε JAVA
Post by: portinos on September 10, 2013, 13:51:58 pm
Hi!!!! Έχω φτιάξει ένα πρόγραμμα σε JAVA και σε κάποιο σημείο αυτό το πρόγραμμα ανοίγει ένα άλλο πρόγραμμα .exe. Στη συνέχεια θέλω να δουλεύω σε εκείνο το πρόγραμμα και μετά αυτό που φτιάχνω στο πρόγραμμα θέλω να ανοίγει στη JAVA αυτόματα. Μπορώ να το φτιάξω έτσι ώστε να αποθηκέυω το αρχείο και μετά να το καλώ από το πρόγραμμα της JAVA, αλλά γίνεται να γίνει κάπως πιο εύκολα; Αυτό που εννοώ είναι αν μπορώ να ορίσω μέσα από το JAVA πρόγραμμα που θα αποθηκεύεται και πως θα ονομάζεται το αρχείο του άλλου προγράμματος. Θέλω να γίνει με αυτό τον τρόπο γιατί θα το ξαναχρησιμοποιήσω μέσα στο JAVA πρόγραμμα. Λίγο μπέρδεμα εεε;;;
Ευχαριστώ!!!!
Title: Re: Ερώτηση σε JAVA
Post by: antares on September 10, 2013, 14:04:29 pm
Μια λύση είναι να χρησιμοποιήσεις τις εισόδους/εξόδους (stdin/stdout) μεταξύ των processes (java <-> exe) και να στέλνεις εντολές μεταξύ τους. Αυτό θα χρειαστεί να έχεις ξεχωριστά threads (και στο java process αλλά και στο exe process) για να ακούς την είσοδο για εντολές.
Για να ξεκινήσεις δες εδω http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html
Title: Re: Ερώτηση σε JAVA
Post by: portinos on September 10, 2013, 15:09:43 pm
Ευχαριστώ, αλλά μάλλον περισσότερο μπερδεύτηκα. Μπορείς να μου το κάνεις λίγο πιο συγκεκριμένο; Να σου πω για παράδειγμα εγώ έχω γραμμένο αυτό τον κώδικα και ανοίγω το PLCEdit public static void main(String[] args) { System.out.println("Hello, World"); try { System.out.println("Opening PLCEdit"); Runtime runTime = Runtime.getRuntime(); Process process = runTime.exec("C:\\Program Files\\PLCEdit\\PLCEdit.exe"); } catch (IOException e) { e.printStackTrace(); } }
Πως μπορώ τώρα να ανομάσω και να αποθηκεύση το αρχείο απο το PLCEdit μέσα από τη JAVA;
Title: Re: Ερώτηση σε JAVA
Post by: antares on September 10, 2013, 15:27:17 pm
Υπέθεσα ότι έχεις τον κώδικα από το exe :D Αν τον έχεις το βλέπουμε πως γίνεται. Αλλιώς, έχεις τις εξής 2 επιλογές νομίζω: - Δες αν υπάρχει κάποια command line παράμετρος που να σε βοηθάει.
- Μπορείς απο το java process κανεις monitoring για αλλαγες κάποιο directory και να λαμβάνεις events. Οπότε ορίζεις ενα συγκεκριμενο directory που αποθηκευεις τα αρχεια και τα επεξεργάζεσαι μετα από την java. Δες εδώ:
http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html http://java.dzone.com/articles/using-java-7s-watchservice
Title: Re: Ερώτηση σε JAVA
Post by: portinos on September 17, 2013, 17:37:24 pm
Ευχαριστώ τον antares για τη βοήθειά του, ήταν πολύ χρήσιμη. Για να μην ανοίξω νέο topic θα κάνω ακόμα μια ερώτηση. Έχω τον παρακάτω κώδικα package test;
import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardWatchEventKinds; import java.nio.file.WatchEvent; import java.nio.file.WatchKey; import java.nio.file.WatchService; import java.util.List;
public class test3 { public static void main(String[] args) { System.out.println("Hello, World"); new File("C:\\Users\\V\\Documents\\diplwmatiki\\temp").mkdir(); System.out.println("To proswrino arxeio dimiourgithike"); try { System.out.println("Opening notepad"); Runtime runTime = Runtime.getRuntime(); Process process = runTime.exec("C:\\Windows\\System32\\notepad.exe"); } catch (IOException e) { e.printStackTrace(); } //define a folder root Path myDir = Paths.get("C:\\Users\\V\\Documents\\diplwmatiki\\temp");
try { WatchService watcher = myDir.getFileSystem().newWatchService(); myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents(); for (WatchEvent event : events) { if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { System.out.println("Created: " + event.context().toString()); } if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { System.out.println("Modify: " + event.context().toString()); } } } catch (Exception e) { e.printStackTrace(); } } }
Αυτός ο κώδικα ανοίγει το σημειωματάριο και εκεί αφού γράψουμε κάτι αποθηκεύουμε στο dokimi.txt μέσα στο φάκελο temp. Η ερώτηση είναι πως μπορούμε να κλείσουμε χρησιμοποιώντας τη JAVA το αρχείο dokimi.txt; Δοκίμασα να κάνω process.destroy(); αλλά μου βγάζει σφάλμα. Έχει κανείς καμιά ιδέα;;; Ευχαριστώ εκ των προτέρων
Title: Re: Ερώτηση σε JAVA
Post by: antares on September 17, 2013, 20:55:41 pm
Τι λάθος σου βγάζει?
Title: Re: Ερώτηση σε JAVA
Post by: portinos on September 18, 2013, 00:49:26 am
Όταν βάζω σκέτο process.destroy(); μου βγάζει process cannot be resolved ενώ όταν βάλω Process process.destroy(); μου βγάζει: Multiple markers at this line: -Syntax error on token ".",; expected -The method destroy() is undefined for the type test3
Το destroy το βάζω αμέσως μετά το for loop
Title: Re: Ερώτηση σε JAVA
Post by: Δικαστής Μύρτιλος on September 18, 2013, 01:21:24 am
Το process το έχεις ορίσει μέσα στο try άρα είναι ορισμένο μόνο για εκεί. Δοκίμασε να το ορίσεις απ'έξω.
Title: Re: Ερώτηση σε JAVA
Post by: portinos on September 18, 2013, 10:01:53 am
Το process το έχεις ορίσει μέσα στο try άρα είναι ορισμένο μόνο για εκεί. Δοκίμασε να το ορίσεις απ'έξω.
Ναι λειτουργεί έτσι. Σ' ευχαριστώ!
Title: Re: Ερώτηση σε JAVA
Post by: antares on September 18, 2013, 10:03:14 am
Έχεις συντακτικό θέμα νομίζω σχετικά με το που καλείς το process.destroy(); Κάπως έτσι προσπαθησε να βάλεις τον κωδικά σου: package test;
import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardWatchEventKinds; import java.nio.file.WatchEvent; import java.nio.file.WatchKey; import java.nio.file.WatchService; import java.util.List;
public class test3 { public static void main(String[] args) { System.out.println("Hello, World"); Process process = null; new File("C:\\Users\\V\\Documents\\diplwmatiki\\temp").mkdir(); System.out.println("To proswrino arxeio dimiourgithike"); try { System.out.println("Opening notepad"); Runtime runTime = Runtime.getRuntime(); process = runTime.exec("C:\\Windows\\System32\\notepad.exe"); } catch (IOException e) { e.printStackTrace(); } //define a folder root Path myDir = Paths.get("C:\\Users\\V\\Documents\\diplwmatiki\\temp");
try { WatchService watcher = myDir.getFileSystem().newWatchService(); myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents(); for (WatchEvent event : events) { if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { System.out.println("Created: " + event.context().toString()); } if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { System.out.println("Modify: " + event.context().toString()); } } if (process != null) { process.destroy(); }
} catch (Exception e) { e.printStackTrace(); } } }
Title: Re: Ερώτηση σε JAVA
Post by: portinos on September 20, 2013, 22:14:10 pm
Ακόμη μία ερώτηση, μάλλον τα έχω παίξει ^seestars^ ^seestars^ Έχω τον παρακάτω κώδικα για να ανοίγω ένα xml αρχείο σε JAVA try { File fXmlFile = new File("test.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); } catch (Exception e) { e.printStackTrace(); }] το οποίο δίνει σαν αποτέλεσμα μια λογική έκφραση: a&&b. Τα a,b είναι δύο αρχεία xml και αυτά. Η ερώτηση είναι γίνεται να φτιάξουμε ένα καινούργιο αρχείο xml χρησιμοποιώντας τα αρχεία a και b, τα οποία διαβάζουμε επίσης, αλλά να μην τα κάνουμε απλά merge, αλλά να έχουμε τη λογική πράξη AND;
Title: Re: Ερώτηση σε JAVA
Post by: antares on September 21, 2013, 15:43:10 pm
Πολύ ασαφής η ερώτηση σου... για να απαντηθεί.
Τι σημαίνει να κάνεις AND μεταξύ 2 xml αρχείων; Αν έχει να κάνει με την δομή των αρχείων αυτών ίσως θα έπρεπε να μας δείξεις και την δομή τους για να έχει νόημα και ο κώδικας που δείχνεις (αλλά μετά πάμε σε επίλυση προβλήματος σε λογικό επίπεδο και όχι απλά "έχω θέμα με την Java").
Title: Re: Ερώτηση σε JAVA
Post by: portinos on September 30, 2013, 17:21:10 pm
Πολύ ασαφής η ερώτηση σου... για να απαντηθεί.
Τι σημαίνει να κάνεις AND μεταξύ 2 xml αρχείων; Αν έχει να κάνει με την δομή των αρχείων αυτών ίσως θα έπρεπε να μας δείξεις και την δομή τους για να έχει νόημα και ο κώδικας που δείχνεις (αλλά μετά πάμε σε επίλυση προβλήματος σε λογικό επίπεδο και όχι απλά "έχω θέμα με την Java").
Ναι το πρόβλημα που είχα ήταν σε λογικό επίπεδο, δεν είχε σχέση με τη java. Τώρα έχω και μια άλλη ερώτηση. Έχω τον παρακάτω κώδικα try { //Reading an XML file, created above File fXmlFile = new File("C:\\Users\\V\\Documents\\diplwmatiki\\temp\\dokimi.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); //optional, but recommended //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work doc.getDocumentElement().normalize(); //Printing the attributes of the XML file System.out.println("\nRoot element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("file"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("File id : " + eElement.getAttribute("id")); System.out.println("File_name : " + eElement.getElementsByTagName("name").item(0).getTextContent()); System.out.println("Katali3i : " + eElement.getElementsByTagName("katali3i").item(0).getTextContent()); } try{ Element eElement = (Element) nNode; ArrayList<String> File_name = new ArrayList<String>(); File_name.add(eElement.getElementsByTagName("name").item(0).getTextContent()); System.out.println(File_name); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } //Creating an list having all files of a directory File folder = new File("C:\\Users\\V\\Documents\\diplwmatiki\\SFBs"); ArrayList<File> files = new ArrayList<File>(Arrays.asList(folder.listFiles())); for (int i = 0; i < folder.length(); i++) { System.out.println("\n" +files); } files.retainAll(File_name);
και δεν λειτουργεί η τελευταία εντολή. Ξέρω ότι το πρόβλημα είναι ότι συγκρίνω διαφορετικούς τύπους arraylist. Ο ένας τύπος είναι string και ο δεύτερος είναι file. Πώς μπορούμε να το κάνουμε έτσι ώστε να γίνει η σύγκριση, δηλαδή εννοώ ότι θέλω από τα στοιχεία που είναι στη λίστα με τα string να βρίσκω τα αρχεία που έχουν το ίδιο όνομα και να τα βάζω σε μια άλλη λίστα
Title: Re: Ερώτηση σε JAVA
Post by: antares on September 30, 2013, 19:01:11 pm
Ναι έχεις πολλές επιλογές για να το επιτυχείς, κάποιες μπορεί να είναι π.χ.:
1. Χρησιμοποιείς την http://docs.oracle.com/javase/7/docs/api/java/io/File.html#list() για να σου γυρίσει String array και να αφήσεις τον υπόλοιπον κώδικα ως έχει.
2. Αν θέλεις File array χρησιμοποιείς την http://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles(java.io.FilenameFilter) και υλοποιείς το φίλτρο.
3. Κάνεις το φίλτρο "με το χέρι", δηλ. loop στα files και κοιτάς κάθε όνομα αν το κρατάς ή οχι, παρόμοιο με το 2 δηλ.
Title: Re: Ερώτηση σε JAVA
Post by: portinos on September 30, 2013, 20:57:39 pm
Οκ ευχαριστώ πολύ!!! Κάτι τέτοιο ήθελα. Σόρρυ και για τις συνεχείς ερωτήσεις αλλά δεν έχω και μεγάλη εμπειρία με την java
Title: Re: Ερώτηση σε JAVA
Post by: portinos on October 11, 2013, 00:23:50 am
Και άλλη ερώτηση!!!! :D :D package test;
import java.io.IOException;
public class test7 { public static void main(String[] args){ Runtime rt=Runtime.getRuntime(); String file="C:\\Users\\V\\Documents\\diplwmatiki\\SFBs\\SF_Antivalent.xml"; Process p=rt("C:\\Windows\\System32\\java.exe", "-jar", "C:\\Users\\" + "V\\Documents\\uppaal-4.0.13-aca\\uppaal-4.0.13\\uppaal.jar" + file); } }
Αυτό που θέλω να κάνω εδώ είναι να ανοίξω το αρχείο στο uppaal, αλλά μου βγάζει το σφάλμα: the method rt(String, String, String) is undefined for the type test. Τι μπορώ να κάνω γι' αυτό;
Title: Re: Ερώτηση σε JAVA
Post by: plagakis on October 11, 2013, 01:15:55 am
Και άλλη ερώτηση!!!! :D :D package test;
import java.io.IOException;
public class test7 { public static void main(String[] args){ Runtime rt=Runtime.getRuntime(); String file="C:\\Users\\V\\Documents\\diplwmatiki\\SFBs\\SF_Antivalent.xml"; Process p=rt("C:\\Windows\\System32\\java.exe", "-jar", "C:\\Users\\" + "V\\Documents\\uppaal-4.0.13-aca\\uppaal-4.0.13\\uppaal.jar" + file); } }
Αυτό που θέλω να κάνω εδώ είναι να ανοίξω το αρχείο στο uppaal, αλλά μου βγάζει το σφάλμα: the method rt(String, String, String) is undefined for the type test. Τι μπορώ να κάνω γι' αυτό; Σου βγάζει σφάλμα γιατί πας να χρησιμοποιήσεις τη μεταβλητή τύπου Runtime rt σαν συνάρτηση. Υποθέτω από το Process που θέλεις να επιστρέφει η p=rt(...) ότι μάλλον ήθελες να γράψεις p=rt. exec(....).
Title: Re: Ερώτηση σε JAVA
Post by: DoomGuard on October 11, 2013, 01:18:35 am
Και άλλη ερώτηση!!!! :D :D package test;
import java.io.IOException;
public class test7 { public static void main(String[] args){ Runtime rt=Runtime.getRuntime(); String file="C:\\Users\\V\\Documents\\diplwmatiki\\SFBs\\SF_Antivalent.xml"; Process p=rt("C:\\Windows\\System32\\java.exe", "-jar", "C:\\Users\\" + "V\\Documents\\uppaal-4.0.13-aca\\uppaal-4.0.13\\uppaal.jar" + file); } }
Αυτό που θέλω να κάνω εδώ είναι να ανοίξω το αρχείο στο uppaal, αλλά μου βγάζει το σφάλμα: the method rt(String, String, String) is undefined for the type test. Τι μπορώ να κάνω γι' αυτό; Επίσης σου λείπει ένα space πριν το + file
Title: Re: Ερώτηση σε JAVA
Post by: portinos on October 11, 2013, 10:42:48 am
Ok ευχαριστώ πολύ, το έλυσα!
Title: Re: Ερώτηση σε JAVA
Post by: portinos on October 13, 2013, 21:18:03 pm
Ερώτηση για μια προηγούμενη ερώτηση!!!!! Είχα τον παρακάτω κώδικα και ήθελα να χρησιμοποιήσω την αλλά τελικά δεν γίνεται με αυτό τον τρόπο. Σύμφωνα με αυτά που είπε ο antares πρέπει να κάνω ένα φίλτρο. Ο κώδικας με το φίλτρο υλοποιημένο είναι αυτός: ArrayList<String> File_name = new ArrayList<String>();
try { //Reading an XML file, created above File fXmlFile = new File("C:\\Users\\V\\Documents\\diplwmatiki\\temp\\dokimi.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); //optional, but recommended //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work doc.getDocumentElement().normalize(); //Printing the attributes of the XML file System.out.println("\nRoot element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("element"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("element : " + eElement.getAttribute("id")); System.out.println("File_name : " + eElement.getElementsByTagName("name").item(0).getTextContent()); File_name.add(eElement.getElementsByTagName("name").item(0).getTextContent());
} } } catch (Exception e) { e.printStackTrace(); } System.out.println("\n"); System.out.println(File_name); System.out.println("\n"); //Creating an list having all files of a directory String path = "C:\\Users\\V\\Documents\\diplwmatiki\\SFBs"; String files; File folder = new File(path); File[] listOfFiles = folder.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { if (listOfFiles[i].isFile()) { files = listOfFiles[i].getName(); System.out.println(files); } }
String[] myFiles = folder.list(new FilenameFilter(){ for (int i=0; i < listOfFiles.length; i++){ public boolean accept;File folder; String fileName;{ return fileName.startsWith(File_name[i]); System.out.println(folder); } });
Μου βγάζει όμως syntax errors(delete/insert token) στην πρώτη και την τελευταία γραμμή του φίλτρου. Με όποιο τρόπο και αν προσπαθώ να το διορθώσω συνεχίζει να βγάζει error. Καμιά πρόταση κανείς??? :D :D :D Ευχαριστώ!!!!
Title: Re: Ερώτηση σε JAVA
Post by: portinos on November 02, 2013, 17:51:21 pm
Java και XML η ερώτηση αυτή τη φορά. Έχω φτιάξει αυτή την κλάση: public class XMLConcat { public static void main(String[] args) throws Throwable { File dir = new File("C:\\test"); File[] rootFiles = dir.listFiles();
Writer outputWriter = new FileWriter("C:\\test\\mergedFile.xml"); XMLOutputFactory xmlOutFactory = XMLOutputFactory.newFactory(); XMLEventWriter xmlEventWriter = xmlOutFactory.createXMLEventWriter(outputWriter); XMLEventFactory xmlEventFactory = XMLEventFactory.newFactory();
xmlEventWriter.add(xmlEventFactory.createStartDocument()); xmlEventWriter.add(xmlEventFactory.createStartElement("", null, "rootSet"));
XMLInputFactory xmlInFactory = XMLInputFactory.newFactory(); SAXBuilder builder = new SAXBuilder(); for (File rootFile : rootFiles) { XMLEventReader xmlEventReader = xmlInFactory.createXMLEventReader(new StreamSource(rootFile)); XMLEvent event = xmlEventReader.nextEvent(); while (event.getEventType() != XMLEvent.START_ELEMENT) { event = xmlEventReader.nextEvent(); }
do { xmlEventWriter.add(event); event = xmlEventReader.nextEvent(); } while (event.getEventType() != XMLEvent.END_DOCUMENT); xmlEventReader.close(); }
xmlEventWriter.add(xmlEventFactory.createEndElement("", null, "rootSet")); xmlEventWriter.add(xmlEventFactory.createEndDocument());
xmlEventWriter.close(); outputWriter.close(); }
} που ουσιαστικά διαβάζει τα xml από τη λίστα και τα κάνει ένα τελικό xml, διατηρώντας όλους τους κόμβους όπως είναι αρχικά. Αν τα xml αρχεία έχουν την μορφή: <declaration>a1</declaration> <template1a>kak</template1a> <template1b>asa</template1b> <system>abc</system1>
πως μπορώ να βάλω τα στοιχεία που αντιστοιχούν στο declaration κάθε xml, σε ένα τελικό declaration, μετά να μπούνε όλα τα templates του πρώτου, του δεύτερου κλπ. και στο τέλος να κάνω το ίδιο με το declaration για το system. Η κλάση της Java παραπάνω, βάζει το declaration, τα templates, το system του πρώτου, μετά το ίδιο για το δεύτερο κοκ. Πώς μπορώ να την αλλάξω για να κάνει αυτό που περιγράφω; Ευχαριστώ!!!!!!
Title: Re: Ερώτηση σε JAVA
Post by: plagakis on November 08, 2013, 03:20:21 am
Διάβασε αυτό:
http://www.mkyong.com/java/how-to-create-xml-file-in-java-dom/
Κάποια στιγμή που μου χε χρειαστεί να φτιάξω xml αρχείο, αυτή η μέθοδος μου χε φανεί εύκολη και γρήγορη, και είναι αρκετά ξεκάθαρη στη δόμηση. Θέλω να πιστεύω πως αν καταλάβεις πως φτιάχνει τα αρχεία, θα βγάλεις άκρη και για να κάνεις αυτό που περιγράφεις (προφανώς και βαριέμαι να σου γράψω όλη τη λύση που ζητάς!)
Επίσης, δοκίμασε να γράφεις/ψάχνεις τις ερωτήσεις σου και στο StackOverflow, θα βοηθηθείς.
|