📃 요약
자바는 웹 프로그램을 개발하는데 특화된 컴파일 언어이자 벡엔드 개발 전문 언어임. 플랫폼에 독립적이라서 어떤 운영체제(OS)에서도 실행이 가능하며 가상머신을 통해 실행됨
요소 기술 :
Basic : 자바
📃 기술 구현
스펙 :
intellij java
📃 입출력 스트림
자바에서 데이터는 스트림이라는 가상의 관을 통해 흘러간다고 가정함. 데이터를 입력 받을 때는 입력 스트림, 출력할 때는 출력 스트림을 사용함
1) : 입출력 스트림 구성요소 : 바이너리 파일 만들기
입출력 스트림 : 자바에서 데이터는 스트림을 통해 입출력 됨
프로그램이 읽기용/쓰기용에 따라 사용하는 클래스(객체)가 다름
InputStream : 1바이트 기반 입력용(읽기용) 스트림의 최상위 클래스로 추상 클래스임,
모든 바이트기반 입력 스트림은 InputStream 클래스를 상속받아 생성됨
OuputStream : 1바이트 기반 출력용(쓰기용) 스트림의 최상위 클래스로 추상 클래스임,
모든 바이트기반 출력(쓰기) 스트림은 OutputStream 클래스를 상속받아 생성됨
자바 입출력 객체 : 디자인패턴 적용(데코레이션(장식) 패턴)
WriteApplication.java
public class WriteApplication { public static void main(String[] args) throws Exception { // 파일 출력용(쓰기용) 객체 생성(파일 열기) // new FileOuputStream(경로+파일이름); // Gradle 프로젝트 루트(/)경로 : build.gradle 파일 있는 위치 OutputStream outputStream = new FileOutputStream("src/main/resources/test1.db"); byte a = 10; byte b = 20; byte c = 30; // 파일에 쓰기 : 먼저 버퍼에 쓰고 버퍼(메모리, 배열) 다차면 파일 씁니다. // 버퍼 : 메모리의 임시공간(입출력/네트웍 속도 향상을 위해 사용) // .write(byte값) : 파일버퍼에(네트워등) 쓰는 함수 outputStream.write(a); outputStream.write(b); outputStream.write(c); // .flush() 함수 : 버퍼에 있는 문자를 파일에 쓰기 outputStream.flush(); outputStream.close(); // 파일 사용 끝나면 닫기 } }
ReadApplication.java
public class ReadApplication { public static void main(String[] args) throws Exception { InputStream inputStream = new FileInputStream("src/main/resources/test1.db"); while (true) { // .read() : 1byte 읽기 int data = inputStream.read(); // read() 리턴값 정수(int) // 파일의 끝에 도달하면 : -1 if(data == -1) break; System.out.println(data); // 읽은 내용 화면 출력 } inputStream.close(); // 파일 닫기 } }
2) : 입출력 스트림 구성요소 : 문자 파일 만들기
입출력 스트림 : 자바에서 데이터는 스트림을 통해 입출력 됨
프로그램이 읽기용/쓰기용에 따라 사용하는 클래스(객체)가 다름
Reader : 문자(char:2byte) 기반 입력용(읽기용) 스트림의 최상위 클래스로 추상 클래스임,
모든 문자기반 입력(읽기) 스트림은 Reader 클래스를 상속받아 생성됨
Writer : 문자(char:2byte) 기반 출력용(쓰기용) 스트림의 최상위 클래스로 추상 클래스임,
모든 문자기반 출력(쓰기) 스트림은 Writer 클래스를 상속받아 생성됨
WriteApplication.java
package chap14.sec01.exam07; import java.io.FileWriter; import java.io.Writer; /** * packageName : chap14.sec01.exam07 * fileName : WriteApplication * author : ds * date : 2022-10-07 * description : 한 문자씩 출력하기 * =========================================================== * DATE AUTHOR NOTE * ————————————————————————————— * 2022-10-07 ds 최초 생성 */ public class WriteApplication { public static void main(String[] args) throws Exception { // 파일 쓰기용(출력용) 열기(문자기반(char) : 2byte) Writer writer = new FileWriter("src/main/resources/test7.txt"); char a = 'A'; // 홑따옴표 한문자 표기하는 자료형 char b = 'B'; char c = 'C'; // 한문자씩 버퍼에 출력 writer.write(a); writer.write(b); writer.write(c); // 버퍼에 있는 내용을 실제 파일에 쓰기 writer.flush(); writer.close(); // 파일 닫기 } }
ReadApplication.java
package chap14.sec01.exam11; import java.io.FileReader; import java.io.IOException; import java.io.Reader; /** * packageName : chap14.sec01.exam11 * fileName : ReadApplication * author : ds * date : 2022-10-07 * description : 한 문자씩 읽기 * =========================================================== * DATE AUTHOR NOTE * ————————————————————————————— * 2022-10-07 ds 최초 생성 */ public class ReadApplication { public static void main(String[] args) throws IOException { // 파일 읽기용(입력용)으로 열기 Reader reader = new FileReader("src/main/resources/test7.txt"); // loop 돌리면서 한문자씩 읽기 while (true) { // 한문자씩 읽기(아스키코드) int data = reader.read(); // 파일의 끝 : -1 if(data == -1) break; System.out.println((char)data); // 아스키코드 -> 문자 } reader.close(); // 파일 닫기 } }
📃 보조 스트림
다른 스트림과 연결되어 여러가지 편리한 기능을 제공하는 클래스
1) : 입출력 스트림 구성요소
보조 스트림 : 다른 스트림과 연결되어 여러 가지 편리한 기능 제공 자체적으로 입출력을 수행할 수 없고, 입출력소스(InputStream, OutputStream 등) 결합하여 사용(데코레이션 패턴)
보조 스트림 종류 : 문자 변환, 입출력 향상, 기본 타입 입출력, 객체 직렬화 등이 있음
문자 변환 : 소스가 바이트기반 입출력이면서 문자라면 Reader, Writer로 변환해서 사용하는 것을 고려
(1) BufferedOupputStream/BufferedInputStream, BufferedWriter/BufferdReader
성능 향상 : 기본적으로 InputStream/OutputStream 은 내부에 조그만 버퍼가 있음. 하지만 이것만으로 충분하지 않아 더 큰 메모리 버퍼를 추가 제공하는 보조스트림을 사용함
ReadLineApplication.java
public class ReadLineApplication { public static void main(String[] args) throws Exception { // 문자기반(char) 파일 읽기용으로 열기 Reader reader = new FileReader("src/main/resources/language.txt"); // 보조스트림 : 버퍼가 있는 읽기 ( BufferedReader ) // 사용법 : new 보조스트림(기본스트림) BufferedReader bufferedReader = new BufferedReader(reader); // BufferedReader 클래스의 특징 : 한라인씩 읽기 - .readLine() while (true) { String data = bufferedReader.readLine(); // 파일을 한라인씩 읽기 // 파일의 끝 : null if(data == null) break; // 파일의 끝라인 System.out.println(data); } bufferedReader.close(); // 파일 닫기 } }
(2) DataInputStream/DataOutputStream
기본 타입 입출력 : DataInputStream/DataOutputStream 보조스트림을 연결하면 기본 타입인 boolean, char, short, int, long, float ,double 등을 입출력할 수 있음
개행 출력 : PrintStream/PrintWriter의 print(), println() 함수를 사용할 수 있고, println()함수는 출력할 데이터 끝에 줄바꿈 문자를 추가함
ReadLineApplication.java
package chap14.sec02.exam02; import java.io.BufferedReader; import java.io.FileReader; import java.io.Reader; /** * packageName : chap14.sec02.exam03 * fileName : ReadLineApplication * author : ds * date : 2022-10-07 * description : 라인 단위로 구분된 문자열 * =========================================================== * DATE AUTHOR NOTE * ————————————————————————————— * 2022-10-07 ds 최초 생성 */ public class ReadLineApplication { public static void main(String[] args) throws Exception { // 문자기반(char) 파일 읽기용으로 열기 Reader reader = new FileReader("src/main/resources/language.txt"); // 보조스트림 : 버퍼가 있는 읽기 ( BufferedReader ) // 사용법 : new 보조스트림(기본스트림) BufferedReader bufferedReader = new BufferedReader(reader); // BufferedReader 클래스의 특징 : 한라인씩 읽기 - .readLine() while (true) { String data = bufferedReader.readLine(); // 파일을 한라인씩 읽기 // 파일의 끝 : null if(data == null) break; // 파일의 끝라인 System.out.println(data); } bufferedReader.close(); // 파일 닫기 } }
📃 입출력 관련 API
입출력을 하는데 있어 유용하고 편리한 기능을 제공하는 함수
1) : 입출력 스트림 구성요소
System.in : 콘솔에서 키보드의 데이터를 입력받을 수 있도록 System 클래스에 in 공유 속성을 제공함.
System.in 은 InputStream 클래스 타입임,
주로 InputStreamReader 보조스트림과 BufferedReader 보조 스트림을 연결해서 사용하거나Scanner를 이용해서 문자열 입력을 받음
System.out : 콘솔에서 모니터에 데이터를 출력하기 위함
System 클래스에 out 공유 속성을 제공함
System.out 은 PrintStream 클래스 타입임, print(), println(), printf() 함수 제공
package chap14.sec03.exam01; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; /** * packageName : chap14.sec03.exam01 * fileName : GetLineKeyboardApplication * author : ds * date : 2022-10-07 * description : 키보드로 부터 라인(줄) 단위 문자열 얻기 * =========================================================== * DATE AUTHOR NOTE * ————————————————————————————— * 2022-10-07 ds 최초 생성 */ // System.in : 키보드로 부터 입력 // System.out : 모니터로 출력 public class GetLineKeyboardApplication { public static void main(String[] args) throws Exception { // 1) 기본스트림(byte기반) <- 키보드 입력(byte 기반 입력) // 2) byte + 문자기반 보조스트림 기능 추가 Reader reader = new InputStreamReader(System.in); // 성능향상 보조스트림 기능 추가 BufferedReader bufferedReader = new BufferedReader(reader); // BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.print("입력하세요: "); String lineStr = bufferedReader.readLine(); // 한줄씩 읽기 // 종료 조건 if(lineStr.equals("q") || lineStr.equals("quit")) break; System.out.print("입력된내용: " + lineStr); System.out.println(); // 줄바꿈 } bufferedReader.close(); // 입출력 스트림 닫기 } }
Scanner : 입출력스트림 또는 보조 스트림이 아니고, 자바에서 바이트 기반 입출력에서 라인 단위 문자열을 쉽게 읽도록 하기 위해 자바에서 제공함
package chap14.sec03.exam02; import java.util.Scanner; /** * packageName : chap14.sec03.exam03 * fileName : ScannerApplication * author : kangtaegyung * date : 2/18/24 * description : Scanner 클래스 * 요약 : * 1) 키보드 입력을 위한 다양한 함수를 지원해서 쉽게 사용 가능 * 2) 속도가 느린 것이 단점 * <p> * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * 2/18/24 kangtaegyung 최초 생성 */ public class ScannerApplication { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); // 정수 입력 1 System.out.println(num); long num2 = scanner.nextLong(); // 정수 입력 2 System.out.println(num2); double num3 = scanner.nextDouble(); // 실수 입력 3.1 System.out.println(num3); String str = scanner.next(); // 1단어 입력 : 안녕 홍길동 String str2 = scanner.next(); System.out.println(str); System.out.println(str2); // next 계열과 nextLine 같이 사용하지 말것 : 입력 오류가 발생함 // String str3 = scanner.nextLine(); // 문자열 입력 안녕 장길산 // System.out.println(str3); } }
File : 파일 및 폴더의 정보를 제공해주는 역할
package chap14.sec03.exam03; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; /** * packageName : chap14.sec03.exam02 * fileName : FileApplication * author : ds * date : 2022-10-07 * description : File 클래스를 이용한 파일 및 폴더 정보 보기 * =========================================================== * DATE AUTHOR NOTE * ————————————————————————————— * 2022-10-07 ds 최초 생성 */ public class FileApplication { public static void main(String[] args) throws Exception { // File 객체 : 파일 및 폴더의 정보를 볼수 있음 , 또한 폴더, 파일 생성할 수 있음 // 폴더 정보 File dir = new File("src/main/resources/images"); // 폴더명 // 파일 정보 File file1 = new File("src/main/resources/file1.txt"); // 파일 if (dir.exists() == false) { dir.mkdirs(); // 폴더 없으면 폴더 만들기 실행 } if (file1.exists() == false) { file1.createNewFile(); // 없으면 파일 만들기 } // 파일객체 현재 디렉토리의 목록보기 함수 File temp = new File("src/main/resources/"); File[] contents = temp.listFiles(); // 하위폴더, 파일 정보보기 // 파일 또는 정보를 출력 System.out.println(contents[0].getName()); // file1.txt System.out.println(contents[1].getName()); // images 폴더 } }