Cómo trabajar con archivos y Entrada/Salida en Java
Fuente:
Medio Este tutorial explica cómo crear, leer, escribir y eliminar archivos en Java. También aprenderá cómo funcionan las clases File , InputStream y OutputStream .
Introducción
En Java, los archivos están representados por la clase
Archivo . La clase
Archivo proporciona métodos para crear, leer, escribir y eliminar archivos. Entrada/salida (E/S) es el proceso de transferir datos entre un programa y una fuente externa, como un archivo, un socket de red o una consola. Java proporciona muchas clases para entrada/salida, incluidas las clases
InputStream y
OutputStream .
Creando archivos
Para crear un archivo, puede utilizar el método
File.createNewFile() . Creará un nuevo archivo si aún no existe un archivo con el mismo nombre. Si dicho archivo ya existe, el método
createNewFile() generará una
IOException . A continuación se muestra un ejemplo de cómo crear un nuevo archivo llamado
myfile.txt en el directorio actual:
File myFile = new File("myfile.txt");
myFile.createNewFile();
Leyendo archivos
Para leer un archivo en Java, puede utilizar la clase
FileInputStream . Proporciona métodos para leer bytes de un archivo. Para leer el contenido de un archivo, debe utilizar el método
read() . Este método lee un byte de un archivo y devuelve el valor del byte. Por ejemplo, el siguiente código lee el contenido del archivo
myfile.txt y lo imprime en la consola:
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();
Grabar archivos
Para escribir en un archivo, puede utilizar la clase
FileOutputStream . Proporciona métodos para escribir bytes en un archivo. Para escribir el contenido de una cadena en un archivo, utilice el método
write() . Este método escribe el número especificado de bytes de una matriz especificada en un archivo. A continuación se muestra un ejemplo de cómo se escribe la cadena "¡Hola, mundo!". al archivo
myfile.txt :
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();
Eliminar archivos
Para eliminar un archivo en Java, debe utilizar el método
File.delete() . Si el archivo que desea eliminar no existe, entonces el método
eliminar() devolverá
falso . A continuación se muestra un ejemplo de código que elimina el archivo
myfile.txt :
File myFile = new File("myfile.txt");
myFile.delete();
Conclusión
En esta publicación, analizamos los conceptos básicos del trabajo con archivos y E/S Java. Aprendiste a crear, leer, escribir y eliminar archivos. También aprendió sobre la clase
File y
las clases InputStream y
OutputStream .
Métodos de utilidad de la clase Objetos: cómo trabajar con ellos
Fuente:
Inside Java Con esta publicación, mejorará su conocimiento de los diversos métodos proporcionados en la clase Objetos . La clase
Objetos en Java tiene muchos métodos de utilidad que facilitan la realización de una variedad de operaciones en objetos.
La clase Objetos ha sufrido varias actualizaciones en las versiones de JDK : ha habido actualizaciones muy importantes en JDK 8 y 9, y actualizaciones menores en JDK 16 y 19. Veamos cómo se puede utilizar
la clase Objetos .
Comparación de objetos
Objetos ofrece varias opciones para comparar los valores de dos objetos. El beneficio clave de utilizar
la implementación de Objetos es la seguridad contra ocurrencias
nulas .
es igual()
A continuación se muestra un ejemplo de comparación de dos registros.
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);
profundoEquals()
En la clase
Objetos , también puedes usar deepEquals() para comparar dos matrices .
A diferencia del equals() normal , esto comparará los valores almacenados en matrices, lo que debería conducir a resultados más consistentes. Básicamente, este método pasa por
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);
comparar()
Objects también tiene un método
compare() , que puede tomar dos objetos y
un Comparator<T> . El método
compare() es uno de los pocos métodos
nulos inseguros en
Objetos porque no tiene un retorno aceptable si uno de sus argumentos es
nulo .
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());
Cadena y código hash
La clase Objetos proporciona métodos para convertir un objeto a valores String y HashCode . Nuevamente, la principal ventaja de estos métodos es que están a salvo de ocurrencias nulas .
Convertir a cadena
Uno de los métodos más interesantes es
toString(obj, nullDefault) , que proporciona un valor predeterminado si ocurre un error. Esto significa que
toIdentityString(obj) devuelve
toString() y
hashCode() de los objetos pasados como si ninguno de estos métodos se hubiera sobrescrito.
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);
Convertir a código hash
Objetos también proporciona métodos para convertir un objeto a su valor de código 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);
Comprobando nulo
La clase
Objetos proporciona varios métodos para comprobar y manejar
valores nulos .
Lanzando NullPointException en nulo
El método
requireNonNull(obj) generará
una NullPointException si el valor pasado es
nulo .
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNull(runnerName);
time = Objects.requireNonNull(time);
}
}
Lanzar NullPointException en nulo con un mensaje para el usuario
El método
requireNonNull(obj, String) generará un error
NullPointException con un mensaje al usuario si el valor pasado es
nulo .
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNull(runnerName, "runner name required!");
time = Objects.requireNonNull(time, "race time required!");
}
}
Devuelve el valor predeterminado para nulo
El método
requireNonNullElse(obj, defaultValue) devolverá el
valor predeterminado pasado si
obj es
nulo .
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
time = Objects.requireNonNullElse(time, Duration.ZERO);
}
}
Uso de proveedores
La clase
Objetos también proporciona los métodos requireNonNull(obj, Supplier<String>) y
T requireNonNullElseGet(T, Supplier<T>) , que se pueden usar para proporcionar un mensaje o un valor predeterminado. Solo deben usarse si la creación de un mensaje o valor predeterminado tendría un impacto significativo en el rendimiento.
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);
}
}
Verificación nula predictiva
Objetos proporciona verificación
de nulos para su uso en predicados, aunque también se puede usar en otros escenarios.
record RaceTime(String runnerName, Duration time) {}
RaceTime nullValue = null;
Objects.nonNull(nullValue);
Objects.isNull(nullValue);
verificación de índice
Finalmente, la clase
Objetos proporciona varias opciones para verificar la posición del índice al atravesar
un Archivo ,
Cadena ,
Colección o un objeto similar. Algunos de estos métodos se agregaron recientemente al 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