Java - IO (응용)

2025. 2. 6. 13:26·Java

1. ASCII (Stream + Reader,Writer)

buffered보다 더 빠름!

package io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class file22 {
	public static void main(String[] args) {
		try {
			System.out.println("입력값 : ");
			//InputStreamReader : Stream + Reader를 합쳐서 사용하며 변환 가능한 라이브러리 (Stream과 Reader 왔다리갔다리하며 사용)
			InputStreamReader isr = new InputStreamReader(System.in);
			
            /* //StreamReader 입력된 값을 ASCII 코드로 변환되어 출력 
			int data = isr.read();
			System.out.println(data);
			*/
			BufferedReader br = new BufferedReader(isr);	
			System.out.println(br.readLine());		//메모리에 저장된 값을 읽어들임
			br.close();
			isr.close();
            
			OutputStreamWriter osw = new OutputStreamWriter(System.out);
			BufferedWriter bw = new BufferedWriter(osw);
			
			//객체 하나로 Stream, Writer를 혼합하여 사용하는 코드 
//			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));	//위 두줄을 줄여 씀	-> 하나만 닫아도됨 (숙달되면 사용하기) 
			String msg = "주문하신 물품이 배송중에 있습니다.";
			bw.write(msg);
			bw.close();
			osw.close();	
		}catch (Exception e) {
			System.out.println("코드 에러!");
		}
	}		
}
  • StreamReader, StreamWriter
    • Stream [byte], Reader [String]
    • 채팅할때 필요 : 입력된 채팅을 바이트로 받아 바이트를 채팅으로 띄움 
    • Stream이 붙으면 무조건 byte!!!!
    •  Reader가 붙으면 무조건 String!!!!

  • InputStreamReader는 중간다리 역할 
    InputStream > InputStreamReader > Reader or BufferedReader
    Reader or BufferedReader >InputStreamReader > InputStream

  • InputStreamReader : Stream + Reader를 합쳐서 사용하며 변환 가능한 라이브러리
    • Stream과 Reader 왔다리갔다리하며 사용
  • StreamReader 입력된 값을 ASCII 코드로 변환되어 출력 

2.Stream + Reader, Writer + Buffered

  • InputStream > BufferedReader (X)
  • InputStream > BufferedInputStream (O)
  • InputStreamReader > BufferedReader (O)
  • InputStream > InputStreamReader > BufferedReader (O)
  • FileInputStream > BufferedReader (X)
package io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

//Stream + Reader, Writer + Buffered (응용편)
public class file23 {
	public static void main(String[] args) throws Exception {	//throws Exception 썼기때문에 안에서 try~catch 안해도됨 
		String url = "/Users/nayeong/Documents/Eclipse/basic_html/src/main/java/io/paper.txt";
		File f = new File(url);
		FileOutputStream fs = null;
		OutputStreamWriter osw = null;
		BufferedWriter bw = null;
		
		FileInputStream is = null;
		InputStreamReader isr = null;
		BufferedReader br = null;
		/*
			FileOutputStream(byte로 최종저장) 
			=> OutputStreamWriter(String-> byte 변환시켜줌) 
			=> BufferedWriter(메모리에 문자를 등록)		
			이렇게 하면 byte가 필요가 없어짐!
		 */
		
		//문자열을 파일에 저장 
		/*
		fs = new FileOutputStream(f, true);	//true는 여기에 해야함 다른곳에 써도 의미가 없음 
		osw = new OutputStreamWriter(fs);
		bw = new BufferedWriter(osw);	//채팅은 여기에 저장돼있다가 위로위로 올라가는거 
		bw.append("홍길동님 5000원 결제되었습니다.");
		bw.newLine();	// = \n
		bw.append("삼성카드 5000원 결제");
		*/
		
		//input 파일 로드 
		is = new FileInputStream(f);		//byte
		isr = new InputStreamReader(is);	//byte => String 변환 
		br = new BufferedReader(isr);		//String
		String txt = "";
		do {
			System.out.println(txt);
		}while((txt = br.readLine())!=null);
		
//		bw.close();
//		osw.close();
//		fs.close();		
		
		br.close();
		isr.close();
		is.close();
	}
}
  • Buffered는 단독으로는 절대 못쓴다 무조건 다른친구들이랑 함께해야함 

3. CSV 데이터 저장, 출력

엑셀파일, 다른 부서에서 주는 파일 처리

package io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

//CSV 데이터 저장 (엑셀같은거)
//다른부서에서 주는 파일 처리 
public class file24 {
	public static void main(String[] args) {
		file_csv fc = new file_csv();
//		fc.csv_save();
		fc.csv_load();
	}
}

