본문 바로가기
Backend

06월 11일 화 | OOP 17 - JAVA의 데이터 입출력과 Stream

by 구라미 2019. 6. 11.

13. Java의 데이터 입출력

Java에서 출력

콘솔창에 출력하는 것은 일시적인 확인을 위한 것. 브라우저에 출력되게 하는 법을 알아야한다.

 

출력서식 예시 1)

"" <- 자바에서 문자열을 뜻하는 예약어. 

문자 쌍따옴표기호를 출력하고 싶을때 " "" " 이렇게 하면 에러가 뜬다.

명령어,예약어 이전에 기호이기 때문에 그 기호를 출력하고 싶을 때가 있다. 그럴 때 특정 방법을 써야한다.

System.out.println("JAVA");
System.out.println("C++");
System.out.println("박지성");
System.out.println("손흥민");
//System.out.println(" "" "); 에러

//큰따옴표 ("") 출력
System.out.println("\"나는 자연인이다.\""); //역슬래시를 추가하고 표기

//\기호 출력
System.out.println("\\D:\\");//경로를 표기할 때도 \를 쓰므로 그럴때 \\ 이렇게 두번 사용해야 에러X
System.out.println("D:/"); //아니면 슬래시로 쓰기

//줄바꿈 \n
System.out.println("사과\n딸기");
System.out.println("수박\n\n\n바나나");

//결과값
//JAVA
//C++
//박지성
//손흥민
//"나는 자연인이다."
//\D:\
//D:/
//사과
//딸기
//수박
//
//
//바나나

 

출력서식 예시 2)

%로 시작하는 출력 포맷도 있다.

%d : 10진 정수값을 출력할 때.

%f : 실수형.

%c : 문자형.

%s : 문자열형.

 

정수형 printf

System.out.printf("%d %d %d \n" ,1 ,3 ,5 );
System.out.printf("%d, %d, %d\n" ,1 ,3 ,5 );
System.out.printf("%d \t %d \t %d\n" ,1 ,3 ,5);
		
System.out.printf("#%5d#\n",2); //양수 오른쪽정렬
System.out.printf("#%-5d#\n",2);//음수 왼쪽 정렬

//결과값
//1 3 5 
//1, 3, 5
//1 	 3 	 5
//#    2#
//#2    #

실수형 printf

System.out.printf("%f %f %f \n", 1.2, 3.4, 5.6);
System.out.printf("#%6.2f# \n", 7.8);
System.out.printf("#%-6.2f# \n", 7.8);
System.out.printf("#%.2f# \n", 7.8);

//결과값
//1.200000 3.400000 5.600000 
//#  7.80# 
//#7.80  # 
//#7.80# 

 

캐릭터형 printf

System.out.printf("%c %c %c \n", 's', 'k', 'y');
System.out.printf("#%5c# \n", 'R');
System.out.printf("#%-5c# \n", 'r');

//결과값
//s k y 
//#    R# 
//#r    # 

문자열형 printf

System.out.printf("%s %s %s \n","year","month","date");
System.out.printf("#%8s# \n", "Sky");
System.out.printf("#%-8s# \n", "Sky");

//결과값
//year month date 
//#     Sky# 
//#Sky     # 

 

File 클래스

java.io 패키지에 File 클래스가 있다.

 

실제 다 실행을 해야 java가 알 수 있다.

File클래스로 파일에 대한 정보를 가져올 수 있음

File 예시 1)

package oop0611;

import java.io.File;

public class Test02_File {

