basic i o operations java
W tym samouczku wideo omówimy mechanizm Java Input-Output, taki jak Java User Input, InputStream, Java Printf, Println itp. Ze standardowymi urządzeniami we / wy:
W każdym języku programowania musimy mieć mechanizm odczytywania danych wejściowych, a także wysyłania przetworzonych danych, zwanych również danymi wyjściowymi, do użytkownika końcowego.
Jak wiesz, w świecie oprogramowania istnieje wiele urządzeń wejściowych i wyjściowych, których programiści mogą używać do odczytywania i zapisywania lub wyprowadzania danych.
Przeczytaj nasze Kompletna seria szkoleń Java aby uzyskać lepszy wgląd w koncepcje języka Java.
Czego się nauczysz:
- Samouczek wideo dotyczący podstawowych operacji we / wy w języku Java
- Dodatkowe przykłady - strumienie wejścia / wyjścia
- Wniosek
Samouczek wideo dotyczący podstawowych operacji we / wy w języku Java
Za pomocą programu w języku Java można odczytywać i zapisywać dane z różnych źródeł i miejsc docelowych. Czytanie i zapisywanie źródeł danych i miejsc docelowych obejmują:
- Akta
- Rury
- Połączenia sieciowe
- Bufory w pamięci ( Na przykład: tablice)
- System.in, System.out, System.error
W tym samouczku wideo będziemy mieć dane wejściowe w postaci pliku i eksplorować różne klasy, interfejsy i metody, które są dostępne do odczytu danych z pliku.
Podstawowe operacje we / wy w Javie:
Operacje na plikach Java:
Java I / O (Input-Output) to standardowy mechanizm przetwarzający dane wejściowe i generujący dane wyjściowe. Pakiet „java.io” zawiera metody służące do wykonywania wszystkich operacji wejścia i wyjścia.
Aby szybciej wykonywać operacje we / wy, Java wykorzystuje koncepcję strumieni. Strumień można zdefiniować jako sekwencję danych składającą się z bajtów.
Dowiedzmy się więcej o strumieniach we / wy Java !!
Standardowe strumienie we / wy w języku Java
Język Java oferuje dostęp do zasobów systemowych, standardowych urządzeń wejścia-wyjścia itp. Za pomocą klasy „System”. Ta klasa implementuje interfejs programowania zależny od systemu w celu uzyskania dostępu do różnych zasobów.
Klasa System należy do pakietu Java „java.lang”. Oprócz dostarczania standardowych strumieni we / wy, klasa System zapewnia również dostęp do zmiennych środowiskowych, zmiennych zewnętrznych, wczytywania plików i bibliotek, a także do metody narzędziowej arrayCopy do kopiowania części tablicy.
Ponieważ ten samouczek jest oparty tylko na standardowym I / O, pominiemy tutaj resztę ułatwień zapewnianych przez klasę System.
Z punktu widzenia wejścia-wyjścia klasa System oferuje następujące strumienie:
# 1) Standardowy strumień wejściowy (System.in)
Strumień wejściowy dostarczany przez klasę System, System.in, służy do odczytywania danych wejściowych ze standardowego urządzenia wejściowego, takiego jak klawiatura.
Strumień pozostaje otwarty i jest gotowy do odczytu danych dostarczonych przez użytkownika do standardowego urządzenia wejściowego.
Poniższy przykład demonstruje funkcję System.in.read do odczytu pojedynczej cyfry całkowitej.
public class Main { public static void main(String args[]) throws java.io.IOException { int ch; System.out.println('Enter the character to be displayed : '); ch = System.in.read(); System.out.println('You entered : ' + (char)ch); } }
Wynik:
# 2) Standardowy strumień wyjściowy (System.out)
Interfejs System.out klasy System służy do zapisywania danych wyjściowych programu na standardowym urządzeniu wyjściowym, takim jak monitor. W większości przypadków interfejs System.out zapisuje dane wyjściowe polecenia na standardowe urządzenie wyjściowe.
Używa trzech metod z klasy „PrintStream”, ponieważ standardowe wyjście pochodzi z tej klasy.
Te metody to:
- wydrukować
- println
- pisać
Metody „print” i „println” mają tę samą funkcjonalność z wyjątkiem jednej różnicy polegającej na tym, że metoda println dodaje znak nowego wiersza ( n) do wyniku.
Metoda zapisu nie jest często używana, z wyjątkiem przypadków, gdy mają być wyświetlane dane inne niż ASCII.
Poniższy przykład ilustruje strumień System.out.
public class Main { public static void main(String args[]) throws java.io.IOException { String stringType = 'Java Tutorial Series'; char[] charTypeArray = { 'a', 'e', 'i', 'o', 'u' }; boolean booleanType = true; int integerType = 10; double doubleType = Math.PI; long longType = Long.MAX_VALUE; float floatType = Float.MIN_VALUE; System.out.println('String::' + stringType); System.out.print('Character::'); System.out.println(charTypeArray); System.out.println('Boolean::' + booleanType); System.out.println('Integer::' + integerType); System.out.println('Double::' + doubleType); System.out.println('Long::' + longType); System.out.println('Float::' + floatType); } }
Wynik:
Powyższy program pokazuje funkcje „print” i „println” używane z interfejsem System.out. Tutaj zdefiniowaliśmy zmienne o różnych typach danych i wyświetlamy każdą z nich za pomocą interfejsu System.out.
# 3) Standardowy strumień błędów (System.err)
Standardowy strumień błędów System.err jest używany do wyświetlania błędów, jeśli wystąpią podczas wykonywania programu.
Podobnie jak strumień System.out, strumień błędów obsługuje również trzy metody klasy PrintStream: print, println i writes.
Metody odczytu danych wejściowych z konsoli
Oprócz opisanego powyżej strumienia wejściowego istnieje kilka innych metod, za pomocą których możemy odczytać dane wejściowe z konsoli w Javie.
Metody te omówiono poniżej.
# 1) Klasa BufferedReader
Klasa BufferedReader została po raz pierwszy wprowadzona w JDK 1.0 i jest klasyczną metodą odczytu danych wejściowych z konsoli.
Strumień wejściowy (System.in) jest zawinięty wewnątrz klasy InputStreamReader, która z kolei jest opakowana w BufferedReader.
Poniższy program przedstawia użycie klasy BufferedReader do odczytywania danych wejściowych od użytkownika.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println('Enter the input string'); String name = reader.readLine(); System.out.println('You entered: ' + name); } }
Wynik:
W powyższym programie zadeklarowaliśmy obiekt klasy BufferedReader zainicjowany w strumieniu System.in. Korzystając z tego obiektu, czytamy cały wiersz danych wejściowych.
Jak widać, można odczytać całe zbuforowane dane, dzięki czemu ta funkcja jest bardzo wydajna. Jedyną wadą jest tajemniczy kod, który za każdym razem może być trudny do zapamiętania.
# 2) Klasa konsoli
Do odczytu danych wejściowych z konsoli można użyć klasy „System.console”. Służy do szczególnie odczytywania znaków wejściowych, takich jak hasło, z wiersza poleceń.
Metoda odczytu danych wejściowych za pomocą klasy konsoli jest obecnie najbardziej wydajną i preferowaną metodą w Javie.
Poniższy program demonstruje klasę System.console.
public class Main { public static void main(String[] args) { System.out.println('Enter the input string'); String name = System.console().readLine(); System.out.println('You entered: ' + name); } }
Wynik:
Używając klasy System.console, możesz czytać wprowadzone znaki bez ich powtarzania. Dlatego ta metoda jest bardziej przydatna do czytania haseł. Po drugie, możesz również użyć łańcuchów formatujących do formatowania danych wejściowych, podobnie do tych używanych w System.out.printf ().
Chociaż jest to preferowany sposób odczytu danych wejściowych, należy zauważyć, że klasa System.console nie może być używana w interaktywnym środowisku Java, takim jak IDE.
# 3) Skaner
Użycie klasy skanera do odczytu danych wejściowych jest prawdopodobnie najszybszą i preferowaną metodą. Skaner jest najczęściej używany do analizowania typów danych, w tym typów pierwotnych i ciągów. Ale może być również używany do odczytywania danych wejściowych i analizowania ich przy użyciu tokenizowanych danych wejściowych.
W tym celu klasa skanera używa wyrażeń regularnych.
Poniższy program odczytuje dane wejściowe od użytkownika za pomocą klasy skanera.
import java.util.Scanner; class Main { public static void main(String args[]) { Scanner myscan = new Scanner(System.in); System.out.println('Enter the input:'); String mystr = myscan.nextLine(); System.out.println('You entered a string:'+mystr); System.out.println('Enter Next input:'); int num = myscan.nextInt(); System.out.println('You entered an integer:'+num); } }
Wynik:
W powyższym programie użyliśmy klasy scanner do odczytania danych typu string i integer.
Formatowanie danych wyjściowych w Javie przy użyciu printf
Widzieliśmy już, jak wyświetlić dane wyjściowe w programie Java. W tej sekcji zobaczymy, jak sformatować ten wynik. W tym celu wykorzystujemy funkcję printf klasy „PrintStream” wraz ze strumieniem Java „System.out”.
C ++ struktura danych drzewa
Funkcja printf w Javie jest podobna do funkcji printf w C / C ++. W przeciwieństwie do funkcji System.out.print i System.out.println, które przyjmują jeden argument, System.out.printf przyjmuje więcej niż jeden argument.
Poniżej przedstawiono odmiany funkcji printf w Javie.
Nie | Prototyp funkcji | Opis |
---|---|---|
jeden | System.out.printf (string); | Wyświetla ciąg podany w argumencie bez formatowania |
dwa | System.out.printf (format, argumenty); | Drukuje dane wyjściowe przy użyciu określonego ciągu formatu „format” i argumentów. |
3 | System.out.printf (ustawienia regionalne, format, argumenty); | Drukuje dane wyjściowe przy użyciu określonego ciągu formatu, stosując ustawienia regionalne i argumenty. |
Zauważ, że funkcja System.out.format () jest taka sama jak System.out.printf ().
Ogólna składnia określająca ciąg formatu jest następująca:
%specifier => + for right-aligning, - for left-aligning. => to specify leading/trailing zeros and precision => suggests the data type.
Na przykład:
System.out.println(“ ‘%05.2f’%n”, 2.28);
Wygeneruje następujące dane wyjściowe:
„02,28”
Szczegółowo omówimy printf w Javie w dalszych tematach tego samouczka.
Często Zadawane Pytania
P # 1) Co to jest standardowe wejście i standardowe wyjście?
Odpowiedź: Standardowe strumienie wejściowe i wyjściowe są wstępnie połączonymi kanałami do komunikacji między programem komputerowym a środowiskiem zewnętrznym, gdy program rozpoczyna wykonywanie. Trzy różne standardowe strumienie we / wy to standardowe wejście (stdin), standardowe wyjście (stdout), standardowy błąd (stderr).
Pytanie nr 2) Co to jest standardowe wejście w programowaniu?
Odpowiedź: Standardowe wejście lub stdin to strumień używany do odczytu danych wejściowych ze standardowego urządzenia wejściowego, takiego jak klawiatura.
Pytanie nr 3) Co to jest strumień wejścia-wyjścia?
Odpowiedź: Strumień wejścia-wyjścia reprezentuje źródło, z którego odczytujesz dane wejściowe, oraz miejsce docelowe, do którego kierujesz dane wyjściowe.
Ogólnie strumień reprezentuje wiele urządzeń używanych jako źródło i miejsce docelowe, a mianowicie klawiaturę, plik dyskowy, monitory itp.
Pytanie 4) Co to jest standardowe wejście w Javie?
Odpowiedź: Standardowe dane wejściowe w Javie są dostarczane przez klasę System jako strumień System.in. Klasa System jest częścią pakietu java.lang.
Pytanie nr 5) Jakie są standardowe dane wyjściowe w języku Java?
Odpowiedź: Standardowe dane wyjściowe w języku Java są dostarczane przez klasę System jako strumień System.out. Klasa System jest częścią pakietu java.lang.
Dodatkowe przykłady - strumienie wejścia / wyjścia
Strumienie reprezentują przepływ danych, a dane mogą mieć dowolny format (np. Bajt, tekst, pierwotny typ danych itp.). Aby zapisać dane w miejscu docelowym, używany jest strumień wyjściowy, a do odczytu danych używany jest strumień wejściowy.
Różne formaty do czytania i pisania
Dane wejściowe / wyjściowe można odczytywać / zapisywać w następujących różnych formatach:
# 1) Odczytywanie pliku jako strumienia bajtów
Tutaj dane zostaną odczytane w formacie bajtów. „ FileInputStream ” i ' FileOutputStream „Klasy są używane do odczytywania zawartości jako bajtu. W ten sposób dla każdego bajtu kompilator wyśle żądanie do systemu operacyjnego.
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class ByteStreamsDemo { public static void main(String[] args) throws IOException { FileInputStream fin =null; FileOutputStream fout =null; try { fin=new FileInputStream('input.txt'); fout=new FileOutputStream('out.txt'); int c; while((c=fin.read() )!= -1) { fout.write(c); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(fin!=null) { fin.close(); }if(fout!=null) { fout.close(); } } } }
# 2) Odczytywanie pliku jako strumienia znaków
W ten sposób strumień wejściowy zostanie odczytany w formacie znakowym. Tak więc dla każdego znaku kompilator wyśle żądanie do systemu operacyjnego. „ FileReader ” i ' FileWriter ” klasy są przydatne do odczytywania treści jako znaku.
public class CharStreamDemo { public static void main(String[] args) throws IOException { FileReader input = null; FileWriter output = null; try { input = new FileReader('input.txt'); output = new FileWriter('out1.txt'); int c; while ((c = input.read()) != -1) { output.write(c); } } finally { if (input != null) { input.close(); } if (output != null) { output.close(); } } } }
# 3) Buforowanie strumienia wejściowego / wyjściowego
Gdy używasz klas FileInputStream lub FileReader, dla każdej operacji odczytu lub zapisu nowe żądanie zostanie wysłane do systemu operacyjnego. Może to więc prowadzić do problemów z wydajnością. Aby uniknąć tego BufferedInputStream lub BufferedReader, klasy są używane do zawijania niebuforowanych klas.
Odczytuje strumień wejściowy, gdy bufor jest pusty.
Podobnie, FileOutputStream lub FileWriter, klasy są opakowane za pomocą BufferedOutputStream lub BufferedWriter, aby zapisać dane wyjściowe po zapełnieniu buforu.
public class BufferedStreamDemo { public static void main(String[] args) throws IOException { BufferedReader input = null; BufferedWriter output = null; try { input = new BufferedReader(new FileReader('input.txt')); output = new BufferedWriter(new FileWriter('out1.txt')); int c; while ((c = input.read()) != -1) { output.write(c); } } finally { if (input != null) { input.close(); } if (output != null) { output.close(); } } } }
# 4) Czytanie jako strumień danych
W tej metodzie, DataInputStream lub DataOutputStream, klasy są używane do odczytywania i zapisywania zawartości jako prymitywnych typów danych, takich jak boolean, char, byte, short, int, long, float, double i String. Przeważnie DataInputStream i DataOutputStream będą używane razem.
public class DataInputOutputStreamDemo { public static void main(String[] args) { File file = new File('read.bin'); FileOutputStream fos = null; DataOutputStream dos = null; try { fos=new FileOutputStream(file); dos=new DataOutputStream(fos); dos.writeInt(50244); dos.writeDouble(400.253); dos.writeChar('d'); dos.flush(); } catch (IOException e) { e.printStackTrace(); }finally { try { if(fos!=null){ fos.close(); } if(dos!=null){ dos.close(); } } catch (Exception e) { e.printStackTrace(); } } /*Reading operation */ FileInputStream fis = null; DataInputStream dis = null; try { fis = new FileInputStream(file); dis = new DataInputStream(fis); System.out.println(dis.readInt()); System.out.println(dis.readDouble()); System.out.println(dis.readChar()); } catch (IOException e) { e.printStackTrace(); }finally { try { if(fis!=null){ fis.close(); } if(dis!=null){ dis.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
# 5) Czytanie jako strumień obiektów
ObjectInputStream / ObjectOutputStream, klasy są przydatne do zapisywania obiektów w pliku i odczytywania obiektów z pliku. W celu przechowywania obiektu w pliku klasa powinna implementować interfejs Serializable.
public class ObjectStreamDemo implements Serializable { int age ; String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Zamierzamy utworzyć obiekt dla tej klasy „ObjectStreamDemo” i zapiszemy ten obiekt do pliku i odczytać ten sam obiekt z tego pliku.
public class ObjectStreamDemoTest { public static void main(String[] args) { // TODO Auto-generated method stub ObjectStreamDemo obj=new ObjectStreamDemo(); obj.setAge(32); obj.setName('bob'); try { FileOutputStream fos = new FileOutputStream('t.tmp'); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(obj); oos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } FileInputStream fis; ObjectInputStream ois; try { fis = new FileInputStream('t.tmp'); ois = new ObjectInputStream(fis); ObjectStreamDemo obj1 = (ObjectStreamDemo)ois.readObject(); System.out.println(obj1.name); System.out.println(obj1.age); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } }
Operacje we / wy na plikach
Klasa pliku jest przydatna do wykonywania operacji na plikach.
Niektóre operacje na plikach wykonywane za pomocą klasy File obejmują:
- Utwórz plik
- Sprawdź, czy plik istnieje
- Uzyskaj ścieżkę do pliku
- Napisz plik
- Przeczytaj plik
- Usuń plik i zmień nazwę pliku
- Sprawdź uprawnienia do plików i zmień uprawnienia do plików
- Przenieś plik z jednego katalogu do innej lokalizacji
Program demonstracyjny do tworzenia, odczytu i zapisu pliku:
public class CreateFileDemo { public static void main(String[] args) throws IOException { File newfile=new File('created.txt'); if(!newfile.exists()) { newfile.createNewFile(); System.out.println('file not exist'); } try { String FILENAME='created.txt'; String content='hi how are u'; FileWriter fwt = new FileWriter(FILENAME); BufferedWriter bwt = new BufferedWriter(fwt); bwt.write(content); System.out.println('writing completed ...'); bwt.close(); } catch (IOException e) { e.printStackTrace(); } } }
Najważniejsze punkty, na które należy zwrócić uwagę:
- Strumień to logiczna reprezentacja przepływu danych.
- Możesz czytać / zapisywać dane w innym formacie, takim jak bajt, znak, obiekt, pierwotny typ danych.
- Klasa pliku służy do tworzenia pliku, usuwania pliku i przenoszenia lub kopiowania lub zmiany nazwy pliku.
- BufferedInputStream lub BufferedOutputStream służy do poprawy wydajności poprzez buforowanie danych.
Wniosek
Java ma pakiet java.lang, który udostępnia standardowe funkcje wejścia i wyjścia przy użyciu klasy System.
Oprócz strumieni System.in i System.out, które są używane odpowiednio jako standardowe wejście i wyjście, istnieją również inne metody, takie jak BufferedReader, klasa konsoli i klasa skanera, które są używane do odczytu danych wejściowych od użytkownika.
Strumień System.out używa funkcji klasy „PrintStream”, print i println do wyświetlenia wyniku. Są to funkcje używane do wyświetlania danych wyjściowych bez formatowania. Inna funkcja „printf”, która jest podobna do funkcji printf w C / C ++, jest również używana w Javie do sformatowania wyjścia.
Więcej informacji na temat klasy skanera i funkcji printf w Javie znajdziesz w nadchodzących samouczkach.
=> Odwiedź tutaj ekskluzywną serię samouczków szkoleniowych Java.
POPRZEDNIA samouczek | NEXT Tutorial
rekomendowane lektury
- Podstawowe operacje wejścia / wyjścia w C ++
- Operacje na plikach wejściowych i wyjściowych w C ++
- Samouczek Java Collections Framework (JCF)
- Wdrażanie Java: tworzenie i wykonywanie pliku Java JAR
- Wirtualna maszyna Java: jak JVM pomaga w uruchamianiu aplikacji Java
- Wejście-wyjście i pliki w Pythonie (Python Open, Read and Write to File)
- Modyfikatory dostępu w Javie - samouczek z przykładami
- Samouczek dotyczący refleksji w języku Java z przykładami