Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design
OnePlus 15 nasce per alzare l'asticella delle prestazioni e del gaming mobile. Ma non solo, visto che integra un display LTPO 1,5K a 165 Hz, OxygenOS 16 con funzioni AI integrate e un comparto foto con tre moduli da 50 MP al posteriore. La batteria da 7.300 mAh con SUPERVOOC 120 W e AIRVOOC 50 W è la ciliegina sulla torta per uno smartphone che promette di offrire un'esperienza d'uso senza alcun compromesso
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media
Vediamo come si comporta il Ryzen 5 7500X3D, nuovo processore di casa AMD che fonde 6 core Zen 4 con la tecnologia 3D V-Cache, particolarmente utile in scenari come il gaming. Annunciato a un prezzo di listino di 279€, il nuovo arrivato sarà in grado di diventare un riferimento per i sistemi budget? Ecco cosa ne pensiamo.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-05-2007, 18:11   #1
int_double
Junior Member
 
Iscritto dal: May 2007
Messaggi: 7
programma fatto in java per copiare foto

salve a tutti questo è il mio primo post, potete per favore darmi una mano a fare questo programma in java perchè sono in difficoltà:
dovrei fare un programma che verifica se un immagine esiste in una directori e la copia nella stessa ma con un nome diverso (esempio foto1.bmp ne crea un'altra di nome copia.bmp) inoltre il programma deve fare una test: l'immagine di partenza esiste?
- se si verifica che non esiste già una foto con il nuovo nome che si vuole dare e in quel caso chiede se sovrascriverla, inoltre quando ha finito la copia avvisa
- se non esiste l'immagine di partenza avvisa l'utente che non l'ha trovata e saluta

ho provato questo codice ma la nuova immagine presenta dei difetti

ciao, mi aiutate per favore
int_double è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2007, 18:12   #2
int_double
Junior Member
 
Iscritto dal: May 2007
Messaggi: 7
Quote:
Originariamente inviato da int_double Guarda i messaggi
salve a tutti questo è il mio primo post, potete per favore darmi una mano a fare questo programma in java perchè sono in difficoltà:
dovrei fare un programma che verifica se un immagine esiste in una directori e la copia nella stessa ma con un nome diverso (esempio foto1.bmp ne crea un'altra di nome copia.bmp) inoltre il programma deve fare una test: l'immagine di partenza esiste?
- se si verifica che non esiste già una foto con il nuovo nome che si vuole dare e in quel caso chiede se sovrascriverla, inoltre quando ha finito la copia avvisa
- se non esiste l'immagine di partenza avvisa l'utente che non l'ha trovata e saluta

ho provato questo codice ma la nuova immagine presenta dei difetti

ciao, mi aiutate per favore
scusate ecco il codice:

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Copia {
public static void main(String[] args) throws IOException {
File inputFile = new File("foto1.bmp");
File outputFile = new File("nuova.bmp");
FileReader in = new FileReader(inputFile);
FileWriter out = new FileWriter(outputFile);
int c;
while ((c = in.read()) != -1)
out.write(c);
in.close();
out.close();
}
}
int_double è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2007, 18:52   #3
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
non ho il tempo di contyrollarlo ora, ma la nuova immagine, che difetti presenta????


a che ti serve, magari possiamo darti una mano a fare qualcosa di più carino
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2007, 19:02   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
La faccio breve. Idea corretta, strumenti errati. Esempio con commento passo-passo:

Codice:
package int_double.copyimage;

import java.io.*;
import java.nio.channels.*;

//Java 6 Required
public class Main {

	public static void main(String[] args) {
		String directory = ".";//System.getProperty("user.dir");
		//immagine inella directory di lavoro
		String nomeFile = "foto1.bmp";
		
		//esiste?
		File file = new File(directory + File.separator + nomeFile);
		boolean esiste = file.exists();
		
		//se esiste, crea la copia
		if(esiste) {
			try {
				copiaFile(directory, "foto1.bmp", "copia.bmp");
				System.console().printf("File copiato.%n");
			} catch(IOException ex) {
				System.console().printf("Errore durante la copia.%n%s%n", ex);
			}
		} else {
			System.console().printf("Il file da copiare non esiste.%n");
		}
	}
	
	/**Questo è il metodo che copia il file nomeFile, nella directory
	directory, sul file nomeCopia, nella stessa directory */
	private static void copiaFile(String directory, String nomeFile,
		String nomeCopia) throws IOException
	{
		/** Crea un riferimento al file da copiare */
		File fileDaCopiare = new File(directory + File.separator + nomeFile);
		
		/** Crea un riferimento al file su cui copiare. Non crea il file: il file
		vero e proprio è creato da FileChannel quando si inizierà a scrivere. */
		File nuovoFile = new File(directory + File.separator + nomeCopia);
		
		/** Canale da cui provengono i byte da copiare */
		FileChannel in = null;
		
		/** Canale da cui usciranno i byte */
		FileChannel out = null;
		try {
			/** Apre un canale sul file da copiare */
			in = new FileInputStream(fileDaCopiare).getChannel();
			
			/** Apre un canale in uscita sul file copiato */
			out = new FileOutputStream(nuovoFile).getChannel();
			
			/** Copia tutti i byte del file in entrata sul file in uscita */
			long byteScritti = 0;
			long byteTotali = in.size();
			while(byteScritti < byteTotali) {
				byteScritti += out.transferFrom(in, byteScritti, byteTotali);
			}
		} finally {
			close(in, out);
		}
	}
	
	private static void close(Channel in, Channel out) throws IOException {
		try {
			if(in != null) in.close();
		} finally {
			if(out != null) out.close();
		}
	}
}
Con i flussi i metodi copiaFile e close diventerebbero:

Codice:
	private static void copiaFileConFlussi(String directory, String nomeFile,
		String nomeCopia) throws IOException
	{
		/** Crea un riferimento al file da copiare */
		File fileDaCopiare = new File(directory + File.separator + nomeFile);
		
		/** Crea un riferimento al file su cui copiare. Non crea il file: il file
		vero e proprio è creato da FileChannel quando si inizierà a scrivere. */
		File nuovoFile = new File(directory + File.separator + nomeCopia);
		
		FileInputStream in = null;
		FileOutputStream out = null;
		try {
			in = new FileInputStream(fileDaCopiare);
			out = new FileOutputStream(nuovoFile);
			int byteLetto;
			while((byteLetto = in.read()) != -1) {
				out.write(byteLetto);
			}
		} finally {
			close(in, out);
		}
	}
	
	private static void close(InputStream in, OutputStream out)
		throws IOException
	{
		try {
			if(in != null) in.close();
		} finally {
			if(out != null) out.close();
		}
	}
In verità useresti BufferedInputStream e BufferedOutputStream anzichè direttamente FileInputStream e FileOutputStream. Ma è un caso scolastico: per questo genere di operazioni i flussi sono relitti del passato.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2007, 20:28   #5
int_double
Junior Member
 
Iscritto dal: May 2007
Messaggi: 7
grazie per l'aiuto PGI-Bis

mi puoi spiegare per favore
1) cosa è File.separator, la barra \ per caso?
2) byteScritti += out.transferFrom(in, byteScritti, byteTotali);
3) mi puoi dire come fare per vedere se il file chè andro a scrivere esiste già e mi chiede sovrascriverlo S/N?

