2024. 10. 21. 21:48ㆍjava
IO(Input & Output)), 입/출력:
프로그램 상의 데이터를 외부매체(모니터, 스피커, DB, 웹브라우저, 콘솔, "파일")로 출력하거나
입력장치 (마우스, 키보드, 마이크, "파일")로 입력받는 과정
IO를 진행하고 싶으면 우선적으로 반드시 프로그램과 외부매체간의 "통로"를 만들어야 함
→ 스트림(Stream)
- 선입선출 (First In First Out) 구조 → 큐(Queue)
- 시간 지연 문제가 발생할 수 있음.
스트림에 넣어진 데이터가 처리되기 전까지 스트림에 사용하는 스레드는 대기locking) 상태 - 단방향 : 입력이면 입력 / 출력이면 출력, 입력용 스트림과 출력용 스트림이 따로 존재함
[ 스트림 구분 ]
1. 스트림의 사이즈
- 바이트 스트림: 1Byte 짜리가 이동할 수 있는 통로
→ 입력(XXXInputStream) / 출력(XXXOutputStram) - 문자 스트림: 2Byte 짜리가 이동할 수 있는 통로
→ 입력(XXXRReader) / 출력 (XXXWriter) (클래스명이 저렇게 끝날 경우 알수있음)
2. 외부매체와 직접적인 연결 여부
- 기반 스트림 : 외부매체와 직접적으로 연결되는 통로
- 보조 스트림: 기반스트림만으로 부족한 성능 향상시켜주는 용도로 만들어진 스트림
→ 단독사용불가 (반드시 기반스트림이 존재해야만 기반 스트림에 추가 해줄 수 있음
→ 속도 향상, 자료형에 맞춰서 변환, 객체단위로 입출력하게 도움
파일 생성하는 법
- 파일 생성:
file1.createNewFile(); - 폴더 생성:
File folder = new File ("folder");
folder.mkdir();
public class FileRun {
public static void main(String[] args) {
// 파일클래스를 가지고 객체 생성
File file1 = new File("test.txt");
try {
// createNewFile(): 파일을 생성해주는 메소드
file1.createNewFile();
// 폴더 만드는방법: mkDir()
File folder = new File ("folder");
folder.mkdir();
// 경로지정을 통해 특정 경로에 파일 생성
File file2 = new File("folder/test.txt");
file2.createNewFile();
// File에서 제공하는 메소드
System.out.println("파일이니? " + file2.isFile()); // true
System.out.println("파일명이 뭐니? " + file2.getName()); // test.txt
System.out.println("상위 폴더 알고싶다 " + file2.getParent()); // folder
System.out.println("절대 경로 알고싶다 " + file2.getAbsolutePath()); // C:\Users\lovet\eclipse-workspace\11_Input_Output\folder\test.txt
System.out.println("파일 크기" + file2.length()); // 0
} catch(IOException e) {
e.printStackTrace();
}
}
Wapper 클래스:
기본자료형을 객체로 포장해주는 클래스들을 래퍼클래스
| 기본타입(primitive type) | 래퍼클래스(wrapper class) |
| boolean | Boolean |
| char | Character |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
래퍼클래스 구조도

// 기본자료형 -> Wrapper클래스 자료형
Integer i1 = num1; // 기본생성자
Integer i2 = num2;
System.out.println(i1.equals(i2));
System.out.println(i1.compareTo(i2));
// a. compareTo(b) ( 정렬할때, 순서 바꿀때 사용)
// a가 b보다 크면 1을 반환
// a가 b보다 작으면 -1을 반환
// 같으면 0을 반환
동등비교 시 Object 클래스 이용 → eqauls() 사용
Integer : 정수자료형을 객체로 바꿀때 사용 → 객체가 되었기 때문에 eqauls 사용 가능
compareTo(b): 정렬할때, 순서 바꿀때 사용함
String str1 = "10";
String str2 = "10.0";
System.out.println(str1 + str2);
int i = Integer.parseInt(str1); //문자열로 온 걸 int형으로 바꿈
double d = Double.parseDouble(str2); // 더블로 바꿈
[ 표현법 ]
해당 Warrper 클래스 이름.parseXXX(반환할 문자열));
Integer.parsInt(str1): 문자열로 온 걸 int형으로 바꿈
Double.parseDouble(str2): 문자열로 온 걸 double형으로 바꿈
기본자료형을 다시 문자로 바꿀 때
String strI = String.valueOf(i); // 문자열로 다시 변경(String으로~)
String strD = String.valueOf(d);
바이트스트림 예시
public void fileRead() {
FileInputStream fis = null;
try{
// 1. 객체생성 -> 파일과의 통로 생성 // 선언따로
fis = new FileInputStream("a_byte.txt");
// 2.통로로부터 데이터 입력받기 // 대입따로
// read() 호출
// 1Byte 단위로 하나씩 읽어옴
/*
System.out.println((char)fis.read());
System.out.println(fis.read());
// 파일의 마지막 데이터를 입력다고 나서 read()호출 시 -1을 반환
System.out.println(fis.read()); -1
*/
int value = 0;
while((value = fis.read()) != -1) {
System.out.println(value);
}
// 3. 마지막으로 꼭 해야할 일! 반환하기
} catch(FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다.");
} catch(IOException e) {
System.out.println("입력 받으면서 문제가 발생했습니다.");
} finally {
try {
if(fis != null) {
fis.close();
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
문자 스트림 예시
public class FileChrDao {
// 프로그램 --> 외부매체(파일)
// 출력
public void fileSave() {
//FileWriter: 파일로 데이터를 2Byte단위로 출력하는 스트림
// 1. 스트림생성
FileWriter fw = null;
try {
fw = new FileWriter("b_char.txt");
//2. 데이터 출력 -> write()
fw.write("IO입니다"); // 문자열 가능
char[] arr = {'a','b','c','d'}; // char형 배열 가능
fw.write(arr);
fw.write("E");
} catch(IOException e) {
System.out.println("문제가 발생하여 출력하지 못하였습니다.");
} finally {
try {
fw.close();
} catch(IOException e) {
e.printStackTrace();
}
// 3.자원반납 -> .close();
}
}
보조스트림
기반스트림이 Input/Output 계열일 경우 → 보조스트림도 Input/Output 계열을 사용
기반스트림이 Reader / Writer 계열일 경우 → 보조스트림도 Reader / Writer 계열을 경우
BufferedReader / BufferedWriter
→ 속도 향상 목적의 보조스트림
→ 임시공간을 제공해서 한 번에 모아두었다가 한 꺼번에 입/출력 진행
[ 표현법 ]
기반스트림클래스이름 기반스트림 = new 기반스트림생성자();
보조스트림클래스이름 보조스트림 = new 보조스트림 생성자(기반스트림);
- FileWriter
// 출력
public void fileSave(){
// BufferedWriter
// 0. 객체 선언
FileWriter fw = null;
BufferedWriter bw = null;
try {
// 1. 객체 생성
fw = new FileWriter("c_buffer.txt");
bw = new BufferedWriter(fw); // 보조라서 직접 선언 불가함
// 2. 파일에 출력 -> write()
bw.write("안녕하세요");
bw.newLine(); // 개행문자 기능을함. 굳이 \n안넣어도
bw.write("반갑습니다.");
} catch(IOException e) {
e.printStackTrace();
} finally {
// 3. 자원반납 -> close()
// 자원반납은 반드시 생성의 역순으로 반납한다.
try {
if(bw != null) bw.close();
if(fw != null) bw.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
- 기반스트림 → FileOutputStream '파일'로 데이터를 출력할 때 1Byte단위로 출력하는 스트림
- 보조스트림 → ObjectOutputStream
- 객체를 파일에 출력 → writeObject()
- 자원반납 → close()
- FileWriter
→ ObjectInputStream: 객체 단위로 읽어올 때 사용하는 보조스트림
→ FileInputStream: 파일에서 데이터를 입력받을 때 사용하는 기반 스트림
// 입력
public void fileRead() {
// FileReader를 기반으로 BufferdReader를 추가해서 사용
// 0. 객체 선언
FileReader fr = null;
BufferedReader br = null;
try {
// 1. 객체 생성
fr = new FileReader("c_buffer.txt");
br = new BufferedReader(fr);
// 2. 입력받기 -> read()
//System.out.println(br.readLine());
//System.out.println(br.readLine());
try(BufferedReader bfr = new BufferedReader(new FileReader("c_buffer.txt"));
Scanner sc = new Scanner(System.in);){
String str = "";
while((str = bfr.readLine()) != null) {
System.out.println(str);}
}
} catch(IOException e) {
e.printStackTrace();
}
}
try ~ with ~ resource구문 (자동으로 자원반납진행됨. 자원반납 할 필요 없음)
- JDK 7버전 이상부터 사용가능
[ 표현법 ]
try(스트림객체생성; ... ){
예외가 발생할 수도 있는 구문;
} catch (예외클래스 e) {
예외가 발생할 때 실행할 구문;
}
'java' 카테고리의 다른 글
| 자바 String 클래스 (1) | 2024.10.20 |
|---|---|
| 예외처리 (Exception) try ~ catch (3) | 2024.10.20 |
| 오버로딩(overloading), 오버라이딩(overriding), 상속 (1) | 2024.10.18 |
| 클래스변수 & 인스턴스변수 & 지역변수 (1) | 2024.10.18 |
| 접근제한자(Access Modifier) & 캡슐화 (1) | 2024.10.18 |