본문 바로가기

공부/자바 OOP

6월11일 - 파일입출력

교재

자체교재 : chap20 -10

 

출력서식

- java.io 팩키지

 

System.out.println();  -> 콘솔창에 출력

out.println(); -> 브라우저에 출력

 

- 문자열출력기호 "" 

System.out.println("""); //에러남 

단순기호로 출력하고 싶다면, \와 같이 사용해야한다.

System.out.println("\""); //ok

System.out.println("\""); 
System.out.println("\"안녕\"");

출력결과
"
"안녕"

- 경로구분기호 \

경로구분기호 사용시 \두번 사용

                            /한번 사용

 

System.out.println("\\");
System.out.println("d:\\java0514\\workspace");
System.out.println("d:/java0514/workspace");
		
출력결과
\
d:\java0514\workspace
d:/java0514/workspace

 

- \n 줄바꿈 (new line) /\t 탭 (tab)

System.out.println("사과\n");
System.out.println("사과\n딸기");
System.out.println("\n\n\n참외");
System.out.println("\n사\t과");
        
출력결과
사과

사과
딸기



참외

사	과

-% 출력포맷

 %d 10진 정수형

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

 

 %f 실수형 

- 6.2의 의미 : 6자리를 잡고 양수는 오른쪽정렬

System.out.printf("%f %f %f \n",1.2, 3.4, 5.5); //1.200000 3.400000 5.500000 
System.out.printf("#%6.2f# \n",7.8); //#  7.80# 
System.out.printf("#%-6.2f# \n",7.8); //#7.80  # 
System.out.printf("#%.2f# \n",7.8); //#7.80# 

 

%c 문자형 

System.out.printf("%c %c %c \n",'S' ,'K', 'Y'); //S K Y 
System.out.printf("#%5c# \n",'R'); //#    R# 
System.out.printf("#%-5c# \n",'r'); //#r    # 

 

 %s 문자열형

System.out.printf("%s %s %s \n","Year" ,"Month" ,"Date"); //Year Month Date 
System.out.printf("#%8s# \n","Happy"); //#   Happy# 
System.out.printf("#%-8s# \n","Happy"); //#Happy   # 

읽기모드

File Class

- 파일 관련 정보를 알 수 있다.

 

File 클래스 예시)

- File 크기

File 이름

File 경로

package oop0611;

import java.io.File;

public class Test02_File {

	public static void main(String[] args) {
		// File 클래스
		// 파일 관련 정보를 알 수 있다
		try {
			//예외 발생이 예상되는 코드 작성
			
			//경로구분시 기호는 \\로 한다
			//경로명+파일명
			//String pathname="D:\\java0514\\setup\\eclipse-jee-luna-SR2-win32-x86_64.zip";
			//경로구분시 /기호도 사용가능하다
			//사용 : 사진업로드 파일업로드할때
			String pathname="D:/java0514/setup/eclipse-jee-luna-SR2-win32-x86_64.zip";
			File file=new File(pathname);
			if(file.exists()){ //파일이 존재하는지?
				System.out.println("파일 가져오기 성공!");
				
				long filesize=file.length(); //파일사이즈 확인 long 단위쓰기
				System.out.println("파일크기:"+filesize+"Byte");				
				System.out.println("파일크기:"+(filesize/1024)+"KB");				
				System.out.println("파일크기:"+(filesize/1024/1024)+"MB");				
				
				String filename=file.getName();
				System.out.println("파일명.확장명:"+filename);
				
				//경로명+파일명 D:\java0514\setup\eclipse-jee-luna-SR2-win32-x86_64.zip
				System.out.println(file.getPath());
				//D:\java0514\setup
				System.out.println(file.getParent());
				
			}else{
				System.out.println("파일 없어여 ㅠ");
			}//if end
			
			
		}catch(Exception e){
			//예외가 발생되면 실행할 코드 작성
			System.out.println("파일클래스 실패:"+e);
		}//try end
		
		System.out.println("END");
		
	}//main() end
}//class end

출력결과
파일 가져오기 성공!
파일크기:266781307Byte
파일크기:260528KB
파일크기:254MB
파일명.확장명:eclipse-jee-luna-SR2-win32-x86_64.zip
D:\java0514\setup\eclipse-jee-luna-SR2-win32-x86_64.zip
D:\java0514\setup
END

 

문제) 파일명과 확장명을 분리출력하시오

int lastdot   =filename.lastIndexOf(".");
String name=filename.substring(0,lastdot);
String ext    =filename.substring(lastdot+1);
System.out.println("파일명:"+name);
System.out.println("확장명:"+ext);

출력결과
파일명:eclipse-jee-luna-SR2-win32-x86_64
확장명:zip

- 파일 삭제 

file.delete(); 

진짜지워짐!!! 

 

Input

-파일 내용읽기

- java.io 팩키지 

- Writer Reader InputStream OutputStream class

파일내용을 볼 수 있다.

 

ex) 파일내용읽기 - FileReader & BufferedReader 사용

package oop0611;

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

public class Test03_Input {

	public static void main(String[] args) {
		// 파일내용읽기
		try{
			//filereader - 파일내용을 볼 수 있따
			String fileName="D:/java0514/workspace/basicJava/src/oop0610/Test02_SetMap.java";
			
			//1) 파일 가져오기
			FileReader in=new FileReader(fileName);
			
			//2) 파일 내용읽기
			BufferedReader br=new BufferedReader(in); //in변수에 내용을 담기
			int num=0; //각 행 앞에 번호 붙이기
			while(true){ //무한루프로 돌리고 마지막내용을 break걸어서 빼오기
				//3) 엔터(\n), 줄의 끝(\r) 기준으로 한줄씩 가져오기
				String  line=br.readLine(); //파일내용의 각 라인을 한줄씩 가져오기
				if(line==null){ //라인이 공백일때, 빠져나오기
					break;
				}//if end
				
				//System.out.println(line);
				System.out.printf("%3d %s\n", ++num , line); //행앞에 번호 붙이기
		
				//20줄마다 밑줄긋기
				if(num>0 && num%20==0){
					System.out.println("---------------------------------------");
				}//if end				
			}//while end
			
			//4) 자원 반납(순서주의!)
			br.close();
			in.close();
			
			
		}catch(Exception e){
			System.out.println("실패:"+e);
		}//try end
		
		System.out.println("END");
		
	}//main() end
}//class end

 

InputStream기반과 Reader기반 비교

 

1) FileInputStream : 1바이트 기반
   -> 한글깨짐

		try{
			String fileName="D:/java0514/workspace/basicJava/src/oop0610/Test02_SetMap.java";
			
			FileInputStream fis=new FileInputStream(fileName);
			//커서의 기본 속성, 한뭉텅이 읽으면 커서는 그 다음값을 가리킴
			int data=0;
			while(true){
				data=fis.read(); //1바이트 읽기
				if(data==-1){ //파일의 끝(End Of File)인지?
					break; //끝이오면 빠져나오기
				}//if end
				System.out.print((char)data); //파일의 형변환시켜준다.
			}//while end
			fis.close();
            
		}catch(Exception e){
			System.out.println("실패:"+e);
		}//try end
		
        출력결과
        ....
        map.put("three", new Double(5.6)); 
		//key는 중복선언하지 않는다.
		//map.put("one", "박지성"); //one과 같은 이름으로 인식한다
		map.put("four", "손흥민"); //one과의 value값 같을 수 있다.
        ....
        한글깨짐

 

api상에 메소드가 없으면, 부모함수의 메소드를 물려받겠다는 이야기. (ex, class FileReader)

 

2) FileReader : char(2바이트)기반
 -> 한글 안깨짐

			FileReader fr=new FileReader(fileName);
			int data=0;
			while(true){
				data=fr.read();
				if(data==-1){
					break;
				}//if end
				System.out.print((char)data);
			}//while end
			fr.close();
			
            출력결과
            .....
        //문) key값으로 "rea.do" 호출하면 value값으로 "net.bbs.Read" 출력하시오
		// '=' 문자를 기준으로 문자열을 분리해서 = 앞의 문자열은 key,
		// = 뒤의 문자열은 value로 map에 저장
		//substring , tokenizer, split
        ....

 

쓰기모드

OutPut

 

만약, 출력파일(sungjuk.txt)이 없으면 파일은 생성된다(create) 

                                       있으면 추가(append) 또는 덮어쓰기(overwrite) 된다.

                                                 -----true----          --------false-------

FileWriter