	public static void main(String[] args) {
		//File 클래스
		//파일 관련 정보를 알 수 있다.
		
		try {
			//예외 발생이 예상되는 코드 작성
			
			//경로구분 기호는 \\로 한다.
			//경로명 + 파일명
			//경로구분 기호 /도 가능하다.
			String pathname = "C:\\Users\\khe\\Downloads\\highlight.zip";
			File file = new File(pathname);
			if(file.exists()){
				System.out.println("======= 파일 가져오기 성공 =======");
				
				//파일명
				String filename = file.getName();
				System.out.println(filename);
				
				//파일크기
				long filesize = file.length();
				System.out.println("파일크기: "+filesize+"Byte입니다.");
				System.out.println("파일크기: "+filesize/1024+"KByte입니다.");
				
				//경로명
				System.out.println(file.getPath()); //경로+파일명
				System.out.println(file.getParent()); //파일이 위치한 경로
				
				
			}else{
				System.out.println("파일이 없습니다.");
			}
			
		} catch(Exception e){
			//예외가 발생되면 실행할 코드 작성
			
			
			System.out.println("파일클래스 실패: "+e); //실제 파일 없으면 나온다.
		}//try end
		
		System.out.println("END");
			
		
		
	}//main end
}//class end


//결과값
//======= 파일 가져오기 성공 =======
//highlight.zip
//파일크기: 262023Byte입니다.
//파일크기: 255KByte입니다.
//C:\Users\khe\Downloads\highlight.zip
//C:\Users\khe\Downloads
//END

중복되는 파일이 있는지 해당경로에 있는지 없는지 확인하고, 파일명 변경해줘야함..

 

 

연습문제 1) 파일명과 확장명을 분리해서 출력하세요.

 

내 풀이

//파일명
String filename = file.getName();
System.out.println(filename);
				
int pos = filename.indexOf("."); //이부분
String fName = filename.substring(0,pos);
String ftype = filename.substring(pos+1);
System.out.println("파일이름은: "+fName);
System.out.println("확장자는: "+ftype);


//StringTokenizer를 이용했을 때				
StringTokenizer st = new StringTokenizer(filename,".");
String name = st.nextToken();
String typ = st.nextToken();
System.out.println(name);
System.out.println(typ);

만약 StringTokenizer를 이용한 다면 마지막 끊어지는 토큰을 알아야하지 않을까...

 

선생님 풀이

파일명 자체에 .이 들어갔을 경우를 생각 못했다.

확장명이 나오는 맨 끝 .위치를 알아야함.

int pos = filename.lastIndexOf('.'); //문자 '.'의 마지막 인덱스를 알아오기.
String fName = filename.substring(0,pos);
String ftype = filename.substring(pos+1);
System.out.println("파일이름은: "+fName);
System.out.println("확장자는: "+ftype);

 

Input

파일을 읽어오는것

Read Write

Input Output

Input 예시 1)

package oop0611;

import java.io.BufferedReader;
import java.io.FileReader;

public class Test03_Input {

public static void main(String[] args) {
// 파일 내용 읽기
	try{
	String Filename = "D:\\java0514\\workspace\\basicJava\\src\\oop0523\\Test01_Method.java";
			
	//1) 파일 가져오기
	FileReader in = new FileReader(Filename);
			
	//2) 파일 내용 읽어오기
	BufferedReader br = new BufferedReader(in); //현재 커서가 가리키는 값을 읽어옴.
	int num = 0;
	while(true){
		//3) 엔터(\n), 줄의 끝(\n) 기분으로 한 줄 씩 가져오기.
		String line = br.readLine();
		if(line==null){
			break;
		}
		System.out.printf("%4d %s\n",++num,line); //IDE처럼 앞에 숫자붙이기
        
        //5) 20줄마다 선긋기.
        if(num>0 && num%20==0){
		 System.out.println("=============== 절취선 ===============");
		}
	}
				
	//4) 자원반납
	br.close();
	in.close();		
		
	} catch (Exception e) {
	System.out.println("실패: " + e);
	}
	System.out.println("END");
		

	}//main end
}//class end

 

1) FileInputStream : 1바이트 기반

1바이트 기반이기 때문에 한글이 개지는 현상이 발생한다.

 

read(); 메소드로 글자 하나 가져오기.

커서의 기본 속성은: ~만큼 읽었으면 그 다음 것을 가리킴.

 

 

package oop0611;

import java.io.FileInputStream;
import java.io.FileReader;

public class Test04_Input {

	public static void main(String[] args) {
	// InputStream 기반과 Reader기반 비교
	// 한글은 Reader로 2byte씩 부르기 때문에.
		
	try {
		String filename = "D:\\java0514\\workspace\\basicJava\\src\\oop0523\\Test07_Homework.java";
			
	/*
	//1)FileInputStream : 1바이트 기반
	//->
	FileInputStream fis = new FileInputStream(filename);
	int data = 0;
	while(true){
		data = fis.read(); //1바이트 읽기.
		if(data==-1){ //파일의 끝 end of file
			break;
		}
		System.out.print((char)data); // 출력이 되나, 2byte언어가(한글,일어,한자) 깨짐
	}//while end
	*/
			
	//2)FileReader : 2바이트 기반
	FileReader fr = new FileReader(filename);
	int data = 0;
	while(true){
		data = fr.read();
		if(data==-1){
			break;
		}
		System.out.print((char)data);
		}
			
			
	} catch (Exception e) {
		
	}
		
		
	}//main end
}//class end

 

FileInputStream을 사용했을 때는 read(); 메소드를 사용했을 때 한글 부분이 다 깨졌었는데

FileReader를 사용했을 때는 깨지지 않고 출력된다.

그 이유는 FileInputStream은 1byte기반, FileReader는 2byte기반이기 때문이다.

 

 

Output

표준입출력: 모니터(console), 키보드, 마우스, 스캐너

파일입출력: 

 

package oop0611;

import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class Test05_Output {

	public static void main(String[] args) {
		// 파일 출력
		
		try{
			String fileName = "D:\\java0514\\sungjuk.txt"; //출력파일(sungjuk.txt)로 출력하겠다. 출력파일이 없으면 파일은 생성된다.
			//없으면 파일은 생성된다. (create)
			//있으면 추가(append) 또는 덮어쓰기(overwrite)
			//       true          ||  false
			
			FileWriter fw = new FileWriter(fileName, false); //true냐 false냐에 따라 결과가 달라진다.
			
			//autoFlush : true 버퍼 클리어
			PrintWriter out = new PrintWriter(fw, true);
			out.println("유정연,95,90,100");
			out.println("장동건,30,55,40");
			out.println("송중기,60,95,75");
			out.println("김지원,20,85,65");
			out.println("임수정,100,35,100");
			
			
		} catch(Exception e) {
			System.out.println("실패"+e);
		}
		
	}//main end
}//class end

 

 

 

연습문제 1) Sungjuk.txt의 내용을 받아와서 연산한 후 Result.txt로 출력하기

package oop0611;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.*;

class Sungjuk {
	private int no;
	private String name;
	public int score;
	public int rank;
	public Sungjuk(){}
	
	public Sungjuk(int no, String name, int a, int b, int c,int d){
		this.no = no;
		this.name = name;
		this.rank = 1;
	}
	
	

	
}

public class Test07_Sungjuk {

	public static void main(String[] args) {
		// 성적프로그램
		// 성적 입력 자료를 가져와서 -> sungjuk.txt
		// 성적 결과 파일 완성하기. -> result.txt
		
		try{
			String inName = "D:\\java\\sunjuk.txt";
			String outName = "D:\\java\\result.txt";
								
			FileWriter fw = new FileWriter(inName, false); //true냐 false냐에 따라 결과가 달라진다.
			
			//autoFlush : true 버퍼 클리어
			PrintWriter out = new PrintWriter(fw, true);
			out.println("유정연,95,90,100");
			out.println("장동건,30,55,40");
			out.println("송중기,60,95,75");
			out.println("김지원,20,85,65");
			out.println("임수정,100,35,100");		
						
		
			//1) 파일 읽어오기			
			FileReader in = new FileReader(inName);
			BufferedReader br = new BufferedReader(in); //현재 커서가 가리키는 값을 읽어옴.
			
			int num = 0;
			//List lst = new ArrayList();
			//List lst = new ArrayList();
			
			String [] word;
			while(true){
				//3) 엔터(\n), 줄의 끝(\n) 기분으로 한 줄 씩 가져오기.
				String line = br.readLine();
				if(line==null){
					break;
				} 
				
				StringTokenizer srd = new StringTokenizer(line,",");
				String name = srd.nextToken();
				int kor = Integer.parseInt(srd.nextToken());
				int eng = Integer.parseInt(srd.nextToken());
				int mat = Integer.parseInt(srd.nextToken());
				int avg = (kor+eng+mat)/3;
				
			
			}//while end
			System.out.println();
									
			

			
			
			
			//result 파일 뽑기	
			FileWriter rst = new FileWriter(outName, false); //true냐 false냐에 따라 결과가 달라진다.
			
			//autoFlush : true 버퍼 클리어
			PrintWriter outpt = new PrintWriter(rst, true);
			outpt.println();
		
			
		}catch (Exception e) {
			System.out.println("실패: "+e);
		}
		
		
		

	}//main end
}//class end

 

 

