자바는 웹 프로그램을 개발하는데 특화된 컴파일 언어이자 벡엔드 개발 전문 언어임. 플랫폼에 독립적이라서 어떤 운영체제(OS)에서도 실행이 가능하며 가상머신을 통해 실행됨
intellij
java
자바에서 데이터는 스트림이라는 가상의 관을 통해 흘러간다고 가정함. 데이터를 입력 받을 때는 입력 스트림, 출력할 때는 출력 스트림을 사용함
입출력 스트림 : 자바에서 데이터는 스트림을 통해 입출력 됨
프로그램이 읽기용/쓰기용에 따라 사용하는 클래스(객체)가 다름
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(); // 파일 닫기
}
}
입출력 스트림 : 자바에서 데이터는 스트림을 통해 입출력 됨
프로그램이 읽기용/쓰기용에 따라 사용하는 클래스(객체)가 다름
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(); // 파일 닫기
}
}
다른 스트림과 연결되어 여러가지 편리한 기능을 제공하는 클래스
보조 스트림 : 다른 스트림과 연결되어 여러 가지 편리한 기능 제공 자체적으로 입출력을 수행할 수 없고, 입출력소스(InputStream, OutputStream 등) 결합하여 사용(데코레이션 패턴)
보조 스트림 종류 : 문자 변환, 입출력 향상, 기본 타입 입출력, 객체 직렬화 등이 있음
문자 변환 : 소스가 바이트기반 입출력이면서 문자라면 Reader, Writer로 변환해서 사용하는 것을 고려
성능 향상 : 기본적으로 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(); // 파일 닫기
}
}
기본 타입 입출력 : 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(); // 파일 닫기
}
}
입출력을 하는데 있어 유용하고 편리한 기능을 제공하는 함수
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 폴더
}
}