Input / Output
프로그램 상 전역변수를 넘어 컴퓨터 내부 외부 장치와 데이터를 주고 받는 것 (후에 컴퓨터와 컴퓨터를 네트워크로 연결)
public void primaryStream() {
System.out.print("저장할 파일명 입력 : ");
String filename = sc.nextLine();
// 나가는 방향 스트림과 연결
FileOutputStream fos = null;
try {
// 입력받은 파일명으로 파일 생성
// 생성된 파일과 프로그램이 stream연결
fos = new FileOutputStream("C:\\Users\\greys\\Desktop"+filename);
System.out.println("["+filename+"]에 저장될 내용을 입력하세요");
System.out.println("종료는 exit를 입력하세요");
// 파일로 데이터를 내보내는 역할
while(true) {
System.out.print("내용 입력 : ");
String str = sc.nextLine()+"\r\n";
if(str.equals("exit\r\n")) {
break;
}
byte[] arr = str.getBytes(); //문자열을 바이트 배열로 변환
// 이유 : write메서드의 매개변수가 byte[]타입이기 때문
fos.write(arr);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FileInputStream fis = new FileInputStream ("text.txt")
// 주스트림
BufferedInputStream bis = new BufferedInputStream (fis)
// 보조스트림에 주스트림을 넣어 성능 향상
bis.read;
BufferWrite
외부로 데이터를 내보내기
public void subStream() {
System.out.print("저장할 파일명 입력 : ");
String filename = sc.nextLine();
// 파일 이름을 입력받는다
BufferedWriter bw = null;
// 보조스트림 생성
try {
FileWriter fw = new FileWriter(filename);
// 주스트림 생성
bw = new BufferedWriter(fw);
// 주스트림에 보조스트림 추가
System.out.println("["+filename+"]에 저장할 내용 입력 ");
System.out.println("종료는 exit");
while(true) {
System.out.print("입력 : ");
String str = sc.nextLine(); //엔터 안씀
if(str.equals("exit")) {
break;
}
bw.write(str); //보조스트림을 통한 데이터 전송
bw.newLine(); // 보조스트림에 존재하는 줄 개행 기능
}
}catch(IOException e ){
e.printStackTrace();
} finally {
try {
// 보조스트림 반환 시 주스트림은 자동으로 반환
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferReader
외부에 저장된 데이터를 읽어오기
public void charStreamReader() {
//1. 스트림 생성하고 2. 메서드를 통한 입력 3. 자원반환
System.out.println("로드할 파일명 입력 : ");
String filename = sc.nextLine();
// 데이터를 읽어올 보조스트림
BufferedReader br = null;
// 주스트림
try {
FileReader fr = new FileReader(filename);
br = new BufferedReader(fr);
// 보조스트림 안에 주스트림을 넣는 것은 똑같다
while(true) {
try {
// readLine() : 스트림이 연결된 파일에서 1줄 읽어옴
// 더이상 읽어올 내용이 없는 경우 null 리턴
String str = br.readLine(); //2. 메서드를 통한 입력
if(str == null) {
break; //nu11이면 멈춘다
}
System.out.println(str); // null이 아니면 화면에 출력
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
파일 시스템의 파일을 표현하는 클래스
파일크기, 파일속성, 파일이름 등 정보를 제공하며 파일 생성 및 삭제 기능 제공
내 컴퓨터
부터 찾아가는 경로현재 위치 기준
으로 찾아가는 경로객체를 스트림으로 전송하기 위해 바이트 단위로 잘라주는 것
java.io.Serializable을 implements 해서 사용
implements
가 붙을 수 있는지로 객체 직렬화 가능여부 판단transient
: 객체 직렬화 시 제외할 필드 앞에 붙여 해당 필드의 직열화를 예외로 하는 키워드// 내보낼 객체(직렬화 할 클래스에 implements Serializable)
public class User implements Serializable {
private String id;
private transient String pw;
// 직렬화 할 때 빼고 하라는 명령어
private String name;
private int age;
}
// 객체를 내보내기 위한 코드 : ObjectOutputStream
public void test1() {
//회원정보Scanner로 입력받아
User u = new User(id, pw, name, age);
//User타입 객체 생성
ObjectOutputStream oos = null;
try {
FileOutputStream fis = new FileOutputStream("object.txt");
oos = new ObjectOutputStream(fis);
oos.writeObject(u); //매개변수= 최고조상인 object
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
이렇게 내보낸 객체는 자바가 알아볼 수 있는 언어로 저장된다 > 해당 파일을 다시 불러오기 위해서는 FileInputStream을 사용한다 >
//직렬화를 통해 내보낸 데이터를 불러오기
public void test2() {
// 보조스트림 먼저 생성
// 보조스트림은 finally에서도 사용하기 때문에
// try전에 생성하여 null값을 넣는다
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream("object.txt");
ois = new ObjectInputStream(fis);
try {
User u = (User)ois.readObject();
// Object타입으로 반환되기 때문에 downcasting
System.out.println(u.getId());
System.out.println(u.getPw());
System.out.println(u.getName());
System.out.println(u.getAge());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Class ArrayList<E>
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<E>
java.util.ArrayList<E>
All Implemented Interfaces:
**Serializable**, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
API문서를 통해 ArrayList도 직렬화가 가능하다는 것을 알 수 있다