어떻게 하는거냐..

헷갈렸던 부분

1. 어떤 배열로 정보를 불러와서 잘라서 넣어야하는 지.

2. 반복문 지역변수에 갇힌 정보를 어떻게 가져오는지.

3. 배열과 배열요소 자료형이 헷갈린다.

4. 도구 쓰는 법을 배웠지만 어떤 도구를 써야 좋은지를 모름.

5. 그래서 자꾸 클래스를 만들고 연결하려고 함.

6. 순서를 제대로 정리하지 않았음.

 

 


1. 입력자료가 어디있는지?

2. 그럼 그것을 연결

위와 같은 경우는 메모장에 있는 정보를 불러와야함.

*oop5월 22일 자료 참고

 

내가 맨날 헷갈리는 개념이 반복문안에 있는 지역변수에 있는 정보를 밖으로 가져오는 것

메모리할당할 변수만(그릇을) 만들어 놓는 것

print가 어디에 출력되는지

return이 뭔지

 

★부족한 점을 파악하는 방법

1) 줄마다 내용 분석하기

2) 분석한 내용을 뇌에 집어넣기

3) 직접 적용해보기

 

 

package oop0611;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.*;

public class Test07_Sungjuk_Answer {
	public static void main(String[] args) {
	// 성적프로그램
	// 성적 입력 자료를 가져와서 -> sungjuk.txt
	// 성적 결과 파일 완성하기. -> result.txt
		
	try{
		//*메모장 파일이름
		String inName = "D:\\java0514\\workspace\\sungjuk.txt";
		String outName = "D:\\java0514\\workspace\\result.txt";
			
		//1) sungjuk 파일출력하기
		FileWriter fw = new FileWriter(inName, false); //true냐 false냐에 따라 결과가 달라진다.
			
		//autoFlush : true 버퍼 클리어
		PrintWriter out = new PrintWriter(fw, true);
		out.println("유정연,95,90,100");
		out.println("장동건,30,55,40");
		out.println("송중기,60,95,75");
		out.println("김지원,20,85,65");
		out.println("임수정,100,35,100");
			
//------------------------------------------------------------------------------------------
						
		//1) 데이터저장 변수배열선언 - 정보를 넣을 메모리 할당하기.
		String name[] = new String[5];
		int[] kor = new int[5];
		int[] eng = new int[5];
		int[] mat = new int[5];
		int[] avg = new int[5];
		int[] rank = {1,1,1,1,1};
		int size = name.length;
			
		//2) sungjuk.txt 파일 읽어오기			
		FileReader in = new FileReader(inName);
		BufferedReader br = new BufferedReader(in); //txt파일 안에서 현재 커서가 가리키는 값을 읽어옴.
			
		//3) sungjuk.txt 줄단위로 불러와서 자르기.
		//엔터(\n), 줄의 끝(\n) 기분으로 한 줄 씩 가져오기.
		//","기준으로 잘라서 각각 만들어 놓은 변수배열에 저장하기.
		int i =0; //사람 번호
		String line = ""; //String 변수 초기화 ""로 ,null로
			
		//3-1 : 가져오기
		while(true){				
			line = br.readLine();
			if(line==null) break;
				
		//3-2 : 분리하기
			StringTokenizer st = new StringTokenizer(line,",");
			
		//3-3 : 분리한 것을 집어넣기
			while(st.hasMoreElements()){
			//번호순서대로 반복
				name[i] = st.nextToken();
				kor[i] = Integer.parseInt(st.nextToken());
				eng[i] = Integer.parseInt(st.nextToken());
				mat[i] = Integer.parseInt(st.nextToken());					
			}
			i++; //다음 사람 정보 넣기위해 다음 번호로(증가시킴)
			}//while end
			
		//4) 등수, 평균 구하기
		//4-1 : 평균을 구하시오
		for(int idx=0; idx<size; idx++){
			avg[idx]=(kor[idx]+eng[idx]+mat[idx])/3;
		}					
			
		//4-2 : 등수를 구하시오 (평균값을 기준으로)
		for(int a=0; a<size; a++){
			for(int b=0; b<size; b++){
				if(avg[a] < avg[b]){
					rank[a] = rank[a]+1;
				}//if end
			}//for end
		}//for end
			
			
						
		//5) result.txt 출력	
			
		//5-1 : result 파일 뽑기	
		FileWriter rst = new FileWriter(outName, false); //true냐 false냐에 따라 결과가 달라진다.			
		//autoFlush : true 버퍼 클리어
		PrintWriter outpt = new PrintWriter(rst, true);
					
		//5-2 : 내용출력하기
        //PrintWriter outpt <- 여기에 print한다
        
		outpt.println("-------------------- 성 / 적 / 결 / 과 --------------------");
		outpt.println("-----------------------------------------------------------");
		outpt.println("이름       국어  영어  수학  평균  등수");
		outpt.println("-----------------------------------------------------------");
			
		//순서대로 출력하기
		for(int idx=0; idx<size; idx++){
			//가져온 정보를 연산 후 출력
			outpt.printf("%-6s %5d %5d %5d %5d %3d %s",name[idx],kor[idx],eng[idx],mat[idx],avg[idx],rank[idx],"등 ");
				
			//합불여부 출력
			if(avg[idx]>=70){
				if(kor[idx]<40 || eng[idx]<40 || mat[idx]<40 ){
					outpt.print("재시험 ");		
				} else {
					outpt.print("합  격 ");
				}
			}else {
				outpt.print("불합격 ");			
			}
				
			//평균점수로 별 찍기
			for(int star=1; star<=avg[idx]/10; star++){
				outpt.print("★");
			}
				
			//장학생여부 출력
			if(avg[idx]>=95){
				outpt.print("장학생");
			}
				
			//개행
			outpt.println();
			}
			
			//6) 출력종료
			in.close(); br.close();
			fw.close(); out.close();		
			
		}catch (Exception e) {
			System.out.println("실패: "+e);
		}
		
	}//main end
}//class end

 

