JavaRush /Blogue Java /Random-PT /Pausa para café #229. Como trabalhar com arquivos e Entra...

Pausa para café #229. Como trabalhar com arquivos e Entrada/Saída em Java. Métodos utilitários da classe Objects

Publicado no grupo Random-PT

Como trabalhar com arquivos e entrada/saída em Java

Fonte: Médio Este tutorial explica como criar, ler, escrever e excluir arquivos em Java. Você também aprenderá como funcionam as classes File , InputStream e OutputStream . Pausa para café #229.  Como trabalhar com arquivos e Entrada/Saída em Java.  Métodos utilitários da classe Objects - 1

Introdução

Em Java, os arquivos são representados pela classe File . A classe File fornece métodos para criar, ler, gravar e excluir arquivos. Entrada/saída (E/S) é o processo de transferência de dados entre um programa e uma fonte externa, como um arquivo, soquete de rede ou console. Java fornece muitas classes para entrada/saída, incluindo as classes InputStream e OutputStream .

Criando arquivos

Para criar um arquivo, você pode usar o método File.createNewFile() . Ele criará um novo arquivo se ainda não existir um arquivo com o mesmo nome. Se tal arquivo já existir, o método createNewFile() lançará um IOException . Aqui está um exemplo de como criar um novo arquivo chamado myfile.txt no diretório atual:
File myFile = new File("myfile.txt");
myFile.createNewFile();

Lendo arquivos

Para ler um arquivo em Java, você pode usar a classe FileInputStream . Ele fornece métodos para leitura de bytes de um arquivo. Para ler o conteúdo de um arquivo, você deve usar o método read() . Este método lê um byte de um arquivo e retorna o valor do byte. Por exemplo, o código a seguir lê o conteúdo do arquivo myfile.txt e o imprime no 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();

Gravando arquivos

Para gravar em um arquivo, você pode usar a classe FileOutputStream . Ele fornece métodos para gravar bytes em um arquivo. Para escrever o conteúdo de uma string em um arquivo, use o método write() . Este método grava o número especificado de bytes de uma matriz especificada em um arquivo. Aqui está um exemplo de como a string “Hello, world!” é escrita. para o arquivo meuarquivo.txt :
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();

Excluindo arquivos

Para excluir um arquivo em Java, você deve usar o método File.delete() . Se o arquivo que você deseja excluir não existir, o método delete() retornará false . Aqui está um exemplo de código que exclui o arquivo myfile.txt :
File myFile = new File("myfile.txt");
myFile.delete();

Conclusão

Neste post, discutimos os fundamentos do trabalho com arquivos e E/S Java. Você aprendeu como criar, ler, gravar e excluir arquivos. Você também aprendeu sobre a classe File e as classes InputStream e OutputStream .

Métodos utilitários da classe Objects - como trabalhar com eles

Fonte: Inside Java Com este post, você irá aprimorar seu conhecimento sobre os diversos métodos fornecidos na classe Objects . A classe Objects em Java possui muitos métodos utilitários que facilitam a execução de uma variedade de operações em objetos. A classe Objects passou por diversas atualizações nas versões do JDK : houve atualizações muito significativas no JDK 8 e 9, e pequenas atualizações no JDK 16 e 19. Vejamos como você pode usar a classe Objects .

Comparação de objetos

Objects oferece várias opções para comparar os valores de dois objetos. O principal benefício de usar a implementação Objects é a segurança contra ocorrências nulas .

é igual a()

Abaixo está um exemplo de comparação de dois 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

deepEquals()

Na classe Objects , você também pode usar deepEquals() para comparar dois arrays . Ao contrário de equals() regular , isso comparará valores armazenados em arrays, o que deve levar a resultados mais consistentes. Fundamentalmente este método passa 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 também possui um método compare() , que pode receber dois objetos e um Comparator<T> . O método compare() é um dos poucos métodos null -unsafe em Objects porque não tem retorno aceitável se um de seus argumentos for 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

String e HashCode

A classe Objects fornece métodos para converter um objeto em valores String e HashCode . Novamente, a principal vantagem desses métodos é que eles estão protegidos contra ocorrências nulas .

Converter em string

Um dos métodos mais interessantes é toString(obj, nullDefault) , que fornece um valor padrão se ocorrer um erro. Isso significa que toIdentityString(obj) retorna toString() e hashCode() dos objetos passados ​​como se nenhum desses métodos tivesse sido substituído.
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

Converter para HashCode

Objects também fornece métodos para converter um objeto em seu 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]

Verificando nulo

A classe Objects fornece vários métodos para verificar e tratar null .

Lançando NullPointException em null

O método requireNonNull(obj) lançará uma NullPointException se o valor passado for null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName);
		time = Objects.requireNonNull(time);
	}
}

Lançando NullPointException em null com uma mensagem para o usuário

O método requireNonNull(obj, String) lançará um erro NullPointException com uma mensagem para o usuário se o valor passado for null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, "runner name required!");
		time = Objects.requireNonNull(time, "race time required!");
	}
}

Retornar valor padrão para nulo

O método requireNonNullElse(obj, defaultValue) retornará o defaultValue passado se obj for null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
		time = Objects.requireNonNullElse(time, Duration.ZERO);
	}
}

Usando fornecedores

A classe Objects também fornece os métodos requireNonNull(obj, Supplier<String>) e T requireNonNullElseGet(T, Supplier<T>) , que podem ser usados ​​para fornecer uma mensagem ou um valor padrão. Eles só deverão ser usados ​​se a criação de uma mensagem ou valor padrão tiver um impacto significativo no desempenho.
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);
	}
}

Verificação nula preditiva

Objects fornece verificação de nulos para uso em predicados, embora também possa ser usado em outros cenários.
record RaceTime(String runnerName, Duration time) {}

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

Verificação de índice

Finalmente, a classe Objects oferece diversas opções para verificar a posição do índice ao percorrer um File , String , Collection ou objeto semelhante. Alguns desses métodos foram adicionados recentemente ao 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)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION