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;
}
}