- 프로그램에서 다른 대상으로 데이터를 보내거나 읽어 들이는 기능
- java.io 패키지에서 제공
- http://twinbraid.blogspot.com/2014/09/blog-post_40.html
스트림(Stream)
- 애플리케이션이 다른 대상으로 데이터 입/출력시 중간 매개체 역할을 하는 단위 애플리케이션 => (출력스트림) => 작업대상(파일,콘솔,서버등) 애플리케이션 <= (입력스트림) <= 작업대상(파일,콘솔,서버등)
바이트 기반 입출력
- 바이트 기반으로 입출력 해주는 클래스
- 바이트 기반이라 한글 처리가 안됨
참고 : 아스키(ASCII)코드와 유니코드(Unicode)
InputStream 클래스
- 여러 자식 클래스가 있음
- System.in에서 in 은 InputStream을 구현해 놓은 객체
import java.io.IOException;
public class InputStreamTest {
/**
* InputStream 테스트
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int var_byte=-1;
System.out.print("문자입력 >>");
do{
try{
var_byte = System.in.read(); // 1byte 씩 읽어온다(한글은 깨짐)
}
catch(IOException io){
io.printStackTrace();
}
if(var_byte == 10 || var_byte == 13) {
break;
}else {
System.out.println("읽은 값 : " + (char)var_byte);
}
}
while(true);
System.out.println("end");
}
}
FileInputStream
- 파일로부터 바이트 단위로 데이터를 읽어 들이는 스트림 클래스
- 파일이 존재 해야함
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest {
/**
* FileInputStream 테스트
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FileInputStream fIn=null;
try{
// 파일 있어야 함(워크스페이스 프로젝트 폴더)
fIn = new FileInputStream("test.txt");
}
catch(IOException io){
io.printStackTrace();
}
int var_read = -1;
try{
while((var_read = fIn.read()) != -1){
System.out.print((char)var_read);
}
}
catch(IOException io){
io.printStackTrace();
}
finally{
try{
fIn.close();
}
catch(IOException io){
io.printStackTrace();
}
}
}
}
OutputStream
- 바이트기반 출력 스트림 최상위 클래스
- void write() : 1byte 출력
- void flush() : 버퍼에 있는 데이터 출력
FileOutputStream
- 특정 파일로 데이터 출력
- 지정 경로에 파일이 없으면 자동 출력
- 디렉토리가 없으면 FileNotFoundException 발생
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
/**
* FileOutputStream 테스트
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FileOutputStream fo = null;
String msg = "FileOutputStream Test";
byte[] byteArray = msg.getBytes();
try{
fo = new FileOutputStream("d:/bigdata/data/fileoutput.txt",true); // true : append 모두
fo.write(byteArray);
}
catch(IOException io){
io.printStackTrace();
}
finally{
try{
fo.close();
}
catch(IOException io){
io.printStackTrace();
}
}
}
}
문자 기반 입출력
- 한글 가능
Reader 클래스
- 문자를 읽어 드리는 클래스
- BufferedReader,FileReader, InputStreamReader
- InputStreamReader : InputStream(바이트) -> Reader(문자)
BufferedReader 클래스
- Reader 스트림에 버퍼 기능을 추가하는 스트림 클래스
- 버퍼를 사용해 성능이 좋음
- readLine() 메서드 : 라인별로 읽어 들여 String 타입으로 반환
- InputStreamReader : 바이트 입력 스트림 -> 문자 입력 스트림 변환
sample.txt
Reader 테스트 1 입니다.
Reader 테스트 2 입니다.
Reader 테스트 3 입니다.
Reader 테스트 4 입니다.
Reader 테스트 5 입니다.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderTest {
/**
* BufferedReader 테스트
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FileInputStream fi = null;
InputStreamReader isr = null;
BufferedReader bfr = null;
try{
fi = new FileInputStream("sample.txt");
isr = new InputStreamReader(fi); // InputStream -> Reader
bfr = new BufferedReader(isr);
String str = null;
while((str = bfr.readLine()) != null){
System.out.println(str);
}
}
catch(IOException e){
e.printStackTrace();
}
finally{
try{
fi.close();
isr.close();
bfr.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
주소록 파일 정보 출력
- StringTokenizer 객체로 문자열 처리
address.txt
홍길동,율도국,aaa@aaa.com,111-1111
이순신,전라도,bbb@bbb.com,222-2222
세종대왕,서울시,ccc@ccc.com,333-3333
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class ReadAddress {
/**
* 주소 정보 출력하기
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FileInputStream fi = null;
InputStreamReader isr = null;
BufferedReader bfr = null;
StringTokenizer st = null;
try{
fi = new FileInputStream("address.txt");
isr = new InputStreamReader(fi); // InputStream -> Reader
bfr = new BufferedReader(isr);
String str = null;
while((str = bfr.readLine()) != null){
st = new StringTokenizer(str, ",");
System.out.println("이름 : " + st.nextToken() + ",주소 : " + st.nextToken()
+ ",이메일 : " + st.nextToken() + ",전화번호 : " + st.nextToken());
}
}
catch(IOException e){
e.printStackTrace();
}
finally{
try{
fi.close();
isr.close();
bfr.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
FileReader
- 파일로 부터 데이터를 문자 단위로 읽어 드림
- Reader 객체가 됨
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
/**
* FileRader 테스트
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FileReader fr = null;
try{
fr = new FileReader("sample.txt");
int readChar=-1;
while((readChar=fr.read()) != -1){
System.out.print((char)readChar);
}
}
catch(IOException e){
e.printStackTrace();
}
finally{
try{
fr.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
FileReader 로 주소록 읽기
package ch11;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class FileReadAddress {
/**
* 주소 정보 출력하기
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FileReader fr = null;
BufferedReader bfr = null;
StringTokenizer st = null;
try{
fr = new FileReader("address.txt");
bfr = new BufferedReader(fr);
String str = null;
while((str = bfr.readLine()) != null){
st = new StringTokenizer(str, ",");
System.out.println("이름 : " + st.nextToken() + ",주소 : " + st.nextToken()
+ ",이메일 : " + st.nextToken() + ",전화번호 : " + st.nextToken());
}
}
catch(IOException e){
e.printStackTrace();
}
finally{
try{
fr.close();
bfr.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
Writer 객체
- 문자 단위로 데이터 출력
- BufferedWriter, FileWriter, OutputStreamWriter
- OutputStreamWriter : 바이트 출력 스트림 -> 문자 출력 스트림 변환
FileWriter
- 파일에 데이터를 문자 단위로 출력
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
/**
* FileWriter 테스트
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FileWriter fw = null;
String msg = "FileWriter 테스트입니다.\r\n";
try{
fw = new FileWriter("writer_sample.txt",true);
fw.write(msg);
}
catch(IOException e){
e.printStackTrace();
}
finally{
try{
fw.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
BufferedWriter
- flush() 해야 데이터 출력
- close() 메서드 호출 시도 자동 출력
- newLine() 자동개행기능이 없기때문에 개행을 해주어야 함
package chapter18;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class ReaderTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileWriter fileW = null;
BufferedWriter buW = null;
try{
fileW = new FileWriter("buffer_writer.txt");
buW = new BufferedWriter(fileW,4);
buW.write('A');
buW.write('B');
buW.write('C');
buW.flush();
buW.newLine();
buW.write('E');
buW.write('F');
buW.write('G');
//buW.flush();
}
catch(IOException io){
io.printStackTrace();
}finally{
// try {
// buW.close();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
}
객체 입출력
- 직렬화 : 객체 -> 파일, 네트워크에 출력(연속되는 바이트로 변경)
- 역직렬화 : 직렬화된 바이트를 객체로 변환
Serializable 인터페이스 구현
- 구현할 메소드는 없고 직렬화 할 객체에 implements 만 하면 됨
- 구현없이 직렬화 시도시 NotSerializableException 발생
- 특정 변수를 직렬화 대상에서 빼려면 transient 예약어 지정
ObjectInputStream 과 ObjectOutputStream
- ObjectOutputStream : 객체를 출력 할때 직렬화 기능 수행
- ObjectInputStream : 객체를 읽어올때 역 직렬화 기능 수행
객체 파일에 저장
참고:serialVersionUID
직렬화 가능한 User클래스 작성
package chapter18;
import java.io.Serializable;
public class User1 implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L;
// 직렬화 가능
private String id;
private String passwd;
private transient int age; // 나이는 제외
private String name;
public User1(String id, String passwd, int age,String name) {
super();
this.id = id;
this.passwd = passwd;
this.age = age;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "아이디 = " + id + ", 이름 = " + name + ", 나이 = " + age
+ ", 비밀번호 = " + passwd;
}
}
파일에 입/출력
package chapter18;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectStreamTest {
/**
* ObjectInputStream , ObjectOutputStreamTest
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
User1 beforUser1 = new User1("hong", "1234", 20, "홍길동");
User1 afterUser1 = null;
FileOutputStream fileos = null;
ObjectOutputStream objectos = null;
FileInputStream fileis = null;
ObjectInputStream objectis = null;
try{
fileos = new FileOutputStream("userInfo.ser");
objectos = new ObjectOutputStream(fileos);
objectos.writeObject(beforUser1);
fileis = new FileInputStream("userInfo.ser");
objectis = new ObjectInputStream(fileis);
afterUser1 = (User1)objectis.readObject();
System.out.println(afterUser1);
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
fileos.close();
fileis.close();
objectos.close();
objectis.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
'Programing > JAVA' 카테고리의 다른 글
람다 LAMBDA (1) | 2022.03.08 |
---|---|
제네릭 GENERIC (0) | 2022.03.08 |
컬렉션 F/W COLLECTION (2) | 2022.03.07 |
JAVA- API (1) | 2022.03.07 |
예외처리 EXCEPTION (1) | 2022.03.07 |