JavaRush /Blog Java /Random-ES /Pausa para el café #229. Cómo trabajar con archivos y Ent...

Pausa para el café #229. Cómo trabajar con archivos y Entrada/Salida en Java. Métodos de utilidad de la clase Objetos.

Publicado en el grupo Random-ES

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 . Pausa para el café #229.  Cómo trabajar con archivos y Entrada/Salida en Java.  Métodos de utilidad de la clase Objetos - 1

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);//NPE
Objects.equals(nullValue, billy);// false
Objects.equals(billy, nicolai);// false
Objects.equals(billy, copyOfbilly);// true

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);// false
Objects.deepEquals(raceTimes1, raceTimes2);// true

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());//-1
Objects.compare(null, nicolai, new RaceTimeComparator());//NPE

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);//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

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);//0
Objects.hashCode(billy);//[HashValue]
Objects.hash(billy, nicolai);//[HashValue]

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);//false
Objects.isNull(nullValue);//true

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)
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION