본문 바로가기
Programming/JAVA

입출력 스트림과 파일 입출력

by 안녕주 2020. 10. 16.

명품자바프로그래밍 Chapter8_Lab07

실습1| 연락처 정보 저장 및 출력 ( PhoneSave.java, PhoneOpen.java)

import java.io.*;
import java.util.*;

public class PhoneSave {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		FileWriter fout = null; //FileWriter 초기화
		try {
			fout = new FileWriter("c:\\temp\\phone.txt"); //파일과 연결된 출력 문자 스트림 생성
			System.out.println("전화번호 입력 프로그램입니다.");
			while(true) { //그만을 입력할 때 까지 
				System.out.print("이름 전화번호 >> "); 
				String name = scan.next();//이름 입력받기
				if (name.equals("그만")) //그만 입력하면 탈출
					break;
				String p_num = scan.next(); //전화번호 입력받기
				fout.write(name+" "+p_num+"\r\n"); //한줄 띄어쓰기 후에 저장
			}
			fout.close();scan.close();
		}
		
		catch(IOException e){
			System.out.println("입출력 오류");
		}
		
	}
}
import java.io.*;

public class PhoneOpen {
	public static void main(String[] args) {
		FileReader fin = null; 
		try {
			fin = new FileReader("c:\\temp\\phone.txt");//파일로부터 입력 스트림 생성
			int c;
			System.out.println("c:\\temp\\phone.txt를 출력합니다.");
			while((c = fin.read())!= -1) { //한문자 씩 파일 끝까지 읽기, 문자 단위로 읽기
				System.out.print((char)c); //문자 단위로 출력
			}
			fin.close();
		}
		
		catch (Exception e){
			System.out.println("입출력 오류");
		}
		
	}
}

 

실습4| 파일에 라인번호 붙이기

import java.util.Scanner;
import java.io.*;

public class FileLineNumber {
	public static void main(String[] args) {
		System.out.println("c:\\windows\\system.ini 파일을 읽어 출력합니다.");
		
		try {
			FileReader fin = new FileReader("c:\\windows\\system.ini"); //파일로부터 입력 스트림 생성
			Scanner scan = new Scanner(fin); //FileReader fin 객체를 매개변수로 하는 Scanner 객체를 생성 
			int line_num = 1; //라인번호
			while(scan.hasNext()) { //토큰이 있으면 true
				String file_line = scan.nextLine(); //nextLine을 사용해서 한줄 씩 입력 받는다.
				System.out.printf("%4d",line_num); //라인번호 출력
				System.out.println(": "+ file_line); //내용 출력
				line_num++;
			}
			scan.close();
		}
	
		catch (IOException e){
			System.out.println("입출력 오류");
		}
		
	}
}

 

실습6|  파일 두개를 하나의 파일로 Append 

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class FileAppend {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		FileReader fr1 = null;
		FileReader fr2 = null;
		FileWriter fw = null;
		System.out.println("전체 경로명이 아닌 파일이름만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다.");
		System.out.print("첫번째 파일 이름을 입력하세요>>");
		String search_file1 = scan.nextLine(); //첫번째 파일 이름 입력받기
		System.out.print("두번째 파일 이름을 입력하세요>>");
		String search_file2 = scan.nextLine(); //두번 째 파일 이름 입력받기
		System.out.print("합치는 파일 이름을 입력하세요>>");
		String append_file = scan.nextLine(); //합치는 파일 이름 입력받기
		scan.close();
		
		int c;
		try {
			fr1 = new FileReader(search_file1); //첫번째 파일로부터 입력 스트림 생성  
			fw = new FileWriter(append_file); //합치는 파일로부터 입력 스트림 생성
			
			while ((c = fr1.read())!= -1) { //한문자 씩 파일 끝까지 읽기, 문자 단위로 입력
				fw.write((char)c); //문자 단위로 쓰기
			}
			
			fw.write("\n"); //첫번째 파일 입력한 다음에 줄바꿔주기
			
			fr2 = new FileReader(search_file2); //두번째 파일로부터 입력 스트림 생성 
			
			while ((c = fr2.read())!= -1) { //한문자 씩 파일 끝까지 읽기, 문자 단위로 입력
				fw.write((char)c); //문자 단위로 쓰기
			}
			fr1.close();
			fr2.close();
			fw.close();
			System.out.println("프로젝트 폴더 밑에 "+ append_file + " 파일에 저장하였습니다.");
		}
		
		catch (IOException e){
			System.out.println("입출력 오류");
		}
		
	}
}

 

실습8| 파일 중에서 가장 큰 파일의 이름과 크기 출력

import java.io.File;

public class FileSize {
	public static void main(String[] args) {
		File f = new File("c:\\"); //c:\에 있는 파일에 대한 file 클래스 생성
		File[] subfiles = f.listFiles(); //메소드 listFiles() 사용 -> c:\ 에 있는 파일 및 서브디렉터리 리스트 얻기
		
		long b_size = 0; //size비교 변수
		File b_file = null; //b_size 객체 초기화
		
		for(int i =0;i<subfiles.length;i++) { //c:\에 있는 파일 및 서브디렉터리의 개수만큼 반복	
			long size = subfiles[i].length(); //파일의 길이 얻어내기
			if (subfiles[i].isFile()) {//파일 사이즈만 얻어내야하므로 파일일 경우 
				if(b_size < size) { //해당 번째의 파일의 길이가 더 클경우
					b_size = size; //파일 크기 저장
					b_file = subfiles[i]; //파일 이름 저장
				}
			}
			
		}
		
		if ( b_file == null)  //전부다 디렉터리인 경우
			System.out.println("파일이 없습니다. 다 디렉터리입니다.");
		else //가장 큰 파일이 있는 경우
			System.out.println("가장 큰 파일은 "+ b_file.getPath()+ " " + b_size+ "바이트"); //.getPath()메소드로 경로명 출력, b_size는 크기 출력
	
	
	}
}

 

실습10| 전화 번호 찾기 파일

import java.io.File;

public class FileSize {
	public static void main(String[] args) {
		File f = new File("c:\\"); //c:\에 있는 파일에 대한 file 클래스 생성
		File[] subfiles = f.listFiles(); //메소드 listFiles() 사용 -> c:\ 에 있는 파일 및 서브디렉터리 리스트 얻기
		
		long b_size = 0; //size비교 변수
		File b_file = null; //b_size 객체 초기화
		
		for(int i =0;i<subfiles.length;i++) { //c:\에 있는 파일 및 서브디렉터리의 개수만큼 반복	
			long size = subfiles[i].length(); //파일의 길이 얻어내기
			if (subfiles[i].isFile()) {//파일 사이즈만 얻어내야하므로 파일일 경우 
				if(b_size < size) { //해당 번째의 파일의 길이가 더 클경우
					b_size = size; //파일 크기 저장
					b_file = subfiles[i]; //파일 이름 저장
				}
			}
			
		}
		
		if ( b_file == null)  //전부다 디렉터리인 경우
			System.out.println("파일이 없습니다. 다 디렉터리입니다.");
		else //가장 큰 파일이 있는 경우
			System.out.println("가장 큰 파일은 "+ b_file.getPath()+ " " + b_size+ "바이트"); //.getPath()메소드로 경로명 출력, b_size는 크기 출력
	
	
	}
}

 

+추가 과제

1| MovieTest 에 파일 저장/ 파일 열기 기능 추가

import java.util.Scanner;
import java.util.Vector;
import java.io.*;

class Movie implements Serializable {
	String title; //제목
	String director; //감독
	String genre; //장르
	int release; //개봉연도
	
	public Movie(String title, String director, String genre, int release) { //생성자
		this.title = title;
		this.director = director;
		this.genre = genre;
		this.release = release;
	}