class file_csv{
	String url = "/Users/nayeong/Documents/java_etc/csv_file/member.csv";
	File f = null;
	
	FileWriter fw = null;
	BufferedWriter bw = null;
	
	FileReader fr = null;
	BufferedReader br = null;
	
	//해당 데이터 배열을 CSV에 저장하는 메소드 
	public void csv_save() {
		try {
			//Charset.forName("euc-kr") : 한글전용 언어셋 
			//csv 파일 형태 (,)기준으로 구분 
			this.f = new File(url);	//해당 경로를 load하는 객체 생성 
			this.fw = new FileWriter(this.f, Charset.forName("euc-kr"));	//해당 파일에 데이터를 저장
			this.bw = new BufferedWriter(this.fw);	//메모리를 활용하여 파일에 저장
			List<String> mb = new ArrayList<>();
			mb.add("유재석,ISFP");	//, 기준으로 열 구분하게 도미(csv) 
			mb.add("강호동,ENFP");
			mb.add("조정석,INTP");
			mb.add("차은우,ENTP");
			for(String m : mb) {
				this.bw.write(m + "\n");
				this.bw.flush();	//write 사용시 flush 메모리 초기화 
			}
			this.bw.close();
			this.fw.close();
		}catch (Exception e) {
			System.out.println("해당 경로에 CSV 파일이 존재하지 않습니다.");
		}
	}
	
	//해당 CSV 파일에 있는 데이터를 출력
	public void csv_load() {
		this.f = new File(url);
		try {
			this.fr = new FileReader(this.f);
			this.br = new BufferedReader(this.fr);	//Stream으로 읽어와됨 
			String csv_data = "";
			while((csv_data = this.br.readLine()) != null) {
//				System.out.println(csv_data);	//모두 출력
				
				//이름만 출력
				//split은 해당 문자 기준으로 원시배열로 생성하는 메소드 
				String user[] = csv_data.split(",");
				if(user[1].equals("INTP")){		//해당되는 배열 값중 INTP라면 
					System.out.println(user[0]);	//사용자명 출력 
				}
			}
			this.br.close();
			this.fr.close();
		}catch (Exception e) {
			System.out.println("해당 경로에 파일이 없음");
		}
	}
}

 

😊응용문제

http://mekeyace.dothome.co.kr/user.csv
해당 데이터를 운영팀에서 전달받은 상황입니다.
해당 csv 데이터 값을 사용하여 다음과 같은 결과가 되도록 코드를 작성합니다.
사용자 정보중 통신사 : SKT, KT, LGT, 알뜰폰
각각의 통신사별로 CSV를 저장하시오.
SKT.CSV
KT.CSV
LGT.CSV
알뜰폰.CSV

 

내 코드 

package io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.nio.charset.Charset;
import java.util.Scanner;

//CSV 데이터 응용편
public class file25 {
	public static void main(String[] args) {
		file25_box fb = new file25_box();
		fb.menu();
	}
}

class file25_box{
	String u = "/Users/nayeong/Documents/java_etc/csv_file/";
	String url = u + "user.csv";
	String url1 = u + "SKT.csv";
	String url2 = u + "KT.csv";
	String url3 = u + "LGT.csv";
	String url4 = u + "알뜰폰.csv";
	String cu = "";
	File f = null;
	FileWriter fw = null;
	BufferedWriter bw = null;
	FileReader fr = null;
	BufferedReader br = null;
	Scanner sc = null;
	
	public void menu() {
		try {
			System.out.println("user.csv를 분리하시겠습니까?\n1. 분리\n2. 분리안함\n입력 : ");
			this.sc = new Scanner(System.in);
			int n = sc.nextInt();
			if(n==1) {
				this.user_csv();
			}else if(n==2) {
				this.select_corp();
			}else {
				System.out.println("1~2 선택하세요");
				this.menu();
			}
		}catch (Exception e) {
			System.out.println("오류발생");
			this.menu();
		}finally {
			this.sc.close();
		}
	}
	
	private void user_csv() {
		this.f = new File(url);
		try {
			this.fr = new FileReader(this.f, Charset.forName("euc-kr"));
			this.br = new BufferedReader(this.fr);
			String csv_data = "";
			while((csv_data = this.br.readLine()) != null) {				
				String corp[] = csv_data.split(",");
				if(corp[1].equals("SKT")){	//SKT에 저장
					this.cu = url1;
					this.corp_split_save(csv_data);
				}else if(corp[1].equals("KT")){
					this.cu = url2;
					this.corp_split_save(csv_data);
				}else if(corp[1].equals("LGT")){
					this.cu = url3;
					this.corp_split_save(csv_data);
				}else if(corp[1].equals("알뜰폰")){
					this.cu = url4;
					this.corp_split_save(csv_data);
				}   
			}
			
			System.out.println("파일 분리 완료");
			this.select_corp();
			
			this.br.close();
			this.fr.close();
		}catch (Exception e) {
			System.out.println("해당 경로에 파일이 없음");
		}
	}
	
