Aiuto per migliorare un programma (JFrame e Drag-and-Drop)

di il
6 risposte

Aiuto per migliorare un programma (JFrame e Drag-and-Drop)

Salve,

premetto che non sono mai stato un esperto di java ed inoltre è da un po' che non lo tocco.

Ho creato un piccolo programmino che "converte" dei file con estensione .dtt in .dds.
Tutto quello che si deve fare è rimuovere l'header dal file .dtt (il file .dds inizia da "DDS...").


package main;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

public class MMain
{
	public static void main(String[] args)
	{		
		try
		{
			int x;
			
			Scanner keyb = new Scanner(System.in);
			
			System.out.println("Enter the number of files (called '(*).dtt'):");
			do
			{
			    System.out.println();
			    x = keyb.nextInt();
			    System.out.println();
			    if (x <= 0)
			    	System.out.println("The number must be higher than 0");
			}while (x <= 0);
			
			keyb.close();
			
			for(int i = 1; i <= x; i++)
			{				
				FileInputStream DTT = new FileInputStream("(" + i + ").dtt");
				FileOutputStream DDS = new FileOutputStream("(" + i + ").dds");
				
				char a = (char) DTT.read();
				char b = (char) DTT.read();
				char c = (char) DTT.read();
				
				while(!(a == 'D' && b == 'D' && c == 'S'))
				{
					a = b;
					b = c;
					c = (char) DTT.read();
				}
				
				DDS.write(68);
				DDS.write(68);
				DDS.write(83);
				
				int newB = 0;
				
				while(newB != -1)
				{
					newB = DTT.read();
					DDS.write(newB);
				}
				
				DTT.close();
				DDS.close();
			}
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
	}
}
Adesso, il programma funziona bene solo che vorrei:

- Lanciare il jar "normalmente" e non tramite prompt o file bat
- Slegarmi dal vincolo di chiamare i file .dtt "(1).dtt", "(2).dtt", "(3).dtt", ...
A proposito di questo, sarebbe ancora meglio poter creare un frame dove poter droppare i file (anche più di uno alla volta)
- Ho notato che il programma è abbastanza lento. I buffer potrebbero aiutare?

Potete anche dirmi quali sono le classi e come impostarle (non mi serve il programma già fatto).

Grazie a tutti in anticipo


- edit -

Cacchio se aiutano i buffer

6 Risposte

  • Re: Aiuto per migliorare un programma (JFrame e Drag-and-Drop)

    Criller ha scritto:


