Jak pracować z plikami i operacjami wejścia/wyjścia w Javie
Źródło:
Medium Ten samouczek wyjaśnia, jak tworzyć, czytać, zapisywać i usuwać pliki w Javie. Dowiesz się także, jak działają klasy File , OutputStream i OutputStream .
Wstęp
W Javie pliki są reprezentowane przez klasę
File . Klasa
File udostępnia metody tworzenia, odczytywania, zapisywania i usuwania plików. Wejście/wyjście (I/O) to proces przesyłania danych pomiędzy programem a źródłem zewnętrznym, takim jak plik, gniazdo sieciowe lub konsola. Java udostępnia wiele klas wejścia/wyjścia, w tym klasy
InputStream i
OutputStream .
Tworzenie plików
Aby utworzyć plik, możesz użyć metody
File.createNewFile() . Utworzy nowy plik, jeśli plik o tej samej nazwie jeszcze nie istnieje. Jeśli taki plik już istnieje, metoda
createNewFile() zgłosi wyjątek
IOException . Oto przykład tworzenia nowego pliku o nazwie
myfile.txt w bieżącym katalogu:
File myFile = new File("myfile.txt");
myFile.createNewFile();
Czytanie plików
Aby odczytać plik w Javie, możesz użyć klasy
FileInputStream . Zapewnia metody odczytu bajtów z pliku. Aby odczytać zawartość pliku należy skorzystać z metody
read() . Ta metoda odczytuje jeden bajt z pliku i zwraca wartość tego bajtu. Na przykład poniższy kod odczytuje zawartość pliku
myfile.txt i drukuje go na konsoli:
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();
Nagrywanie plików
Aby zapisać do pliku, możesz użyć klasy
FileOutputStream . Zapewnia metody zapisywania bajtów do pliku. Aby zapisać zawartość ciągu znaków do pliku, użyj metody
write() . Ta metoda zapisuje określoną liczbę bajtów z określonej tablicy do pliku. Oto przykład zapisu ciągu „Hello, world!”. do pliku
myfile.txt :
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();
Usuwanie plików
Aby usunąć plik w Javie, należy skorzystać z metody
File.delete() . Jeśli plik, który chcesz usunąć, nie istnieje, metoda
usuwania() zwróci
wartość false . Oto przykład kodu usuwającego plik
myfile.txt :
File myFile = new File("myfile.txt");
myFile.delete();
Wniosek
W tym poście omówiliśmy podstawy pracy z plikami i I/O Java. Nauczyłeś się tworzyć, czytać, zapisywać i usuwać pliki. Poznałeś także klasę
File oraz klasy
InputStream i
OutputStream .
Metody użytkowe klasy Objects - jak z nimi pracować
Źródło:
Inside Java Dzięki temu wpisowi poszerzysz swoją wiedzę na temat różnych metod dostępnych w klasie Objects . Klasa
Objects w Javie posiada wiele metod użytkowych, które ułatwiają wykonywanie różnorodnych operacji na obiektach.
Klasa Objects przeszła kilka aktualizacji w wydaniach JDK : bardzo istotne aktualizacje pojawiły się w JDK 8 i 9 oraz mniejsze aktualizacje w JDK 16 i 19. Przyjrzyjmy się, jak można używać klasy
Objects .
Porównanie obiektów
Obiekty udostępnia kilka opcji porównywania wartości dwóch obiektów. Kluczową zaletą stosowania implementacji
Objects jest bezpieczeństwo przed wystąpieniami
null .
równa się()
Poniżej znajduje się przykład porównania dwóch rekordów.
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);
głębokieEquals()
W klasie
Objects możesz także użyć funkcji deepEquals() do porównania dwóch tablic . W przeciwieństwie do zwykłego
równania() , spowoduje to porównanie wartości przechowywanych w tablicach, co powinno prowadzić do bardziej spójnych wyników. Zasadniczo ta metoda przechodzi przez
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);
porównywać()
Obiekty mają również metodę
Compare() , która może przyjąć dwa obiekty i
Comparator<T> . Metoda
Compare() jest jedną z niewielu metod
null -unsafe w
obiektach , ponieważ nie daje akceptowalnego zwrotu, jeśli jeden z jej argumentów ma wartość
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());
Ciąg i HashCode
Klasa Objects udostępnia metody konwertowania obiektu na wartości String i HashCode . Ponownie, główną zaletą tych metod jest to, że są one bezpieczne przed wystąpieniami zerowymi .
Konwertuj na ciąg
Jedną z bardziej interesujących metod jest
toString(obj, nullDefault) , która podaje wartość domyślną w przypadku wystąpienia błędu. Oznacza to, że
toIdentityString(obj) zwraca
toString() i
hashCode() przekazanych obiektów tak, jakby żadna z tych metod nie została nadpisana.
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);
Konwertuj na HashCode
Obiekty udostępniają także metody konwersji obiektu na jego wartość kodu skrótu.
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);
Sprawdzanie wartości null
Klasa
Objects udostępnia kilka metod sprawdzania i obsługi
null .
Zgłaszanie wyjątku NullPointException na null
Metoda
requireNonNull(obj) zgłosi
wyjątek NullPointException , jeśli przekazana wartość to
null .
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNull(runnerName);
time = Objects.requireNonNull(time);
}
}
Zgłaszanie wyjątku NullPointException na null z komunikatem do użytkownika
Metoda
requireNonNull(obj, String) zgłosi błąd
NullPointException z komunikatem do użytkownika, jeśli przekazana wartość to
null .
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNull(runnerName, "runner name required!");
time = Objects.requireNonNull(time, "race time required!");
}
}
Zwróć wartość domyślną dla wartości null
Metoda
requireNonNullElse(obj, defaultValue) zwróci przekazaną
wartość defaultValue , jeśli
obj ma
wartość null .
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
time = Objects.requireNonNullElse(time, Duration.ZERO);
}
}
Korzystanie z dostawców
Klasa
Objects udostępnia także metody
requireNonNull(obj, Dostawca<String>) i
T requireNonNullElseGet(T, Dostawca<T>) , których można użyć do dostarczenia komunikatu lub wartości domyślnej. Należy ich używać tylko wtedy, gdy utworzenie komunikatu lub wartości domyślnej miałoby znaczący wpływ na wydajność.
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);
}
}
Predykcyjna kontrola zerowa
Obiekty zapewniają sprawdzanie wartości
null do użycia w predykatach, chociaż można go również używać w innych scenariuszach.
record RaceTime(String runnerName, Duration time) {}
RaceTime nullValue = null;
Objects.nonNull(nullValue);
Objects.isNull(nullValue);
Kontrola indeksu
Na koniec klasa
Objects udostępnia kilka opcji sprawdzania pozycji indeksu podczas przechodzenia przez obiekt
File ,
String ,
Collection lub podobny. Niektóre z tych metod zostały niedawno dodane do 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