IO (input / output) 입/출력, warrper래퍼클래스

2024. 10. 21. 21:48java

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) {
예외가 발생할 때 실행할 구문;
}