	private void corp_split_save(String data) {
		try {
			this.f = new File(this.cu);	
			this.fw = new FileWriter(this.f, Charset.forName("euc-kr"), true);	
			this.bw = new BufferedWriter(this.fw);
			this.bw.write(data + "\n");
			this.bw.close();
			this.fw.close();
		}catch (Exception e) {
			System.out.println("해당 경로에 CSV 파일이 존재하지 않습니다.");
		}
	}
	
	private void select_corp() {
		System.out.println("확인할 파일 선택\n1. SKT\n2. KT\n3. LGT\n4. 알뜰폰\n확인할 파일 선택 : ");
		try {
			this.sc = new Scanner(System.in);
			int n = sc.nextInt();
			sc.close();
			if(n==1) {
				this.cu = url1;
				csv_load(1);
			}else if(n==2) {
				this.cu = url2;
				csv_load(2);
			}else if(n==3) {
				this.cu = url3;
				csv_load(3);
			}else if(n==4) {
				this.cu = url4;
				csv_load(4);
			}else {
				System.out.println("1 ~ 4 입력하세요");
			}
		}catch (Exception e) {
			System.out.println("잘못된 입력");
			this.select_corp();
		}		
	}
	
	private void csv_load(int n) {
		this.f = new File(this.cu);
		try {
			this.fr = new FileReader(this.f, Charset.forName("euc-kr"));
			this.br = new BufferedReader(this.fr);
			String csv_data = "";
			while ((csv_data = this.br.readLine()) != null) {
				System.out.println(csv_data);
			}
			this.br.close();
			this.fr.close();
		} catch (Exception e) {
			System.out.println("해당 경로에 파일이 없음");
		}
	}
}

 

선생님 DTO 파일 

package io;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
//고객명, 통신사, 생월
public class io_DTO {
	String nm, corp, birth;
	public String getNm() {
		return nm;
	}
	public void setNm(String nm) {
		this.nm = nm;
	}
	public String getCorp() {
		return corp;
	}
	public void setCorp(String corp) {
		this.corp = corp;
	}
	public String getBirth() {
		return birth;
	}
	public void setBirth(String birth) {
		this.birth = birth;
	}	
	//키배열 
	public Map<String, String> datalist2(){
		return null;
	}
	//List 1차배열을 생성 (getter 메소드를 이용)
	public List<String> datalist(){
		List<String> all = new ArrayList<String>();
		all.add(getNm());		//고객명 
		all.add(getCorp());		//통신사 
		all.add(getBirth());	//생
		return all;
	}
}

 

선생님 코드 

package io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

//선생님 코드
//io_DTO.java와 연동
public class file25_t {
	public static void main(String[] args) {
		new csv_members();
	}
}

class csv_members{
	//DTO 클래스를 필드에 로드하여 setter, getter 활용함 
	io_DTO dto = null;	//클래스 로드
	String url = "/Users/nayeong/Documents/java_etc/csv_file/user.csv";	//원본파일
	String copys = "/Users/nayeong/Documents/java_etc/csv_file/";
	
	InputStream is = null;
	InputStreamReader isr = null;
	BufferedReader br = null;
	
	OutputStream os = null;
	OutputStreamWriter osw = null;
	BufferedWriter bw = null;
	final String telcorp[] = {"SKT","KT","LGT","알뜰폰"};
	
	
	public csv_members() {
		this.dto = new io_DTO();
		try {
			this.check_members();
		} catch (Exception e) {
			System.out.println("해당 각 통신사별 분배작업 오류발생");
		}
	}
	
