java io
스트림이란?
- 일차원적인 데이터의 흐름
- 외부의 데이터를 읽고 쓰려는 것
흐름의 방향에 따른 분류
- 입력 스트림(input stream), input은 io에 있다
- 출력 스트림(output stream)
데이터 형태에 따른 분류
- 문자 스트림(character stream), Reader/Writer
- 바이트 스트림(byte stream), input/output
FileReader 클래스
- 텍스트 파일을 읽는 클래스
- 더 이상 읽을 것이 없으면 -1을 리턴한다
- io는 무조건 예외 처리 해야한다
import java.io.FileReader;
public class FileReaderExam {
public static void main(String[] args){
FileReader reader = null;
char arr[] = new char[30];
try{
reader = new FileReader("poam.txt");
while(true){
int data = reader.read(arr);
if(-1 >= data)
break;
System.out.println(arr);
}
/* while(true){
int data = reader.read(); // 하나씩 옮기므로 비효율적이다
if(-1 == data){
break;
}
char ch = (char)data;
System.out.print(ch);
}
*/
}catch(Exception e){
e.printStackTrace();
}finally{
// close도 예외 발생할 수 있음
try{
reader.close();
}catch(Exception e2){}
}
}
FileWriter 클래스
- 텍스트를 파일에 쓰는 클래스
- 파일이 없어도 알아서 만들어준다
import java.io.FileWriter;
import java.util.Scanner;
public class FileWriteExam {
public static void main(String[] args) {
FileWriter writer = null;
Scanner sc = new Scanner(System.in);
System.out.println("입력:");
String str = "";
String poem = "";
while(!(str = sc.nextLine()).equals("q")){
poem+=str;
poem+="\n";
}
try{
writer = new FileWriter("poem2.txt");
writer.write(poem);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
writer.close();
}catch(Exception e2){}
}
}
}
파일 Copy
import java.io.FileReader;
import java.io.FileWriter;
public class FileCopy {
public static void main(String[] args) {
FileReader fileRead = null;
FileWriter fileWrite = null;
String text = new String();
try{
fileRead = new FileReader("poam.txt");
while(true){
int value = fileRead.read();
if(-1 ==value)
break;
text+=(char)value;
}
// 쓰기
fileWrite = new FileWriter("poam_copy.txt");
fileWrite.write(text);
}catch(Exception e){
System.out.println(e.getMessage());
}finally {
try{
fileRead.close();
fileWrite.close();
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
객체를 Bytes로 변환
- nodestream : 제일 앞에 있는 스트림
- filterstream : 연결되어있는 스트림
- 객체를 데이터로 써서 txt파일로 저장하면 데이터를 재사용할 수 있다
- Seiralizable 한 class라면 직렬화 가능(오버라이딩 x)
- 클래스의 멤버객체들도 Seiralizeable 되어있어야 직렬화 가능
- ArrayList는 기본적으로 직렬화 가능하지만, 그 안의 객체도 Seiralizedable되어 있어야 가능하다
- transient키워드를 쓰면 데이터가 null로 넘어간다(숨기고 싶은 필드에 사용)
Byte Stream class
- FileInputStream : 디렉토리에 있는 파일의 내용을 직렬화 한다
- ObjectInputStream : 직렬화한 정보를 객체 타입으로 변환한다
- FileOutputStream : 파일에 바이트 내용을 입력한다(역직렬화)
- ObjectOutputStream : 파일이나 객체 정보를 바이트로 변환한다
SerialExam.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerialExam {
Member m;
public void read(){ //파일에 있는 Member객체 역직렬화
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream("object.ser"));
m = (Member)ois.readObject(); // 파일에 직렬화 완성
} catch(Exception e){
e.printStackTrace();
}finally {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void write(){ //Member객체를 생성 파일에 직렬화
m = new Member("가가가", 20);
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("object.ser"));
oos.writeObject(m);
} catch (Exception e) {
// TODO: handle exception
}finally{
try{
oos.close();
}catch(Exception e2){
}
}
}
public static void main(String[] args) {
SerialExam se = new SerialExam();
se.write();
se.m = null;
se.read();
System.out.println(se.m);
}
}
Meber.java
package kosta.io;
import java.io.Serializable;
public class Member implements Serializable {
private String name;
private int age;
public Member(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Member [name=" + name + ", age=" + age + "]";
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}