ma questo codice funziona soltanto con java 6 perchè io ho la versione 5 e con il 56k ...


grazie tanto
int_double è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2007, 21:10   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Per 1.5 sostituisci "System.console().printf(" con "System.out.printf". Il resto dovrebbe essere uguale.

Sì, File.separator è la barra. \ su Windows, / su Unix.

Il metodo transferFrom di FileChannel richiede tre argomenti.

Il primo è un ReadableByteChannel che rappresenta la sorgente dei dati da cui il canale trasferirà i byte (transfer from, trasferisci da). Nel codice ho usato "in". "in" è il FileChannel aperto sul file da copiare.

Il secondo parametro è un intero long. Questo intero stabilisce la posizione a partire dalla quale il canale deve scrivere i dati sul file in uscita. Ad esempio se quel numero valesse 3000 allora i byte verrebbero scritti a partire dalla posizione 3000. Se valesse 0 allora il trasferimento scriverebbe i byte a partire dalla posizione 0 (che è l'inizio del file di destinazione).

Il terzo parametro è un altro intero long. Questo intero stabilisce il numero massimo di byte che possono essere trasferiti dal canale sorgente. Se valesse 3 allora l'operazione "transferFrom" trasferirebbe al massimo 3 byte. Nel codice vale "in.size()". Per un FileChannel il metodo size() restituisce il numero di byte totali conservati nel file.

L'invocazione transferFrom è dentro ad un ciclo while. In pratica quel ciclo è superfluo. Si potrebbe dire:

out.transferFrom(in, 0, in.size());

e funzionerebbe benissimo. Non è superfluo in teoria. La documentazione del metodo trasferFrom dice che è possibile che il trasferimento non si concluda in un'unica tranche. Il metodo trasferFrom restituisce un valore long corrispondente al numero di byte effettivamente trasferite dall'operazione. Il ciclo while dell'esempio usa questo numero per incrementare un contatore e ripete l'operazione transferFrom finchè quel contatore non ha un valore pari al numero di byte presenti nel file di origine. Nel caso in cui il trasferimento non si concluda con una singola invocazione di transferFrom, le invocazioni successive devono tener conto del fatto che i byte da aggiungere al file di destinazione dovranno essere scritti a partire da dove è stato scritto l'ultimo byte dell'invocazione precedente. Se usassi il valore 0 e il trasferimento richiedesse due invocazioni allora la seconda sovrascriverebbe in tutto o in parte la prima. Passandogli il numero di byte precedentemente scritti ottengo invece il corretto accumulo dei dati.

L'ultimo parametro è sempre uguale (e non si riduce con l'incremento dei byte trasferiti) perchè la documentazione dice che questo è un valore massimo di byte trasferibile e non la quantità che dovrà effettivamente essere trasferita. Presumibilmente questo terzo long è usato per allocare un buffer tampone. Per grandi file potrebbe essere sensato stabilire un valore ottimale tipo 512 o 1024 byte.

