22.07.08-Hash Map, 파일 관리
Hash Map = 검색이 빠름, 메모리 낭비가 심함
//파일 스트림 (객체를 저장할 곳)
FileOutputStream fileOutputStream = new FileOutputStream(file);
//객체 저장 스트림(객체를 파일과 연결)=>파이프연결
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
JAVA File control
package FileWritePackage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class FileWriteClass {
public static void main(String[] args) throws IOException{
//파일스트림
//객체담당클래스 <----------> 파일담당클래스 <---------> 하드웨어(하드디스크/usb드라이브/네트워크)
//파일스트림(객체를 저장할곳은 이곳이다)
FileOutputStream fileStream = new FileOutputStream("D:\\tmp\\save.object");
//객체저장스트림(객체를 파일스트림과 연결한다.)-파이프연결
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileStream);
//저장할객체들의 내용과 그것들을 컨테이너에 저장해둠(고객들의 이름만 저장해본다)
ArrayList<String> userNames = new ArrayList<String>();
userNames.add("kim");
userNames.add("lee");
//컨테이너에 저장된것들을 통째로 파일에 저장한다.(객체스트림-->파일스트림-->실제파일에 저장)
objectOutputStream.writeObject(userNames);
objectOutputStream.close();//스트림들을 닫는다.
}
}
package FileWritePackage;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
public class FileReadClass {
public static void main(String[] args) throws ClassNotFoundException, IOException {
// 하드디스크의 특정파일과 fileStream 레퍼런스를 연결해준다.
// 그러면, 이제부터는 fileStream이라는게 파일을 담당한다.(이걸로 접근할수있다는 얘기이다)
FileInputStream fileStream = new FileInputStream("D:\\tmp\\save.object");
// 프로그래머가 객체작업을 하려면 ObjectInputStream 을 사용해야한다.
// 그래서 ObjectInputStream 과 fileStream 을 연결해줘야함.
// 그러면 결론적으로 *객체작업담당 <--------> *파일작업담당 이렇게 연결된다.
ObjectInputStream objectInputStream = new ObjectInputStream(fileStream);
//연결은 다 되었지만, 데이터를 파일에서 읽어와서 메모리에 저장해준다음이 문제임.
//읽어온 객체가 어떤타입인지 모르기때문에 반드시 타입캐스팅(그게 원래 어떤객체였는지) 을 해줘야함.
//우리는 사람이름(String타입) 을 저장했었기 땜에 그것으로 타입캐스팅해야함.
Object object = objectInputStream.readObject();
//원래 저장할때 컨테이너타입이 ArrayList 였다. 그러므로 일단 그타입으로 캐스팅해야함
//그다음, 그안에 들어있는 각각의 객체가 String타입이었음.
//각각의 String타입객체를 뽑아서 화면에 출력해야함.
//데이터파싱(Parsing)
ArrayList<String> members = (ArrayList<String>) object;
System.out.println(members.size());
System.out.println(members.get(0));//첫번째고객의 이름
System.out.println(members.get(1));//두번째고객의 이름
objectInputStream.close();
}
}
Store
package Convenience_Store_Package;
import java.io.*;
import java.util.ArrayList;
public class Product implements Serializable{
int serial_no;
String name;
int price;
int quantity;
String expired;
public Product(int serial_no, String name, int price, int quantity, String expired) {
this.serial_no = serial_no;
this.name = name;
this.price = price;
this.quantity = quantity;
this.expired = expired;
}
public int getSerial_no() {
return serial_no;
}
public void setSerial_no(int serial_no) {
this.serial_no = serial_no;
}
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;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public String getExpired() {
return expired;
}
public void setExpired(String expired) {
this.expired = expired;
}
public String toString() {
return "Product{" +
"serial_no=" + serial_no +
", name='" + name + '\'' +
", price=" + price +
", quantity=" + quantity +
", expired='" + expired + '\'' +
'}';
}
}
package Convenience_Store_Package;
import javax.swing.*;
import java.io.*;
import java.util.ArrayList;
import java.io.Serializable;
import java.util.Scanner;
public class play {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ArrayList<Product> m = new ArrayList<>();
Product c = null;
//sample data
c = new Product(1,"coffee",1000,5,"23.05.01");
m.add(c);
c = new Product(2,"snak",500,7,"23.05.01");
m.add(c);
c= new Product(3,"naasd",6000,4,"12341234");
m.add(c);
fileInput(m);
fileOutput();
}
public static void fileInput(ArrayList<Product> m ) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("D:\\temp\\store.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bufferedOutputStream);
objectOutputStream.writeObject(m);
objectOutputStream.close();
}
public static void fileOutput() throws IOException, ClassNotFoundException {
//파일과 연결시키는 부분(파일 스트림)
FileInputStream fileInputStream = new FileInputStream("D:\\temp\\store.txt");
//커스텀 클래스(직접제작한 특수한 클래스)를 연결시키는 부분
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
//최종적으로 객체의 읽기(READ)를 위한 부분
ObjectInputStream objectInputStream = new ObjectInputStream(bufferedInputStream);
// //한개를 읽어와서 p1에 저장
// Product p1 =(Product) objectInputStream.readObject();
// //두번째 객체 연결
// Product p2 = (Product) objectInputStream.readObject();
//저장했던 자료구조의 형태정보를 읽어온다.
ArrayList list = (ArrayList) objectInputStream.readObject();
System.out.println(list.size());
Product p = (Product) list.get(0);
System.out.println(p.toString());
objectInputStream.close();//스트림들을 닫는다.
}
}
상속
Member 개선
README.md
=======================================================================================
메뉴 + 파일입출력 + 클래스코딩 + 상속
=======================================================================================
@회원정보 클래스를 확장해서 데이터를 추가한다.
*성별(Boolean타입) : boolean
*주소(문자열) : String
*나이(정수형) : int
@새로운 데이터에 대한 셋터/겟터/풋터를 만들어준다.
=======================================================================================
제작할 프로그램 내용
(1)회원정보클래스를 기존의 클래스는 조상클래스(Base), 새로운 클래스는 후손클래슬(Child)로 사용함
(2)실제 만들어지는 객체는 새로운 클래스로 만들고, 그것들을 리스트에 저장하는 방식을 사용함
(3)회원정보는 최초에 1회입력(초기멤버정보) 해주고, 그것을 파일에 저장해줌
(4)그 다음부터는 기존의 파이에 저장된 데이터를 불러오는 식으로 처리
=======================================================================================
메뉴구성
[1]회원정보등록
[2]회원정보 불러오기
[3]회원정보 출력하기
======================================================================================
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
public class play {
public static void main(String[] args) throws IOException, ClassNotFoundException {
setInfo member = null;
ArrayList<setInfo> list = new ArrayList<>();
Scanner input = new Scanner(System.in);
member = new setInfo("aaa","seoul",true,25);
list.add(member);
// fileInput(list);
// fileOutput();
//메뉴 구성"
System.out.println("menu");
System.out.println("===================================================");
System.out.println("1. info input ");
System.out.println("2. Read Member ");
System.out.println("3. Print Member ");
System.out.println("==================================================");
while(true){
switch (Integer.parseInt(input.nextLine())){
case 1 :
System.out.println("number of repetitions");
member.Input(Integer.parseInt(input.nextLine()));
list.add(member);
fileInput(list);
break;
case 2:
fileOutput();
break;
case 3 :
filePrint();
break;
default:
System.err.println("Error");
continue;
}
}
}
public static void fileInput(ArrayList<setInfo> m ) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("D:\\temp\\Member.txt",true);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bufferedOutputStream);
objectOutputStream.writeObject(m);
objectOutputStream.close();
}
public static void fileOutput() throws IOException, ClassNotFoundException {
FileInputStream fileInputStream = new FileInputStream("D:\\temp\\Member.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
ObjectInputStream objectInputStream = new ObjectInputStream(bufferedInputStream);
ArrayList list = (ArrayList) objectInputStream.readObject();
System.out.println(list.size());
objectInputStream.close();
}
public static void filePrint() throws IOException, ClassNotFoundException {
FileInputStream fileInputStream = new FileInputStream("D:\\temp\\Member.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
ObjectInputStream objectInputStream = new ObjectInputStream(bufferedInputStream);
ArrayList list = (ArrayList) objectInputStream.readObject();
setInfo p = (setInfo) list.get(0);
System.out.println(p.toString());
objectInputStream.close();
}
}
import java.io.Serializable;
import java.util.Scanner;
public class Member implements Serializable {
private String name,address;
private boolean sex;
private int age;
public Member(String name, String address, boolean sex, int age) {
this.name = name;
this.address = address;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
String temSex;
if(sex){
temSex = "man";
}else {
temSex = "woman";
}
return "Member{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", sex=" + temSex +
", age=" + age +
'}';
}
}
class setInfo extends Member{
public setInfo(String name, String address, boolean sex, int age) {
super(name, address, sex, age);
}
public void Input(int idx){
Scanner input = new Scanner(System.in);
for(int i =0; i<idx; i++) {
System.out.println("your name : ");
super.setName(input.nextLine());
System.out.println("your address : ");
super.setAddress(input.nextLine());
System.out.println("Are you man? : ");
super.setSex(Boolean.parseBoolean(input.nextLine()));
System.out.println("Your Age? : ");
super.setAge(Integer.parseInt(input.nextLine()));
}
}
}
디버깅
객체를 이용하여 저장할때 “직렬화”라는 것이 필요한데 이를 객체 클래스 옆에 implements Serializable 를 입력한다 이를 객체 직렬화 라고한다.
implements Serializable 는 인터페이스 이다.
Java_Study_SL/Day5/Convenience_Store at master · dltmdcks98/Java_Study_SL
Scanner 사용시 next~에 버퍼가 남는다 next자료형 → nextLine()으로 사용하면 해결됨
'Program > JAVA' 카테고리의 다른 글
| 주차장 관리 프로그램 (0) | 2022.12.25 |
|---|---|
| JDBC, 쿼리문(Query) (0) | 2022.12.25 |
| 플러시(Flush) (0) | 2022.12.25 |
| Bank Project, CMD에서 JAVA실행 (2) | 2022.08.28 |
| Score Project, Memberinfo_Project, ArrayList, 은행 입출금 프로젝트 (0) | 2022.08.28 |