Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Arianespace potrebbe lanciare il primo r...
Google Pixel 10a disponibile al prezzo m...
Microsoft Copilot nei guai: email riserv...
AOC a 399€ su Amazon: QD-OLED 240 Hz e 0...
La Cina ha recuperato dal mare il primo ...
Boeing CST-100 Starliner: la NASA rende ...
hiop e TaDa uniscono le forze per trasfo...
Thermal Grizzly mostra il Ryzen 7 9850X3...
AMD Ryzen 'Olympic Ridge' Zen 6 per desk...
Donald Trump renderà pubbliche in...
Prezzo mai visto da mesi: ECOVACS DEEBOT...
Non solo S26, Samsung sta per lanciare a...
Windows 11 avrà a breve uno Speed...
Ask Intel: l'assistente IA che ti aiuta ...
Nasce Freedom.gov: il portale USA per ag...
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: 06:24.


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