
📃 요약
자바는 웹 프로그램을 개발하는데 특화된 컴파일 언어이자 벡엔드 개발 전문 언어임. 플랫폼에 독립적이라서 어떤 운영체제(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 폴더
}
}



