고래씌
[JAVA] 13-3. 입출력(IO) (보조스트림) 본문
1. 보조스트림
: 기반스트림(외부매체와 직접 연결할 수 있는 기능)의 부족한 기능들을 확장시킬 수 있도록 도와주는 스트림
보조스트림은 단독으로는 사용할 수가 없음 == 단독으로 객체생성이 불가
[표현법]
보조스트림 변수명 = new 보조스트림( 기반스트림객체(필수) );
BufferedXXX : ★속도 성능 향상 목적의 보조 스트림
=> Buffer라는 저장공간을 제공해서 입출력때 필요한 데이터를 한번에 모아뒀다가 한꺼번에 입출력 진행
1) 보조스트림을 활용한 파일 저장 메소드(속도 성능 향상 목적)
■ FileWriter (기반스트림) / BufferedWriter(보조스트림)
① 기반스트림 객체 생성
- 기반스트림이 Reader / Writer 계열이면 보조스트림도 Reader / Writer 계열
- 기반스트림이 Input / Ouput 계열이면 보조스트림도 Input / Output 계열
package com.kh.chap04_assist.model.dao;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedDao {
// 프로그램 --> 파일(외부매체)
public void fileSave() {
// 1) 기반스트림 객체 생성
FileWriter fw = new FileWriter("c_buffer.txt");
}
}
② 보조스트림 객체 생성
참조변수.newLine(); => 개행을 넣어주는 메소드
package com.kh.chap04_assist.model.dao;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedDao {
// 프로그램 --> 파일(외부매체)
public void fileSave() {
// 2) 보조스트림 객체 생성
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("c_buffer.txt")); // 굳이 변수 저장해서 안해도 됨
bw.write("안녕하세요");
bw.newLine(); // 개행을 넣어주는 메소드
bw.write("반갑습니다 \n");
bw.write("저리가세요");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close(); // 기반스트림이 보조스트림과 함께 닫히기 때문에 문제없음
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
③ try ~ with ~ resource 구문.(자원의 자동 반납)
try(스트림객체 생성; 스트림객체 생성;) {
예외가 발생할 수 있는 구문
} catch(예외클래스명 e) {
예외 발생시 실행할 구문
}
☞ 스트림자원을 try의 매개변수로 넣어버리면 스트림객체 생성후 직접 자원을 반납하지 않아도, try블록의 구문실행 완료 후 자동으로 자원이 반납된다.
package com.kh.chap04_assist.model.dao;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedDao {
// 프로그램 --> 파일(외부매체)
public void fileSave() {
try(BufferedWriter bw = new BufferedWriter(new FileWriter("c_buffer.txt"))) {
bw.write("안녕하세요");
bw.newLine(); // 개행을 넣어주는 메소드
bw.write("반갑습니다 \n");
bw.write("저리가세요");
} catch (IOException e) {
e.printStackTrace();
}
}
}
■ FileReader(기반스트림) / BufferedReader(보조스트림)
- 참조변수.read() => 한글자씩 출력
- 참조변수.readLine() => 한 줄씩 출력
public void fileRead() {
//FileReader
//BufferedReader
try(BufferedReader br = new BufferedReader(new FileReader("c_buffer.txt"))) {
String value = null;
while((value = br.readLine()) != null) {
System.out.println(value);
}
// read() => 한글자씩 출력 / readLine() => 한 줄씩 출력
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2) 객체단위로 입출력 할수 있는 기능을 제공하는 보조스트림
- 객체를 파일에 출력하고자할 때 필요한 스트림
■ ObjectOutputStream : 객체단위로 출력할 수 있는 "보조"스트림
■ FileOutputStream : 파일에 데이터를 출력하는 기반스트림
☞ 객체를 직렬화 할 수 있는 Serializable
☞ 객체 입출력스트림에서 사용되어질 객체는 반드시 Serializable을 구현해야한다!!
package com.kh.chap05_assist2.model.vo;
import java.io.Serializable;
/*
* 객체를 직렬화 할 수 있는 Serializable
*
* 객체 입출력스트림에서 사용되어질 객체는 반드시 Serializable을 구현해야한다!!
*/
public class Phone implements Serializable{
// 클래스별 식별번호(고유번호)
private static final long serialVersionUID = 1L;
//transient : 객체 입출력시 해당값은 전송하지 않게 하는 예약어
private String number;
private String name;
private transient int price; // phone.txt 파일에는 price 내용을 안넣음
public Phone() {
}
public Phone(String number, String name, int price) {
super();
this.number = number;
this.name = name;
this.price = price;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Phone [number=" + number + ", name=" + name + ", price=" + price + "]";
}
}
package com.kh.chap05_assist2.model.dao;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.kh.chap05_assist2.model.vo.Phone;
public class ObjectDao {
public void fileSave(String fileName) {
Phone ph = new Phone("010-1234-1234", "갤럭시 S20", 200);
// 객체를 파일에 출력하고자할 때 필요한 스트림
// ObjectOutputStream : 객체단위로 출력할 수 있는 "보조"스트림
// FileOutputStream : 파일에 데이터를 출력하는 기반스트림
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))) {
oos.writeObject(ph);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 객체를 파일로부터 읽어들이고자할 때 필요한 스트림
■ FileInputStream : 파일로부터 데이터를 1byte로 읽어들이는 기반스트림
■ ObjectInputStream : 스트림으로부터 객체단위로 입력 받기 위해 사용되는 보조스트림
public void fileRead() {
// FileInputStream : 파일로부터 데이터를 1byte로 읽어들이는 기반스트림
// ObjectInputStream : 스트림으로부터 객체단위로 입력 받기 위해 사용되는 보조스트림
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("phone.txt"))) {
Phone ph = (Phone)ois.readObject(); // 강제형변환
System.out.println(ph);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
3) 기본자료형 + 문자열값을 출력하는 기능을 제공하는 보조스트림
■ DataOutputStream 보조스트림 : 기본자료형 + 문자열값을 출력할 수 있도록 도와주는 보조스트림
■ FileOutputStream 기반스트림
package com.kh.chap06_Data.run;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataRun {
public static void main(String[] args) {
DataRun dr = new DataRun();
// dr.test1();
test2();
}
public void test1() {
// DataOutputStream 보조스트림 : 기본자료형 + 문자열값을 출력할 수 있도록 도와주는 보조스트림
// FileOutputStream 기반스트림 :
// File f = new File("sample.dat");
// try(DataOutputStream dos = new DataOutputStream(new FileOutputStream(f))) {
try(DataOutputStream dos = new DataOutputStream(new FileOutputStream("sample.dat"))) {
// 자바의 기본자료형별로 작성기능 지원
dos.writeBoolean(true);
dos.writeInt(3000);
dos.writeDouble(3.14);
dos.writeChar('안');
dos.writeChar('녕');
dos.writeUTF("자바자바자바");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("작업종료");
}
}
■ DataInputStream 보조스트림
■ FileInputStream 기반스트림
☞ 씌어진 자료형 순서대로 정확하게 읽어와야함!!
☞ 내가 저장한 자료형과 일치하게 읽어들어야함
public static void test2() {
File f = new File("sample.dat");
try(DataInputStream dis = new DataInputStream(new FileInputStream(f))) {
// 씌어진 자료형 순서대로 정확하게 읽어올 것.
System.out.println(dis.readBoolean()); // 내가 저장한 자료형과 일치하게 읽어들여야함
System.out.println(dis.readInt());
System.out.println(dis.readDouble());
System.out.println(dis.readChar());
System.out.println(dis.readChar());
System.out.println(dis.readUTF());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
'JAVA > JAVA 기초' 카테고리의 다른 글
[JAVA] 14-1. 컬렉션(Collection) - ArrayList (0) | 2023.10.24 |
---|---|
[JAVA] 입출력(보조스트림) 실습문제 (0) | 2023.10.24 |
[JAVA] 입출력 실습문제 (0) | 2023.10.23 |
[JAVA] 13-2. 입출력(IO) (File 클래스 ②) (1) | 2023.10.23 |
[JAVA] 13-1. 입출력(IO) (File 클래스 ①) (0) | 2023.10.20 |