Aggiungere la richiesta di conferma non è complicato. E' una cosa che probabilmente andrebbe fatta con un po' più di eleganza ma siamo sul procedurale per cui proseguo con questa strada.

Codice:
package int_double.copyimage;

import java.io.*;
import java.nio.channels.*;
import java.util.*;

public class Main {

	public static void main(String[] args) {
		String directory = ".";//System.getProperty("user.dir");
		//immagine inella directory di lavoro
		String nomeFile = "foto1.bmp";
		
		//esiste?
		File file = new File(directory + File.separator + nomeFile);
		boolean esiste = file.exists();
		
		//se esiste, crea la copia
		if(esiste) {
			try {
				confermaECopia(directory, "foto1.bmp", "copia.bmp");
			} catch(IOException ex) {
				System.out.printf("Errore durante la copia.%n%s%n", ex);
			}
		} else {
			System.out.printf("Il file da copiare non esiste.%n");
		}
	}
	
	private static void confermaECopia(String directory, String nomeFileSorgente,
		String nomeFileDestinazione) throws IOException
	{
		File fileDaCopiare = new File(directory + File.separator + nomeFileSorgente);
		File fileDestinazione = new File(directory  + File.separator + nomeFileDestinazione);
		
		boolean destinazioneEsiste = fileDestinazione.exists();
		boolean scrivi = true;
		
		/* Se il file di destinazione esiste allora devo chiedere una conferma */
		if(destinazioneEsiste) {
			String messaggio =
				"Nella cartella %s esiste gia' un file di nome %s," +
				" Devo sovrascriverlo? [Si'/No] > ";
			Scanner input = new Scanner(System.in);
			
			boolean attendiInput = true;
			do {
				/* Stampa il messaggio che accompagna la richiesta di input*/
				System.out.printf(messaggio, directory, nomeFileDestinazione);
				
				/* Prende la linea di input digitata dall'utente */
				String line = input.nextLine();
				
				/* Se il testo di quella linea è "no", a meno di capitalizzazioni... */
				if(line.equalsIgnoreCase("no")) {
					scrivi = false;
					attendiInput = false; //causa uscita dal ciclo
				} else if(line.equalsIgnoreCase("si")) {
					/* Se invece il testo è si... */
					scrivi = true;
					attendiInput = false; //causa uscita dal ciclo
				}
			} while(attendiInput);
		}
		
		/* Se il file di destinazione non esiste allora scrivi vale "true" in
		partenza. Se il file di destinazione esiste allora scrivi vale, per effetto
		del ciclo di input, "true" se l'utente abbia digitato si, "false" se l'utente
		abbia digitato no. */
		if(scrivi) {
			copiaFile(directory, nomeFileSorgente, nomeFileDestinazione);
			System.out.printf("File copiato.%n");
		} else {
			System.out.printf("Operazione annullata.%n");
		}
	}
	
