[JARs] Como modificar un archivo que esté en un mismo jar?

Iniciado por klaine, 23 Mayo 2011, 06:25 AM

0 Miembros y 1 Visitante están viendo este tema.

klaine

Buenas, tengo el siguiente problema con los archivos.jar

¿Como podría modificar los archivos que están compresos en el mismo jar con una aplicacion en java?

Por ejemplo, tengo mi archivo.class en una carpeta, en esa misma carpeta tengo una carpeta con archivos *.txt y la carpeta con el manifest, ok si compilo y ejecuto a nivel de linea de comandos puedo modificar el contenido de cualquier archivo.txt que esté en dicha carpeta, ahora bien, si comprimo y ejecuto el ejecutable.jar al tratar de trabajar con el directorio actual me toma el directorio donde está el .jar y no el directorio que está dentro del .jar, entonces mi duda es: ¿se puede trabajar con los archivos que están compresos dentro del .jar? ¿como?

No quisiera llegar a tener que depender de archivos externos  :-\

De antemano, gracias  :D

Saludos  ;)

1mpuls0

Hola

Interesante tema.

No sé muy bien que intentas hacer como para querer modificar el .txt

Hasta donde sé no se puede de una forma tan fácil.

Investiga sobre la clase ZipFile tal vez contenga algún método que pueda ayudarte, ya que el jar es como un .zip.

Si no, la única solución es hacer lo que tenga que hacer tu aplicación y al momento de querer modificar el .txt crear una copia del jar,extraer el contenido, modificar el .txt, terminar la aplicación, volver a crear el jar, renombrarlo e iniciar de nuevo la aplicación.

Explica mejor que es lo que intentas hacer y a ver si encontramos una mejor solución.

Saludos.

abc

klaine

Intentaba hacer un programa que me logeara en paginas, resolví hacerlo de la siguiente forma:

> Un método que escribe archivos, lo uso para escribir un vbs que envíe pulsaciones de teclas, como no supe llamar al vbs desde java resolvi usar este mismo metodo para escribir un bat que llame al vbs y le pase los argumentos con cscript

> Un metodo que reciba los argumentos necesarios para escribir el bat y que llame al vbs

> Esop, el resto lo hace el vbs, luego de abrir el navegador con la url especificada, muestra un msgbox y cuando se le da aceptar espera tres segundos y envía las pulsaciones de teclas.

Dejo el code de los métodos que uso, dejaría el code completo pero la gui la hice en netbeans, ya no me da el ánimo para codear en bloc de notas Xd

para escribir un archivo:

Código (java) [Seleccionar]

void writer(String[] args, String file, boolean rewrite, boolean delete_on_exit){

        /**
         *
         * El primer argumento indica
         * las palabras que se agregaran al archivo de
         * texto plano.
         *
         * El segundo argumento indica la ruta de
         * dicho archivo.
         *
         * Si el tercer argumento
         * es true el archivo
         * se sobreescribe
         *
         * Si el cuarto argumento es true
         * el archivo se borra al cerrar
         * el programa
         *
         *
         */

    String[] in=this.reader(file).split("\n");

    Writer w=new Writer(file, delete_on_exit);

    if(rewrite){

        w.touch();

    }else{

    for(String val:in){

        w.write(val);

    }

    }

    for(String val:args){

        w.write(val);

    }

    w.close();

    }



Y la clase writer:

Código (java) [Seleccionar]

class Writer {

    java.io.BufferedWriter bw;

    String file="";

    Writer(String foo, boolean delete){

        this.file=foo;

        try{

            File f = new File(this.file);

            if(delete){

            f.deleteOnExit();

            }

            bw=new BufferedWriter(new FileWriter(f));

        }catch(IOException ex){

        }
    }

    public void write(String line){

        try{

        bw.append(line);

        bw.newLine();

        }catch (IOException ex) {

            ex.printStackTrace();

        }

        }



