Hi! Hab da ein Problem mit dem ShutdownHook. Nutze den zum Speichern von Daten vor dem Runterfahren. Habe versucht das als Hintergrundprozess laufen zu lassen bzw. minimiert als SystemTrayIcon. Wenn ich die executable .jar starte (führt dann wohl automatisch javaw aus) Speichert er gar nix oder höchstens nen teil. Jedoch wenn ich es mit ner bat starte(in der ich java -jar nutze) wird die konsole angezeigt und es klappt. Woran liegt das?
Hier der Code:
CopyThread.java
und TransferApp.java
Ich hoffe es liegt nicht daran dass das runterfahren nur für eine begrenzte Zeit beendet wird. Über jeden tipp wär ich echt dankbar. Achso falls da nen anderer ansatz als der shutdownhook sinnvoller wäre würde ich das auch neu aufsetzen
solange es dann fehlerfrei funzt.
Hier der Code:
CopyThread.java
Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyThread extends Thread {
private String srcDir;
private String destDir;
public CopyThread(String srcDir, String destDir) {
this.srcDir = srcDir;
this.destDir = destDir;
}
public void run() {
try {
rcopy(new File(srcDir), new File(destDir));
}
catch (IOException io) {
}
}
public static void rcopy(File source, File destination) throws IOException {
if (source.isDirectory()) {
destination.mkdir();
String[] dirList = source.list();
for (int i=0;i<dirList.length;i++) {
String entryName = dirList[i];
rcopy(new File(source, entryName), new File(destination, entryName));
}
}
else {
int numberOfBytes;
byte[] buffer = new byte[65536];
FileInputStream in = new FileInputStream(source);
FileOutputStream out = new FileOutputStream(destination);
while ( (numberOfBytes = in.read(buffer)) > 0) {
out.write(buffer,0,numberOfBytes);
}
in.close();
out.close();
}
}
}
Java:
import java.util.Properties;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import javax.swing.JFrame;
import eu.littles.shutdownhook.CopyThread;
public class TransferApp {
public TransferApp(String srcDir, String destDir) {
Thread t = new CopyThread(srcDir, destDir);
Runtime.getRuntime().addShutdownHook(t);
do {
try {
Thread.sleep(1);
}
catch (InterruptedException ie) {
Runtime.getRuntime().halt(1);
}
}
while (true);
}
private static void helpAndTerminate() {
System.exit(1);
}
/**
* @param args
*/
public static void main(String[] args) {
JFrame Hauptfenster = new JFrame("Fenster");
Hauptfenster.setExtendedState(JFrame.ICONIFIED);
Hauptfenster.setSize(0,0);
Hauptfenster.setLocation(1150, 725);
Hauptfenster.setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
Hauptfenster.setVisible(false);
TrayIcon trayIcon = null;
if (SystemTray.isSupported()) {
// get the SystemTray instance
SystemTray tray = SystemTray.getSystemTray();
// load an image
Image image = Toolkit.getDefaultToolkit().getImage("C:/icon_error.gif");
// create a action listener to listen for default action executed on the tray icon
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
// execute default action of the application
// ...
System.exit(0);
}
};
// create a popup menu
PopupMenu popup = new PopupMenu();
// create menu item for the default action
MenuItem defaultItem = new MenuItem("Exit");
defaultItem.addActionListener(listener);
popup.add(defaultItem);
/// ... add other items
// construct a TrayIcon
trayIcon = new TrayIcon(image, "Hook", popup);
// set the TrayIcon properties
trayIcon.addActionListener(listener);
// ...
// add the tray image
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println(e);
}
// ...
} else {
// disable tray option in your application or
// perform other actions
}
// ...
// some time later
// the application state has changed - update the image
Properties transferPrp = new Properties();
switch (args.length) {
case 0:
try {
transferPrp.load(new FileInputStream("C:\\ShutdownHook\\prp\\bas\\Basic.properties"));
}
catch (java.io.IOException e) {
helpAndTerminate();
};
String srcDir = transferPrp.getProperty("SrcDir");
String destDir = transferPrp.getProperty("DestDir");
if (srcDir.equals(destDir)) {
helpAndTerminate();
}
else {
new TransferApp(srcDir,destDir);
}
break;
case 1:
helpAndTerminate();
break;
case 2:
if (args[0].equals(args[1])) {
helpAndTerminate();
}
new TransferApp(args[0], args[1]);
break;
}
}
}