	/**Questo è il metodo che copia il file nomeFile, nella directory
	directory, sul file nomeCopia, nella stessa directory */
	private static void copiaFile(String directory, String nomeFile,
		String nomeCopia) throws IOException
	{
		/** Crea un riferimento al file da copiare */
		File fileDaCopiare = new File(directory + File.separator + nomeFile);
		
		/** Crea un riferimento al file su cui copiare. Non crea il file: il file
		vero e proprio è creato da FileChannel quando si inizierà a scrivere. */
		File nuovoFile = new File(directory + File.separator + nomeCopia);
		
		/** Canale da cui provengono i byte da copiare */
		FileChannel in = null;
		
		/** Canale da cui usciranno i byte */
		FileChannel out = null;
		try {
			/** Apre un canale sul file da copiare */
			in = new FileInputStream(fileDaCopiare).getChannel();
			
			/** Apre un canale in uscita sul file copiato */
			out = new FileOutputStream(nuovoFile).getChannel();
			
			/** Copia tutti i byte del file in entrata sul file in uscita */
			long byteScritti = 0;
			long byteTotali = in.size();
			while(byteScritti < byteTotali) {
				byteScritti += out.transferFrom(in, byteScritti, byteTotali);
			}
		} finally {
			close(in, out);
		}
	}
	
	private static void close(Channel in, Channel out) throws IOException {
		try {
			if(in != null) in.close();
		} finally {
			if(out != null) out.close();
		}
	}
}
Se per caso è il codice di un esercizio scolastico non incollare quello che ho scritto perchè ti beccano subito.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2007, 10:22   #7
int_double
Junior Member
 
Iscritto dal: May 2007
Messaggi: 7
PGI-Bis sei grande!
grazie tanto
int_double è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto SONY BRAVIA 8 II e BRAVIA Theatre System 6: il c...
KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo KTC H27E6 a 300Hz e 1ms: come i rivali ma a met&...
Grazie ai dati di ESA il calcolo della t...
Rilasciati nuovi video e immagini della ...
Gli astronauti cinesi di Shenzhou-20 son...
Mai così tanti gas serra: il 2025...
Google condannata in Germania: favorito ...
Ubisoft rimanda i risultati finanziari e...
ADATA porta i primi moduli DDR5 CUDIMM 4...
Bob Iger anticipa le novità AI di...
Microsoft Teams 'spierà' i dipend...
Michael Burry chiude Scion e fa di nuovo...
Huawei prepara i nuovi Mate 80: fino a 2...
Una e-Mountain Bike di qualità ma...
Tutte le offerte Amazon Black Friday pi&...
DJI Mini 4K Fly More Combo con 3 batteri...
Crollo di prezzo sui nuovissimi iPhone A...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v