Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Abbiamo giocato a lungo a Battlefield 6, abbiamo provato tutte le modalità multiplayer, Redsec, e le numerose personalizzazioni. In sintesi, ci siamo concentrati su ogni aspetto del titolo per comprendere al meglio uno degli FPS più ambiziosi della storia dei videogiochi e, dopo quasi due mesi, abbiamo tirato le somme. In questo articolo, condividiamo con voi tutto ciò che è Battlefield 6, un gioco che, a nostro avviso, rappresenta esattamente ciò che questo genere attendeva da tempo
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
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


Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando Due mesi di Battlefield 6: dalla campagna al bat...
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Porsche Taycan 2027 elettrica con cambio...
Roscosmos: stazione spaziale russa ROS a...
Auto 2035, sei governi UE (c'è l'...
Chernobyl: la cupola di contenimento non...
SSD come CPU: queste memorie sono in gra...
La previsione di CATL: barche elettriche...
Stangata in arrivo: PC e notebook coster...
Lian Li si è inventata il primo a...
Amazon in raptus sconti: ogni 24 ore nov...
44 idee regalo sotto i 50€: con le offer...
Super Sconti Amazon Haul: ribassi fino a...
Cloudflare ha bloccato 416 miliardi di r...
Prezzo mai visto: POCO F7 12/256GB in su...
Svuotano tutto: super sconto su due scop...
Warner-Netflix, l'accordo riaccende le s...
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: 15:29.


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