result.txt 출력결과는,

 

 

 

Properties class

자바의 프로퍼티스 클래스는 해시테이블의 자손클래스이다.

Key와 Value를 구분해서 저장할 수 있다.
Key와 Value구분기호 = 또는 : 를 추천

 

package oop0612;

import java.io.FileInputStream;
import java.util.Iterator;
import java.util.Properties;

public class Test01_Properties {

public static void main(String[] args) {
//Properties 클래스
// ->Key와 Value를 구분해서 저장할 수 있다.
// ->Key와 Value구분기호 = 또는 : 를 추천
//command.properties 가져오기
	try{		
		String fileName = "D:\\java0514\\workspace\\basicJava\\src\\oop0612\\command.properties";
		FileInputStream fis = new FileInputStream(fileName);
		Properties pr = new Properties();
		pr.load(fis); //command properties 파일 가져오기.
			
		//Iterator 사용하기
		Iterator ite = pr.keySet().iterator();
		while(ite.hasNext()){
			String key = (String)ite.next(); //앞의 문자열
			String value = pr.getProperty(key); //뒤의 문자열
			System.out.println(key +": "+value);
		}
			
	}catch (Exception e) {
		System.out.println("실패" + e);
	}

	}//main end
}//class end

//결과값
//passwd: java1114 
//user: java0514
//url: jdbc:oracle:thin:@localhost:1521:xe
//driver: oracle.jdbc.driver.OracleDriver

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글