Avatar billede master_orion Nybegynder
21. januar 2004 - 21:12 Der er 11 kommentarer og
1 løsning

Opret fil uden for jar

Hej,

Jeg har lidt et problem. Jeg skal have oprettet en fil uden for min jar hvor hele min applikation ligger. Som I nok ved er det umuligt at sige hvor jar filen kommer til at ligge da den skal være mobil. Jeg søger derfor en måde at oprette en fil i samme bibliotek som jar filen ligger. hvor efter jeg uden større problemer skulle kunne læse og skrive til selvsamme fil.

Håber at der er en som har en smart måde at oprette en sådan fil på.

//Spørgsmålet har fået 60 point for at jeg har lidt små travlt med at få et virkende svar.. ;)
Avatar billede arne_v Ekspert
21. januar 2004 - 21:27 #1
Lille eksempel:

import java.util.*;

public class GetPath {
    private static String getPath() {
        String cn = GetPath.class.getName();
        StringTokenizer st = new StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
        while(st.hasMoreTokens()) {
            if(first) {
                first = false;
            } else {
                sb.append("/");
            }
            sb.append(st.nextToken());
        }
        sb.append(".class");
        String path = GetPath.class.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();
        return path;
    }
    public static void main(String[] args) {
        System.out.println(getPath());
    }
}

C:\>javac GetPath.java

C:\>java GetPath
/C:/GetPath.class

C:\>jar cvf test.jar GetPath.class
added manifest
adding: GetPath.class(in = 1541) (out= 853)(deflated 44%)

C:\>java -classpath test.jar GetPath
file:/C:/test.jar!/GetPath.class

Du kan se at jar file ligger i C:\ (kræver en lille smule streng parsning
at finde, men det er ikke så svært).
Avatar billede master_orion Nybegynder
21. januar 2004 - 21:33 #2
Det ser alt sammen ret smart ud. Men jeg skal ikke blot have min jar fil flyttet fra en windows til en ande.. Men den skal også køre på en Solaris. Derfor kan man slet ikke skrive c:\ men jeg har et home dir som ligger på en eller anden tosset disk man ikke kender noget til. Det er derfor jeg gerne vil kunne sige noget i retningen af gå ud af filen og lav en fil på win ville du skrive: "cd.."  og på Solaris "cd .." og hvis man så kunne create file: ../file eller noget. Det ville være super smart! Det andet er bare ikke helt godt nok.
Avatar billede arne_v Ekspert
21. januar 2004 - 21:35 #3
Det andet virker da udmærket på Solaris.

Prøv selv !

(den returnerer naturligvis ikke C:\ men snarere /home/etellerandet)
Avatar billede arne_v Ekspert
21. januar 2004 - 21:36 #4
Men nu skal jeg lige høre: vil I have det dierctory I står I når I kører
programmet eller det directory som koden i kører ligger i ?

(det er 2 forskellige ting)
Avatar billede master_orion Nybegynder
21. januar 2004 - 21:37 #5
Jeg vil meget gerne have det sidste.. altså der hvor koden ligger. Jeg er som lige glad hvor du køre den fra.
Avatar billede arne_v Ekspert
21. januar 2004 - 21:44 #6
Så er metoden den jeg har postet kode til.

Prøv og kør den lille kode stump på Solaris og se det virke.
Avatar billede master_orion Nybegynder
21. januar 2004 - 21:45 #7
Det vil jeg lige prøve.. ;)
Avatar billede arne_v Ekspert
21. januar 2004 - 22:04 #8
Samme kode kørt på Linux:

[arne@arne2 arne]$ javac GetPath.java
[arne@arne2 arne]$ java GetPath
/home/arne/GetPath.class
[arne@arne2 arne]$ jar cvf test.jar GetPath.class
added manifest
adding: GetPath.class(in = 1566) (out= 868)(deflated 44%)
[arne@arne2 arne]$ java -classpath test.jar GetPath
file:/home/arne/test.jar!/GetPath.class
Avatar billede master_orion Nybegynder
21. januar 2004 - 23:42 #9
Jeg har fundet løsningen til mit problem.

public void createFile(){
  File file = new File("./temp.txt");
  try{
    file.createNewFile();
  }
  catch{
  }
}

Jeg kan lave en fil ved siden af min jar fil ved at skrive ./ Det er smart/simpelt og har løst mit problem.. Ellers mange tak for hjælpen.. :)
Avatar billede arne_v Ekspert
21. januar 2004 - 23:54 #10
Øh.

Husker du mit 21:36:35 spørgsmål ?

"./temp.txt" ligger filen i det directory hvorfra man kører programmet
ikke i det directory hvor jar filen ligger (medmindre den tilfældigvis
liger i det directory hvor man kører programmet fra) !

Du behøver iøvrigt ikke engang "./", bare "temp.txt" bør ligge den samme sted.
Avatar billede master_orion Nybegynder
22. januar 2004 - 00:08 #11
Hmm! Er der noget jeg har misforstået og blot været heldig med det..? Men det lykkes altså for mig at den altid ved hvor temp filen ligger ved at skrive ./ og nej, jeg kan ikke nøjes med filnavnet. Alt om alt er jeg har fundet en løsning til mit problem. :)
Avatar billede arne_v Ekspert
22. januar 2004 - 20:26 #12
Ja - jeg tror et eller andet er kikset.

[arne@arne2 E]$ cat GetPath.java
import java.util.*;
import java.io.*;

public class GetPath {
    private static String getPath() {
        String cn = GetPath.class.getName();
        StringTokenizer st = new StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
        while(st.hasMoreTokens()) {
            if(first) {
                first = false;
            } else {
                sb.append("/");
            }
            sb.append(st.nextToken());
        }
        sb.append(".class");
        String path = GetPath.class.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();
        path = path.substring(path.indexOf(":") + 1);
        int ix = path.indexOf("!");
        if(ix >= 0) path = path.substring(0, ix);
        path = path.substring(0, path.lastIndexOf("/") + 1);
        return path;
    }
    public static void main(String[] args) throws Exception {
        System.out.println((new File("test.txt")).getCanonicalPath());
        System.out.println((new File("./test.txt")).getCanonicalPath());
        System.out.println((new File(getPath() + "test.txt")).getCanonicalPath(;
    }
}

[arne@arne2 E]$ javac GetPath.java
[arne@arne2 E]$ jar cvf ../test.jar *.class
added manifest
adding: GetPath.class(in = 2031) (out= 1104)(deflated 45%)
[arne@arne2 E]$ java -classpath ../test.jar GetPath
/home/arne/E/test.txt
/home/arne/E/test.txt
/home/arne/test.txt
[arne@arne2 E]$

viser klart at:

"test.txt" -> dir man står i
"./test.txt" -> dir man står i
getPath() + "test.txt" -> dir hvor ens kode ligger
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester