JavaRush /Java Blog /Random-IT /Pausa caffè #229. Come lavorare con file e Input/Output i...

Pausa caffè #229. Come lavorare con file e Input/Output in Java. Metodi di utilità della classe Objects

Pubblicato nel gruppo Random-IT

Come lavorare con file e Input/Output in Java

Fonte: Medium Questo tutorial spiega come creare, leggere, scrivere ed eliminare file in Java. Imparerai anche come funzionano le classi File , InputStream e OutputStream . Pausa caffè #229.  Come lavorare con file e Input/Output in Java.  Metodi di utilità della classe Objects - 1

introduzione

In Java, i file sono rappresentati dalla classe File . La classe File fornisce metodi per creare, leggere, scrivere ed eliminare file. L'input/output (I/O) è il processo di trasferimento dei dati tra un programma e una fonte esterna, come un file, un socket di rete o una console. Java fornisce molte classi per input/output, incluse le classi InputStream e OutputStream .

Creazione di file

Per creare un file, puoi utilizzare il metodo File.createNewFile() . Creerà un nuovo file se non esiste già un file con lo stesso nome. Se tale file esiste già, il metodo createNewFile() lancerà una IOException . Ecco un esempio di come creare un nuovo file chiamato myfile.txt nella directory corrente:
File myFile = new File("myfile.txt");
myFile.createNewFile();

Lettura di file

Per leggere un file in Java, puoi utilizzare la classe FileInputStream . Fornisce metodi per leggere byte da un file. Per leggere il contenuto di un file, dovresti usare il metodo read() . Questo metodo legge un byte da un file e restituisce il valore del byte. Ad esempio, il codice seguente legge il contenuto del file myfile.txt e lo stampa sulla console:
File myFile = new File("myfile.txt");
FileInputStream inputStream = new FileInputStream(myFile);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
    System.out.print(new String(buffer, 0, bytesRead));
}
inputStream.close();

Registrazione di file

Per scrivere su un file, puoi utilizzare la classe FileOutputStream . Fornisce metodi per scrivere byte in un file. Per scrivere il contenuto di una stringa in un file, utilizzare il metodo write() . Questo metodo scrive il numero specificato di byte da un array specificato in un file. Ecco un esempio di come viene scritta la stringa “Hello, world!”. al file miofile.txt :
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();

Eliminazione di file

Per eliminare un file in Java, dovresti utilizzare il metodo File.delete() . Se il file che desideri eliminare non esiste, il metodo delete() restituirà false . Ecco un esempio di codice che elimina il file myfile.txt :
File myFile = new File("myfile.txt");
myFile.delete();

Conclusione

In questo post abbiamo discusso le nozioni di base per lavorare con file e I/O Java. Hai imparato come creare, leggere, scrivere ed eliminare file. Hai anche appreso della classe File e delle classi InputStream e OutputStream .

Metodi di utilità della classe Objects: come lavorare con essi

Fonte: Inside Java Con questo post migliorerai la tua conoscenza dei vari metodi forniti nella classe Objects . La classe Objects in Java dispone di molti metodi di utilità che semplificano l'esecuzione di una varietà di operazioni sugli oggetti. La classe Objects ha subito diversi aggiornamenti nelle versioni JDK : ci sono stati aggiornamenti molto significativi in ​​JDK 8 e 9 e aggiornamenti minori in JDK 16 e 19. Diamo un'occhiata a come è possibile utilizzare la classe Objects .

Confronto di oggetti

Oggetti fornisce diverse opzioni per confrontare i valori di due oggetti. Il vantaggio principale dell'utilizzo dell'implementazione Objects è la sicurezza contro le occorrenze nulle .

equivale()

Di seguito è riportato un esempio di confronto di due record.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime copyOfbilly =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
nullValue.equals(billy);//NPE
Objects.equals(nullValue, billy);// false
Objects.equals(billy, nicolai);// false
Objects.equals(billy, copyOfbilly);// true

profondoUguale()

Nella classe Objects , puoi anche utilizzare deepEquals() per confrontare due array . A differenza del normale equals() , questo confronterà i valori memorizzati negli array, il che dovrebbe portare a risultati più coerenti. Fondamentalmente questo metodo passa attraverso Arrays.deepEquals() .
record RaceTime(String runnerName, Duration time) {}

RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

RaceTime[] raceTimes1 = new RaceTime[] { billy, nicolai };
RaceTime[] raceTimes2 = new RaceTime[] { billy, nicolai };