    - Lanciare il jar "normalmente" e non tramite prompt o file bat
    Cosa intendi per "Lanciare il jar normalmente" ? Semplicemente con doppio-click sul jar?
    Sì, è ovviamente possibile ma presuppone che: a) ci sia un JRE "pubblico" installato e b) che l'estensione .jar sia associata al JRE (cosa che è così quando installi un JRE pubblico).
    Poi se l'utente ha smanettato con le associazioni ed ha associato .jar a es. WinZip, 7-Zip o che altro .... beh, affari suoi.

    Ma c'è anche un'altra questione: perlomeno su Windows l'associazione predefinita del .jar va ad avviare javaw.exe che è il launcher della JVM SENZA la "console". Quindi va bene solo per avviare applicazioni desktop "grafiche".
    Mentre la tua è una applicazione "console" perché usi lo standard-input/output

    Criller ha scritto:


    - Slegarmi dal vincolo di chiamare i file .dtt "(1).dtt", "(2).dtt", "(3).dtt", ...
    Se vuoi puoi chiedere all'utente una directory e poi andare tu a cercare tutti i file che hanno l'estensione che ti interessa. Basta usare i metodi di "list" della classe java.io.File, usando un apposito filtro (vedi javadoc).

    Criller ha scritto:


    sarebbe ancora meglio poter creare un frame dove poter droppare i file (anche più di uno alla volta)
    Sì, anche questo mi pare sia possibile ma ovviamente richiede altro codice.

    Criller ha scritto:


    - Ho notato che il programma è abbastanza lento. I buffer potrebbero aiutare?
    Beh, stai leggendo e scrivendo 1 byte per volta!! Ovviamente è lento.
    Se devi copiare pari-pari tutto il resto del file, la soluzione semplice e tipica è leggere e scrivere a blocchi di N byte. Crei un array di es. 1024 byte e leggi e scrivi da questo (attenzione alla lunghezza dell'ultimo blocco!).
    Questo è già un concetto di "buffering", non servirebbero i BufferedXXXStream.

    Criller ha scritto:


    Potete anche dirmi quali sono le classi e come impostarle (non mi serve il programma già fatto).
    Cioè??
  • Re: Aiuto per migliorare un programma (JFrame e Drag-and-Drop)

    andbin ha scritto:


    Criller ha scritto:


    - Lanciare il jar "normalmente" e non tramite prompt o file bat
    Cosa intendi per "Lanciare il jar normalmente" ? Semplicemente con doppio-click sul jar?
    Sì, è ovviamente possibile ma presuppone che: a) ci sia un JRE "pubblico" installato e b) che l'estensione .jar sia associata al JRE (cosa che è così quando installi un JRE pubblico).
    Poi se l'utente ha smanettato con le associazioni ed ha associato .jar a es. WinZip, 7-Zip o che altro .... beh, affari suoi.

    Ma c'è anche un'altra questione: perlomeno su Windows l'associazione predefinita del .jar va ad avviare javaw.exe che è il launcher della JVM SENZA la "console". Quindi va bene solo per avviare applicazioni desktop "grafiche".
    Mentre la tua è una applicazione "console" perché usi lo standard-input/output

    Criller ha scritto:


    - Slegarmi dal vincolo di chiamare i file .dtt "(1).dtt", "(2).dtt", "(3).dtt", ...
    Se vuoi puoi chiedere all'utente una directory e poi andare tu a cercare tutti i file che hanno l'estensione che ti interessa. Basta usare i metodi di "list" della classe java.io.File, usando un apposito filtro (vedi javadoc).

    Criller ha scritto:


    sarebbe ancora meglio poter creare un frame dove poter droppare i file (anche più di uno alla volta)
    Sì, anche questo mi pare sia possibile ma ovviamente richiede altro codice.

    Criller ha scritto:


    - Ho notato che il programma è abbastanza lento. I buffer potrebbero aiutare?
    Beh, stai leggendo e scrivendo 1 byte per volta!! Ovviamente è lento.
    Se devi copiare pari-pari tutto il resto del file, la soluzione semplice e tipica è leggere e scrivere a blocchi di N byte. Crei un array di es. 1024 byte e leggi e scrivi da questo (attenzione alla lunghezza dell'ultimo blocco!).
    Questo è già un concetto di "buffering", non servirebbero i BufferedXXXStream.

    Criller ha scritto:


    Potete anche dirmi quali sono le classi e come impostarle (non mi serve il programma già fatto).
    Cioè??
    Grande rapidità

    ... ho fatto qualcosa
    
    package main;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.File;
    
    public class DTTtoDDS
    {
    	public static void main(String[] args)
    	{		
    		try
    		{
    			File f = new File("D:/");
    			
    			String[] paths = f.list(); 
    			                              
    			for(String path : paths)     
    			{
    				if (path.endsWith(".dtt") || path.endsWith(".DTT"))
    				{
    					FileInputStream DTT = new FileInputStream(path);
    					BufferedInputStream DTTb = new BufferedInputStream(DTT);
    					FileOutputStream DDS = new FileOutputStream(path.substring(0, path.length() - 4) + ".dds");
    					BufferedOutputStream DDSb = new BufferedOutputStream(DDS);
    					
    					char a = (char) DTT.read();
    					char b = (char) DTT.read();
    					char c = (char) DTT.read();
    					
    					while(!(a == 'D' && b == 'D' && c == 'S'))
    					{
    						a = b;
    						b = c;
    						c = (char) DTT.read();
    					}
    					
    					DDS.write(68);
    					DDS.write(68);
    					DDS.write(83);
    					
    					int newB = 0;
    					
    					while(newB != -1)
    					{
    						newB = DTTb.read();
    						DDSb.write(newB);
    					}
    					
    					DTTb.close();
    					DDSb.close();
    				}
    			}                             
    		}
    		catch(Exception e)
    		{
    			System.out.println(e);
    		}
    	}
    }
    
    L'unico problema è che per new File("_PATH_"); il percorso lo devo specificare a priori: se non metto nulla (new File("")) mi da un'eccezione, se invece metto new File("/") non fa nulla.


    - edit -

    Ho risolto così new File(new File("").getAbsolutePath()) ma mi sembra un po' uno schifo
  • Re: Aiuto per migliorare un programma (JFrame e Drag-and-Drop)

    Criller ha scritto:


    			File f = new File("D:/");
    			
    			String[] paths = f.list(); 
    			                              
    			for(String path : paths)     
    			{
    				if (path.endsWith(".dtt") || path.endsWith(".DTT"))
    				{
    					FileInputStream DTT = new FileInputStream(path);
    
    Questo non è molto corretto. Quando usi il list() l'array di String contiene solo i nomi dei file, SENZA alcun percorso. Se il solo nome lo passi quindi a FileInputStream, esso lo interpreta relativo alla directory "corrente", che potrebbe ovviamente anche essere diversa dal D:\ che hai specificato come base per il list.

    Se vuoi usare list(), l'approccio da usare è tipicamente quello di creare un File passando il File della directory e lo String con il nome:
    File dir = new File(" ....directory base.... ");
    
    String[] nomi = dir.list();
    
    for (String nome : nomi) {
        File file = new File(dir, nome);
    
        // usa file (NON nome)
    }
  • Re: Aiuto per migliorare un programma (JFrame e Drag-and-Drop)

    andbin ha scritto:


    Criller ha scritto:


    			File f = new File("D:/");
    			
    			String[] paths = f.list(); 
    			                              
    			for(String path : paths)     
    			{
    				if (path.endsWith(".dtt") || path.endsWith(".DTT"))
    				{
    					FileInputStream DTT = new FileInputStream(path);
    
    Questo non è molto corretto. Quando usi il list() l'array di String contiene solo i nomi dei file, SENZA alcun percorso. Se il solo nome lo passi quindi a FileInputStream, esso lo interpreta relativo alla directory "corrente", che potrebbe ovviamente anche essere diversa dal D:\ che hai specificato come base per il list.

    Se vuoi usare list(), l'approccio da usare è tipicamente quello di creare un File passando il File della directory e lo String con il nome:
    File dir = new File(" ....directory base.... ");
    
    String[] nomi = dir.list();
    
    for (String nome : nomi) {
        File file = new File(dir, nome);
    
        // usa file (NON nome)
    }
    Ci ho riflettuto un po' e forse ho capito... ma perché devo mandargli anche il nome (percorso veramente) della cartella?
    In questo caso (il tuo caso) il file che utilizzi è nella stessa cartella che poi mandi al costruttore... non è ridondante? Non basterebbe mandare il percorso completo del file? Da quello che ho capito tu fai:

    File file = new File(C:\foto, Immagine1.jpg); (sostituisci "C:\foto" e "Immagine1.jpg" con dir e nome)

    Non basterebbe fare File file = new File(C:\foto\Immagine1.jpg); (sempre sostituendo)
  • Re: Aiuto per migliorare un programma (JFrame e Drag-and-Drop)

    Criller ha scritto:


    Non basterebbe mandare il percorso completo del file?
    Con il list() hai solo i nomi dei file, SENZA alcun percorso, né assoluto né relativo. Hai solo nomi es. "pippo.txt".
    Quindi usare il costruttore File(File parent, String child) generalmente è il modo appropriato per avere un File che rappresenti correttamente il file (indipendentemente dal fatto che il "parent" sia relativo o assoluto). Viene fuori comunque corretto.
  • Re: Aiuto per migliorare un programma (JFrame e Drag-and-Drop)

    andbin ha scritto:


    Criller ha scritto:


    Non basterebbe mandare il percorso completo del file?
    Con il list() hai solo i nomi dei file, SENZA alcun percorso, né assoluto né relativo. Hai solo nomi es. "pippo.txt".
    Quindi usare il costruttore File(File parent, String child) generalmente è il modo appropriato per avere un File che rappresenti correttamente il file (indipendentemente dal fatto che il "parent" sia relativo o assoluto). Viene fuori comunque corretto.
    Capito, grazie
Devi accedere o registrarti per scrivere nel forum
6 risposte