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 .
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);
Objects.equals(nullValue, billy);
Objects.equals(billy, nicolai);
Objects.equals(billy, copyOfbilly);
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);
Objects.deepEquals(raceTimes1, raceTimes2);
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());
Objects.compare(null, nicolai, new RaceTimeComparator());
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);
Objects.toString(nullValue);
Objects.toString(nullValue, "Did not finish");
Objects.toIdentityString(billy);
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);
Objects.hashCode(billy);
Objects.hash(billy, nicolai);
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);
Objects.isNull(nullValue);
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)
GO TO FULL VERSION