	public String getTitle() { //각각의 Setter 와 Getter 생성
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getDirector() {
		return director;
	}

	public void setDirector(String director) {
		this.director = director;
	}

	public String getGenre() {
		return genre;
	}

	public void setGenre(String genre) {
		this.genre = genre;
	}

	public int getRelease() {
		return release;
	}

	public void setRelease(int release) {
		this.release = release;
	}

	@Override
	public String toString() { //toString으로 문자열 반환 (2번 menu에서 사용할 string)
		return "[제목 :" + title + ", 감독:"+ director +", 장르:" + genre + ", 개봉년도:"+ release+"]";
	}
	
}

public class MovieTest  {
	public static void main(String[] args) throws Exception {		
		Vector<Movie> v = new Vector<>(); //Vector 컬렉션 사용
		Scanner scan = new Scanner(System.in); //Scanner 선언
		while(true) {
			System.out.println("===========영화 정보 관리===========");
			System.out.print("1.영화 입력/2.영화 출력/3.영화 검색/4.파일 저장/5.파일 열기/6. 종료\n메뉴입력>> ");
			int n = scan.nextInt(); // 메뉴입력 저장
			String a = scan.nextLine(); //개행문자 받아주는 코드
			
			if (n ==6) break; //6번 일 경우 종료
			
			if (n==1) { //1번 메뉴를 선택했을 경우
				System.out.print("제목:");
				String title = scan.nextLine();
				System.out.print("감독:");
				String director = scan.nextLine();
				System.out.print("장르:");
				String genre = scan.nextLine();
				System.out.print("년도:");
				int release = scan.nextInt();
				
				Movie m = new Movie(title,director,genre,release); // 입력받은 정보를 토대로 Movie 객체 생성
				v.add(m); // Vector에 해당 Movie 객체 삽입
			}
			else if(n==2) { //2번 메뉴를 선택했을 경우
				for(int i =0; i<v.size();i++) { //movie 객체의 개수 만큼 print
					Movie m = v.get(i); //벡터에서 i번째 Movie 객체얻어내기
					System.out.println(m); //m.toString()을 이용해서 객체 m출력
				}
			}
			else if (n==3) {//3번 메뉴를 선택했을 경우
				System.out.print("검색할 제목 입력:");
				String Searchtitle = scan.nextLine();
				
				for(int i =0;i<v.size(); i++) { //기존에 저장된 Movie객체와 입력한 제목이랑 비교
					Movie m = v.get(i); //Vector의 i번째 객체를 Movie m 에 저장
					if(Searchtitle.equals(m.getTitle())) { //입력한 title이 Movie 객체의  title과 같을 경우
						System.out.println(m);
						break;
					}
					if (i == v.size()-1 && !Searchtitle.equals(m.getTitle())) // 반복문의 마지막번째 까지 도달했을경우, 그리고 검색결과 false일 경우
						System.out.println("검색한 제목의 영화가 없습니다."); //검색한 제목의 영화가 없음
				}
			}
			else if (n==4) {//4번 메뉴를 선택했을 경우
				ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("movie.dat"));
				oos.writeObject(v); //현재 저장된 Vector를 oos에 쓰기 movie.dat에 저장
				oos.close();
				System.out.println("movie.dat에 저장되었습니다.");
			}
			else if (n==5) {//5번 메뉴를 선택했을 경우
				ObjectInputStream ois = new ObjectInputStream(new FileInputStream("movie.dat"));
				v = (Vector <Movie>)ois.readObject(); //Movie type으로 type casting 하기
				System.out.println("movie.dat로부터 정보를 불러왔습니다.");
				ois.close();
			}

		}			
		scan.close();
	}
}

'Programming > JAVA' 카테고리의 다른 글

자바 GUI 기초, AWT와 스윙  (0) 2020.12.30
자바 기말 플젝 코드(미완성)  (0) 2020.12.30
제너릭과 컬렉션  (0) 2020.10.16
패키지 개념과 자바 기본 패키지  (0) 2020.10.16
상속  (0) 2020.10.16

댓글