    public void touch(){

       

        File f = new File(this.file);

        try{

            if(f.exists()){
            f.delete();
            f.createNewFile();
            }else{
            f.createNewFile();
            }

        }catch(IOException c){

        }

    }

    public void touch(String foo){

        try{

            File fi= new File(foo);

            if(fi.exists()){

                fi.delete();
                fi.createNewFile();

            }else{

                fi.createNewFile();

            }

        }catch(IOException c){

        }

    }

public void close(){

    try{

        this.bw.close();

    }catch(IOException ex){

    }

}

}


El vbs, este no cambia

Código (vb) [Seleccionar]


set wss=createobject("wscript.shell")
dim com
com=""""
wss.run("cmd /c start " + com + com + " " + wscript.arguments(0))
msgbox "pulsa aceptar para logear"
wscript.sleep 3000
wss.sendkeys wscript.arguments(1)
wscript.sleep 200
wss.sendkeys "{tab}"
wscript.sleep 200
wss.sendkeys wscript.arguments(2)




El bat, este se escribe con el método writer de java:

Código (dos) [Seleccionar]


@echo off
cscript /nologo "C:\Users\Zero\desktop\temp.vbs" "http://foro.elhacker.net/login.html" "user" "pass"




El metodo que llama al writer y escribe el bat (no recuerdo si fue este es que lo hice varias veces)

Código (java) [Seleccionar]


public void cscript(String[] args, String vbs) {

        String temp = "";

        if (new File(System.getProperty("user.home") + "\\desktop").isDirectory()) {

            temp = System.getProperty("user.home") + "\\desktop\\temp.bat";

        } else if (new File(System.getProperty("user.home") + "\\escritorio").isDirectory()) {

            temp = System.getProperty("user.home") + "\\escritorio\\temp.bat";

        } else {

            temp = JOptionPane.showInputDialog("Dame el path de tu escritorio");

        }

        String args2 = "";

        for (String val : args) {

            args2 += " " + "\"" + val + "\"";

        }

        String com = "\"";

        String[] bat = {"@echo off", "cscript /nologo " + com + vbs + com + args2};

        this.writer(bat, temp, true, true);

        try {

            Runtime.getRuntime().exec("cmd /c " + temp);

        } catch (IOException ex) {
        }



    }



Y bueno, el programa me salió, pero dependo mucho de estos archivos temporales, si hay otra solución sería genial, desde ya gracias por leer este tema.

Saludos  ;)

kiriost

Amigo si deseas enviar pulsaciones de tecla usa la clase Robot que trae Java, en vez de hacer tanto lío.  ::)

Acá te dejo un ejemplo de la utilización de la clase Robot:
Código (java) [Seleccionar]

import java.awt.Robot;
import java.awt.event.*;

public class Main {
    public static void main(String args[]) {
        Robot bot = new Robot();
        bot.keyPress(KeyEvent.VK_Q); //Presiona Q
    }
}


Espero que te sirva. Y si quieres crear un bot que te registre en diferentes páginas te recomendaría informarte sobre los comandos HTTP (GET y POST) y crear un bot mediante sockets (yo ya tengo el mío)
http://www.godsys.com.ar > Programación. Hacking y Cracking. Sistemas. Desarrollo Web.
Java, C/C++, PHP, Python, Perl, HTML, Game-Hacking, Defacing, Desarrollo Web, GNU/Linux, y más

klaine

Sry me faltó decir que la razón por la que quiero modificar un archivo dentro de un jar es porque este programa escribe mis direcciones en archivo de texto plano, el contenido es como sigue:

url#user#pass

Entonces después lo lee con un buffereredreader y lo divide con String.split("#")
Con eso creo los archivos ya mencionados, investigaré sobre la clase robot, no la conocía, gracias, pero ahora lo que necesito es eso de modificar el txt que esté dentro del jar (si hay otra opcion, bienvenida sea).

Saludos y gracias por vuestra ayuda  ;)