	private void check_members() throws Exception{	//각 통신사별 분배작업 및 저장
		File f = new File(this.url);	//원본 
		File f2 = new File(this.copys);	//경로 
		
		try {
			int w = 0;
			//각 통신사별로 csv를 분할하여 저장하는 코드 
			while(w<this.telcorp.length) {
				List<List<String>> result = this.corp_arr(this.telcorp[w], f);
				
				//2차배열 데이터 foreach로 반복하여 해당 파일에 데이터를 저장 
				for(List<String> p : result) {
					String newfile = f2 + "/" + this.telcorp[w] + ".csv";	//f2 + "/" = this.copys 라고 써도됨 
//					System.out.println(newfile);	//File에서 String으로 변환하면 경로가 마지막/가 사라짐 그래서 이상하게 나옴	 여기서 /추가해주  
					
					/*	// 다른 방법 
					String newfile = this.copys + this.telcorp[w] + ".csv";	//=> f2가 필요없게됨 
				 	//File을 가지고 이걸 만들어야지 String인 newfile을 createNewFile을 때리면 오류남 
					File f3 = new File(newfile);
					f3.createNewFile();	
					 */
					
					//join <-> split
					//String.join : 배열을 해당 문자 기준으로 문자열로 변환  
					String word = String.join(",", p);
					
					//여기서 newfile 대신 f2 + "/" + this.telcorp[w] + ".csv" 넣으면 =>  File을 넣어야하는데 String을 넣어서 오류남
					//해당 파일을 생성하면서 데이터를 보존(true)하도록 셋팅한 코드 
					this.os = new FileOutputStream(newfile, true);	//true는 여기에 사용
					//byte => String 언어셋 
					this.osw = new OutputStreamWriter(this.os, Charset.forName("euc-kr"));
					//String => 메모리에 등록시켜서 저장 
					this.bw = new BufferedWriter(this.osw);
					this.bw.write(word);
					this.bw.newLine();	//\n과 동일 
					this.bw.flush();	//메모리를 비워서 재활용할 수 있도록 조정					
				}
				w++;				
			}
		}catch (Exception e) {
			System.out.println("파일이 올바르게 생성 및 데이터 오류가 발생하였습니다.");			
		}finally {
			this.bw.close();
			this.osw.close();
			this.os.close();
		}
	}
	
	//해당 파일을 오픈하여 1차 배열에 해당 데이터를 모두 수집하고 2차 배열로 연동하는 메소드 
	//메소드에 매개변수는 다양한 자료형 선언문을 생성할 수 있음 모든 자료형 가능 
	private List<List<String>> corp_arr(String corp, File f) throws Exception{
		List<List<String>> csvdata = new ArrayList<List<String>>();	//2차 배열 return
		try {	//프로세서 진행 
			this.is = new FileInputStream(f);	//해당 경로에 파일을 오픈 (로드) => byte
			this.isr = new InputStreamReader(this.is, Charset.forName("euc-kr"));	//byte => String : 그래서 여기에 언어셋을 설정함! String이니까!
			this.br = new BufferedReader(this.isr);	//String 데이터를 메모리에 저장 : 메모리에 이미저장했는데 언어셋설정 불가능 변환할때 언어셋설정해야함 
			
			String data = "";	//Buffered에 있는 문자를 담는 역할을 하는 변수  
			
			while((data=this.br.readLine())!=null){	//해당 조건형태 buffer에 더이상 문자가 없을 경우 반복문 종료
				List<String> recall = new ArrayList<String>();
				String part[] = data.split(",");
				if(part[1].equals(corp)) {
					this.dto.setNm(part[0]);
					this.dto.setCorp(part[1]);
					this.dto.setBirth(part[2]);
					recall = this.dto.datalist();	//dto에서 생성된 1차 배열값을 return
					csvdata.add(recall);	//생성된 1차 배열을 2차 배열에 추가 
				}
			}
			
		}catch (Exception e) {	//예외처리 
			System.out.println("파일 불러오기에 오류가 발생하였습니다.");
		}finally {	//파일종료 => 원래 밑에 애들 하려면 try~catch 써야하는데 해당 메소드에  throws Exception을 사용해서 안써도 됨 
			this.br.close();
			this.isr.close();
			this.is.close();
		}
		return csvdata;
	}
}
저작자표시 비영리 변경금지 (새창열림)
'Java' 카테고리의 다른 글
  • Java - network
  • 복습11 - IO
  • Java - IO (binary)
  • Java - IO (ASCII)
9na0
9na0
응애
  • 9na0
    구나딩
    9na0
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • Web (118)
      • Java (28)
      • 데이터베이스 (14)
      • 세팅 (12)
      • 과제 (3)
      • 쪽지시험 (2)
      • 정보처리기사 (4)
      • 서버 (25)
  • 블로그 메뉴

    • 링크

      • 포폴
      • 구깃
    • 공지사항

    • 인기 글

    • 태그

      noticewriteok
      Oracle
      net2
      net3
      spring-boot
      re_java10
      ab1
      io_dto
      net4
      notice_writer
      java_io1~10
      exam1_1~10
      file24
      net5~10
      net1
      macbook pro m4
      re2
      datalist
      file25
      file25_t
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    9na0
    Java - IO (응용)
    상단으로

    티스토리툴바