Objects.equals(raceTimes1, raceTimes2);// false
Objects.deepEquals(raceTimes1, raceTimes2);// true

confrontare()

Objects ha anche un metodo compare() , che può accettare due oggetti e un Comparator<T> . Il metodo compare() è uno dei pochi metodi null -unsafe in Objects perché non ha un rendimento accettabile se uno dei suoi argomenti è null .
record RaceTime(String runnerName, Duration time) {}
class RaceTimeComparator implements Comparator<RaceTime> {
@Override
public int compare(RaceTime o1, RaceTime o2) {
	return o1.time.compareTo(o2.time);
}
}
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.compare(billy, nicolai, new RaceTimeComparator());//-1
Objects.compare(null, nicolai, new RaceTimeComparator());//NPE

Stringa e HashCode

La classe Objects fornisce metodi per convertire un oggetto in valori String e HashCode . Ancora una volta, il vantaggio principale di questi metodi è che sono protetti da occorrenze nulle .

Converti in stringa

Uno dei metodi più interessanti è toString(obj, nullDefault) , che fornisce un valore predefinito se si verifica un errore. Ciò significa che toIdentityString(obj) restituisce toString() e hashCode() degli oggetti passati come se nessuno di questi metodi fosse stato sovrascritto.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.toString(billy);//RaceTime[runnerName=Billy Korando, time=PT1M30S]
Objects.toString(nullValue);//null
Objects.toString(nullValue, "Did not finish");//Did not finish
Objects.toIdentityString(billy);//ObjectsExamples$1RaceTime@251a69d7

Converti in HashCode

Objects fornisce anche metodi per convertire un oggetto nel suo valore di codice hash.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.hashCode(nullValue);//0
Objects.hashCode(billy);//[HashValue]
Objects.hash(billy, nicolai);//[HashValue]

Controllo nullo

La classe Objects fornisce diversi metodi per verificare e gestire null .

Lanciare NullPointException su null

Il metodo requireNonNull(obj) genererà una NullPointException se il valore passato è null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName);
		time = Objects.requireNonNull(time);
	}
}

Lanciare NullPointException su null con un messaggio per l'utente

Il metodo requireNonNull(obj, String) genererà un errore NullPointException con un messaggio all'utente se il valore passato è null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, "runner name required!");
		time = Objects.requireNonNull(time, "race time required!");
	}
}

Restituisce il valore predefinito per null

Il metodo requireNonNullElse(obj, defaultValue) restituirà il defaultValue passato se obj è null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
		time = Objects.requireNonNullElse(time, Duration.ZERO);
	}
}

Utilizzo dei fornitori

La classe Objects fornisce inoltre i metodi requireNonNull(obj, Supplier<String>) e T requireNonNullElseGet(T, Supplier<T>) , che possono essere utilizzati per fornire un messaggio o un valore predefinito. Dovrebbero essere utilizzati solo se la creazione di un messaggio o di un valore predefinito avrebbe un impatto significativo sulle prestazioni.
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameMsgSupplier = () -> "runner name required!";
static Supplier<String> noTimeMsgSupplier = () -> "race time required!";
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, noNameMsgSupplier);
		time = Objects.requireNonNull(time, noTimeMsgSupplier);
	}
}
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameValueSupplier = () -> "John Smith";
static Supplier<Duration> noTimeValueSupplier = () -> Duration.ZERO;
	RaceTime{
		runnerName = Objects.requireNonNullElseGet(runnerName, noNameValueSupplier);
		time = Objects.requireNonNullElseGet(time, noTimeValueSupplier);
	}
}

Controllo nullo predittivo

Gli oggetti forniscono il controllo null da utilizzare nei predicati, sebbene possano essere utilizzati anche in altri scenari.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
Objects.nonNull(nullValue);//false
Objects.isNull(nullValue);//true

Controllo dell'indice

Infine, la classe Objects fornisce diverse opzioni per controllare la posizione dell'indice quando si attraversa un File , String , Collection o un oggetto simile. Alcuni di questi metodi sono stati recentemente aggiunti a JDK 16.
int checkIndex(int index, int length)

int checkFromToIndex(int fromIndex, int toIndex, int length)

int checkFromIndexSize(int fromIndex, int size, int length)

long checkIndex(long index, long length)

long checkFromToIndex(long fromIndex, long toIndex, long length)

long checkFromIndexSize(long fromIndex, long size, long length)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION