2009-04-23 14 views
9

Zur Zeit verwende ich 'ln' Befehl über Runtime.exec(). Es funktioniert gut. Das einzige Problem ist, dass wir, um diese Gabelung zu machen, den doppelten Heap-Speicherplatz der Anwendung benötigen. Meine App ist eine 64-Bit-App mit einer Heap-Größe von ca. 10Gigs und daher ist der Swap-Speicherplatz knapp. Ich konnte keine Konfiguration finden, die das beheben könnte.Erstellen einer festen Verbindung in Java

Ich möchte auch nicht JNI für das gleiche verwenden. Auch ich hatte irgendwo gehört, dass diese Einrichtung wird bald in Java 7 zur Verfügung gestellt werden.

+0

ein wenig langsamer. Was versuchst du zu tun, was hast du bereits versucht und was ist passiert, als du es versucht hast? –

Antwort

6

können Sie versuchen JNA anstelle von JNI (JNA hat einige klare Vorteile gegenüber JNI); Ja, überprüfen Sie die JSR 203

0

Sie könnten Windows anstelle von UNIX verwenden? ;) Ich glaube, dass JDK7 einen Aufruf verwenden wird, der CreateProcess anstelle von fork wo verfügbar ist.

Eine praktischere Lösung wäre es, bald nach dem Start einen neuen untergeordneten Prozess zu erstellen. Wenn Sie einen 10g-Heap verwenden, wird ein anderer kleiner Java-Prozess wahrscheinlich nicht so schlecht sein. Holen Sie diesen Prozess (über die Verwendung von Streams) zu exec.

4

Das mit JNA ist sehr einfach:

public interface CLibrary extends Library { 
    CLibrary INSTANCE = (CLibrary) 
     Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), 
          CLibrary.class); 
    int link(String fromFile, String toFile); 
} 

public static void main(String[] args) { 
    CLibrary.INSTANCE.link(args[0], args[1]); 
} 

kompilieren und ausführen!

+0

Es kompiliert, aber es läuft nicht. Nicht unter Windows. Ich habe die Magie, die JNA leistet, immer noch verbessert, aber es scheint, dass der Name der jeweiligen Funktion in MSVCRT sehr unterschiedlich ist. –

+0

Laut http://stackoverflow.com/questions/6015006/whats-the-name-of-the-create-hard-link-function-in-msvcrt heißt die Funktion 'CreateHardLink' und befindet sich in Kernel32, nicht in MSVCRT (was sinnvoll ist). –

8

Es ist einfach, in Java 7 createLink mit:

Files.createLink(Paths.get("newlink"), Paths.get("existing")); 
+2

Hier ist die Dokumentation: http://docs.oracle.com/javase/tutorial/essential/io/links.html –

Verwandte Themen