본문 바로가기
IT/프로그래밍

명품 JAVA Programming 8장 실습문제 정답

by nutrient 2020. 12. 12.
728x90
728x170

명품 JAVA Programming 8장 실습문제 정답

 

명품 JAVA Programming 8장 실습문제 정답

 

1번

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

public class PhoneWriterEx {

	public static void main(String[] args) {
		FileWriter fw = null;
		File f = new File("c:\\temp\\phone.txt");
		try {
			fw = new FileWriter(f);
			Scanner scanner = new Scanner(System.in);
			
			System.out.println("전화번호 입력 프로그램입니다.");
			while(true) {
				System.out.print("이름 전화번호 >> ");
				String line = scanner.nextLine(); // 한줄을 읽는다.
				if(line.equals("그만"))
						break; // 입력 종료
				fw.write(line+"\r\n"); // 한 줄 띄어 저장하기 위해 "\r\n"을 붙인다.
			}
			System.out.println(f.getPath()+"에 저장하였습니다.");
			
			scanner.close();
			fw.close();
		} 
		catch (IOException e) { // 파일을 저장할 수 없는 경우 예외
			e.printStackTrace();
		}
	}

}

 

2번

//BufferedReader를 이용한 정답
import java.io.*;

public class PhoneReaderExUsingBufferedReader {

	public static void main(String[] args) {
		BufferedReader fr = null;
		File f = new File("c:\\temp\\phone.txt");
		try {
			fr = new BufferedReader(new FileReader(f));
			System.out.println(f.getPath() + "를 출력합니다.");
			while(true) {
				String line = fr.readLine();
				if(line == null) // end of file
					break;
				System.out.print(line+"\n");
			}
			fr.close();
		} 
		catch (IOException e) { // 파일을 저장할 수 없는 경우 예외
			e.printStackTrace();
		}
	}

}

 

 

 

 

 

3번

//FileReader를 이용한 정답
import java.io.*;

public class PhoneReaderEx {

	public static void main(String[] args) {
		FileReader fr = null;
		File f = new File("c:\\temp\\phone.txt");
		try {
			fr = new FileReader(f);
			System.out.println(f.getPath() + "를 출력합니다.");
			while(true) {
				int c = fr.read();
				if(c == -1)
					break;
				System.out.print((char)c);
			}
			fr.close();
		} 
		catch (IOException e) { // 파일을 저장할 수 없는 경우 예외
			e.printStackTrace();
		}
	}

}



//Scanner를 이용한 파일읽기 정답
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class PhoneReaderExUsingScanner {

	public static void main(String[] args) {
		FileReader fr = null;
		File f = new File("c:\\temp\\phone.txt");
		try {
			fr = new FileReader(f);
			Scanner scanner = new Scanner(fr);
			
			System.out.println(f.getPath() + "를 출력합니다.");
			while(scanner.hasNext()) {
				String line = scanner.nextLine(); // 한줄을 읽는다.
				System.out.println(line);
			}
			
			fr.close();
			scanner.close();	
		} 
		catch (IOException e) { // 파일을 저장할 수 없는 경우 예외
			e.printStackTrace();
		}
	}

}



//FileReader로 한 문자씩 읽는 방법
import java.io.*;

public class UpperCharacter {

	public static void main(String[] args) {
		try {
			File f = new File("c:\\windows\\system.ini");
			FileReader fin = new FileReader(f);
			int c;
			while((c=fin.read()) != -1) {
				char a = (char)c;
				if(Character.isLowerCase(a))
					a = Character.toUpperCase(a);
				System.out.print((char)a);
			}
			fin.close();
		}
		catch(IOException e) {
			System.out.println("파일 읽기 오류");
		}

	}

}



//Scanner로 한 라인씩 읽는 방법
import java.io.*;
import java.util.Scanner;

public class UpperCharacterUsingScanner {

	public static void main(String[] args) {
		try {
			File f = new File("c:\\windows\\system.ini");
			Scanner scanner = new Scanner(new FileReader(f));
			while(scanner.hasNext()) {
				String line = scanner.nextLine();
				line = line.toUpperCase();
				System.out.println(line);
			}
			scanner.close();
		}
		catch(IOException e) {
			System.out.println("파일 읽기 오류");
		}

	}

}

 

4번

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

public class LineNumber {
	public static void main(String[] args){
		System.out.println("c:\\windows\\system.ini 파일을 읽어 출력합니다.");
		try {
			Scanner fScanner = new Scanner(new FileReader("c:\\windows\\system.ini")); // 파일로부터 읽기 위한 목적
			int lineNumber = 1;
			while(fScanner.hasNext()) { // 파일에 읽을 것이 있는 동안 
				String line = fScanner.nextLine();
				System.out.printf("%4d", lineNumber++); // 행번호 출력
				System.out.println(": "+line); // 소스 한행 출력
			}
			fScanner.close();
		} catch (IOException e) {
			System.out.println("입출력 오류가 발생했습니다.");
		}
	}
}

 

5번

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

public class CompareFiles {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		FileInputStream srcStream = null;
		FileInputStream destStream = null;
		
		System.out.println("전체 경로명이 아닌 파일 이름만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다.");
		
		System.out.print("첫번째 파일 이름을 입력하세요>>");
		String src = scanner.nextLine();
		
		System.out.print("두번째 파일 이름을 입력하세요>>");
		String dst = scanner.nextLine();
		
		System.out.println(src + "와 " + dst + "를 비교합니다.");
		try {
			srcStream = new FileInputStream(src); // 버퍼 입력 스트림에 연결
			destStream = new FileInputStream(dst); // 버퍼 출력 스트림에 연결
			if (compareFile(srcStream, destStream))
				System.out.println("파일이 같습니다.");
			else
				System.out.println("파일이 다릅니다.");
			
            if (srcStream != null) srcStream.close();
            if (destStream != null) destStream.close();
		} catch (IOException e) {
			System.out.println("입출력 오류가 발생했습니다.");
		}
		
		scanner.close();
	}

	private static boolean compareFile(FileInputStream src, FileInputStream dest) throws IOException {
		byte[] srcBuf = new byte[1024]; // 1KB 버퍼
		byte[] destbuf = new byte[1024];  // 1KB 버퍼
		
		int srcCount=0, destCount;
		while (true) {
			srcCount = src.read(srcBuf, 0, srcBuf.length); // src 스트림에서 srcBuf 크기만큼 읽기
			destCount = dest.read(destbuf, 0, destbuf.length); // dest 스트림에서 destBuf 크기만큼 읽기
			if (srcCount != destCount) // 읽어들인 바이트 수가 다르면 파일이 다름 
				return false;
			
			if(srcCount == -1)
				break; // 파일 끝에 도달함
			
			for (int i=0; i<srcCount; i++) {
				if (srcBuf[i] != destbuf[i]) // 읽은 바이트들 비교
					return false;
			}
		}
		return true;
	}
}

//elvis1.txt
//elvis1-복사본.txt
//elvis2.txt

 

 

 

 

 

6번

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

public class AppendFile {
	public static void main (String[] args) {
		Scanner scanner = new Scanner(System.in);
		FileReader fReader = null;
		FileWriter fWriter = null;
		
		System.out.println("전체 경로명이 아닌 파일 이름만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다.");
		
		System.out.print("첫번째 파일 이름을 입력하세요>>");
		String s1 = scanner.nextLine();
		
		System.out.print("두번째 파일 이름을 입력하세요>>");
		String s2 = scanner.nextLine();
		try {
			fReader = new FileReader(s1); // 첫번째 파일 스트림 열기
			fWriter = new FileWriter("appended.txt"); // 합치는 파일 일름
			writeToFile(fReader, fWriter); // 첫번째 파일을 읽어 합치는 파일에 기록
			fReader.close(); //  첫번째 스트림 닫기
			
			fReader = new FileReader(s2); // 두번째 스트림 열기
			writeToFile(fReader, fWriter); // 두번째 파일을 읽어 합치는 파일에 연이어 기록
			
			fReader.close();
			fWriter.close();
			System.out.println("프로젝트 폴더 밑에 appended.txt 파일에 저장하였습니다.");			
		} catch (FileNotFoundException e) {
			System.out.println("파일을 찾을 수 없습니다.");
		} catch (IOException e) {
			System.out.println("입출력 오류가 발생했습니다.");
		}
		scanner.close();
	}

	private static void writeToFile(FileReader in, FileWriter out) throws IOException {
		char buf[] = new char[50]; // 버퍼 크기 50 바이트
		int count = 0; // count는 읽은 문자 개수. while 문에 처음 들어가기 위한 임시 값.
		while (true) {
			count = in.read(buf, 0, buf.length); // buf[] 크기 만큼 읽기
			if(count == -1)
				break; // 파일 끝에 도달함
			if (count > 0) { // 읽은 것이 있다면 
				out.write(buf, 0, count); // 읽은 만큼 합치는 파일에 저장
			}
		}
	}
}

//elvis1.txt
//elvis2.txt

 

7번

import java.io.*;

public class FileCopy {
	public static void main(String[] args) {
		BufferedInputStream srcStream = null;
		BufferedOutputStream destStream = null;
		File srcFile = new File("a.jpg");
		File destFile = new File("b.jpg");
		try {
			srcStream = new BufferedInputStream(new FileInputStream(srcFile)); // 버퍼 입력 스트림에 연결
			destStream = new BufferedOutputStream(new FileOutputStream(destFile)); // 버퍼 출력 스트림에 연결
			
			long tenPercent = srcFile.length() / 10; // 파일의 10% 크기
			long progress = 0; // 파일 크기 10% 될 때까지 읽은 누적 바이트 수
			
			System.out.println("a.jpg를 b.jpg로 복사합니다. \n10%마다 *를 출력합니다.");
			byte[] buf = new byte[1024]; // 한 번 읽는 단위
			int numRead = 0; // 읽은 바이트 수 
			while (true) {
				numRead = srcStream.read(buf, 0, buf.length);
				if(numRead == -1) { // 파일 끝에 도달함
					if(progress > 0) { // 지난번에 읽었지만 10%에 도달하지 않아 *가 출력되지 않은 경우
						System.out.print("*");
					}
					break; // 파일 끝에 도달함
				}
				if (numRead > 0)
					destStream.write(buf, 0, numRead);
				
				progress += numRead; // 파일 크기 10% 될 때까지 읽은 누적 바이트 수
				if (progress >= tenPercent) { // 10% 만큼 읽었다면
					System.out.print("*");
					progress = 0; // * 출력하고 progress를 0으로 리셋
				}
			}
           	srcStream.close();
           	destStream.close();
		} catch (IOException e) {
			System.out.println("입출력 오류가 발생했습니다.");
		}
	}
}


//a.jpg

 

 

 

 

 

8번

import java.io.*;

public class FileSize {

	public static void main(String[] args) {
		File file = new File("c:\\");
		File [] files = file.listFiles(); // c:\에 있는 디렉터리와 파일의 리스트 얻기 
		
		long bigSize = 0;
		File bigFile =null;
		for(int i=0; i<files.length; i++) { // 전체 파일에 대해
			File f = files[i];
			if(!f.isFile()) // 디렉터리인 경우 넘어감
				continue;
			
			long size = f.length(); // 파일인 경우 길이 얻어내기 
			if(bigSize < size) {
				bigSize = size;
				bigFile = f;
			}
		}

		if(bigFile == null) // 모두 디렉터리인 경우
			System.out.println("파일은 없습니다");
		else
			System.out.println("가장 큰 파일은 " + bigFile.getPath() + " " + bigSize + "바이트");
	}

}

 

9번

import java.io.File;

public class FileDelete {

	public static void main(String[] args) {
		File dir = new File("c:\\temp\\");
		File [] files = dir.listFiles(); // 디렉토리의 파일 리스트
		
		System.out.println(dir.getPath() + "디렉터리의 .txt 파일을 모두 삭제합니다....");
		int count = 0;
		for(int i=0; i<files.length; i++) {
			if(!files[i].isFile()) // 파일이 아니면 다음으로
				continue;
			
			String name = files[i].getName();
			int index = name.lastIndexOf('.'); // 파일명 문자열에서 제일 마지막에 있는 '.' 의 인덱스
			if(index == -1) // 찾을 수 없음
				continue;
			
			String ext = name.substring(index); // ext = ".txt" 
			if(ext.equals(".txt")) {
				System.out.println(files[i].getPath() + " 삭제");
				files[i].delete();
				count++;
			}
		}
		System.out.println("총 "+ count + "개의 .txt 파일을 삭제하였습니다.");
	}

}

 

10번

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

public class PhoneExplorer {
	private String fileName = "c:\\temp\\phone.txt";
	private HashMap<String, String> phoneMap = new HashMap<String, String>();
	
	public PhoneExplorer() { }

	private void readPhoneFile() {
		try {
			Scanner fScanner = new Scanner(new FileReader(new File(fileName)));
			while(fScanner.hasNext()) {
				String name = fScanner.next(); // 이름 읽기
				String tel = fScanner.next(); // 전화번호 읽기
				phoneMap.put(name, tel); // 해시맵에 저장
			}			
			fScanner.close();	
		} 
		catch (IOException e) { // 파일을 저장할 수 없는 경우 예외
			e.printStackTrace();
		}
		
		System.out.println("총 " + phoneMap.size() + "개의 전화번호를 읽었습니다.");
	}
	
	private void processQuery() {
		Scanner scanner = new Scanner(System.in);
		while(true) {
			System.out.print("이름>> ");
			String name = scanner.next(); // 이름 입력
			if(name.equals("그만"))
				break;
			String tel = phoneMap.get(name);
			if(tel == null) {
				System.out.println("찾는 이름이 없습니다.");			
			}
			else{
				System.out.println(tel);
			}
		}

		scanner.close();
	}
	
	public void run() {
		readPhoneFile();
		processQuery();
	}
	
	public static void main(String[] args) {
		PhoneExplorer phoneExplorer = new PhoneExplorer();
		phoneExplorer.run();
	}

}

 

 

 

 

 

11번

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

public class WordSearch {
	private Vector<String> wordVector = new Vector<String>();
	
	public WordSearch() { }
	
	private boolean readFile() { // words.txt 파일 읽기
		try {
			Scanner fScanner = new Scanner(new FileInputStream("words.txt"));
			while(fScanner.hasNext()) 
				wordVector.add(fScanner.nextLine()); // 한 라인에 하나의 단어
			fScanner.close();
		}catch(FileNotFoundException e) { 
			System.out.println("프로젝트 폴더 밑의 words.txt 파일이 없습니다");
			return false;
		} 
		System.out.println("프로젝트 폴더 밑의 words.txt 파일을 읽었습니다...");
		return true;
	}
	
	private void processQuery() { // 단어 검색
		Scanner scanner = new Scanner(System.in);
		while(true) {
			boolean found = false;
			System.out.print("단어>>");
			String searchWord = scanner.nextLine(); // 검색할 단어 입력
			if(searchWord.equals("그만")) { 
				break; // 검색 종료
			}
			
			// 벡터에서 검색
			for(int i=0; i<wordVector.size(); i++) {
				String word = wordVector.get(i); // 벡터 내의 문자열
				if(word.length() < searchWord.length()) // 벡터의 문자열이 검색 문자열보다 짧은 경우 
					continue;
				
				// 벡터문자열의 앞부분을 검색 문자열 크기만큼 잘라내기
				String frontPart = word.substring(0, searchWord.length());
				
				if(searchWord.equals(frontPart)) { // 검색 문자열과 잘라낸 앞 부분 비교
					System.out.println(word); // 벡터에서 발견한 단어 출력
					found = true;
				}
			}
			if(!found) // 한 단어도 발견못한 상태
				System.out.println("발견할 수 없음");
		}
		scanner.close();

	}
	
	public void run() {
		boolean res = readFile(); // res가 false이면  단어 파일 읽기 실패
		if(res == true)
			processQuery();
		System.out.println("종료합니다...");
	}
	
	public static void main(String[] args) {
		WordSearch ws = new WordSearch();
		ws.run();
	}
}


//words.txt

 

12번

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

public class WordSearchInFile {
	private File targetFile = null;
	Vector<String> lineVector = new Vector<String>();
	
	public WordSearchInFile() { }
	
	private void readFile(String fileName) {
		targetFile = new File(fileName);
		try {
			Scanner fScanner = new Scanner(new FileReader(targetFile));
			while(fScanner.hasNext()) { // 파일을 라인 단위로 모두 읽기
				String line = fScanner.nextLine(); // 한 라인 읽고
				lineVector.add(line); // 한 라인을 벡터에 저장
			}			
			fScanner.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	private Vector<Integer> searchWord(String word) { // word가 포함된 라인 번호들을 벡터로 리턴
		Vector<Integer> noVector = new Vector<Integer>();
		for(int i=0; i<lineVector.size(); i++) {
			String line = lineVector.get(i);
			if(line.indexOf(word) != -1) 
				noVector.add(i);
		}
		
		return noVector;
	}

	private void printLines(Vector<Integer> noVector) {
		for(int i=0; i<noVector.size(); i++) {
			int lineNo = noVector.get(i);
			String line = lineVector.get(lineNo);
			System.out.println(lineNo + ":" + line);
		}
	}
	
	public void run() {
		System.out.println("전체 경로명이 아닌 파일 이름만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다.");
		System.out.print("대상 파일명 입력>> ");
		Scanner scanner = new Scanner(System.in);
		String fileName = scanner.nextLine();

		readFile(fileName); // 파일을 라인 단위로 벡터로 읽어들임
		
		while(true) {
			System.out.print("검색할 단어나 문장>> ");
			String line = scanner.nextLine();
			if(line.equals("그만"))
				break; // 프로그램 종료
			Vector<Integer> noVector = searchWord(line); // line의 단어를 포함하는모든 라인 번호 리턴
			printLines(noVector);
		}
		scanner.close();
		System.out.println("프로그램을 종료합니다.");
	}
	public static void main(String[] args) {
		WordSearchInFile ws = new WordSearchInFile();
		ws.run();
	}
}


//test.java

13번

import java.io.File;
import java.util.Scanner;

public class FileExplorer {
	private File currentDir = null;
	private File subFiles [] = null;
	
	public FileExplorer(String dirName) {
		currentDir = new File(dirName);
	}

	private void showSubDirtories() {
		System.out.println("\t[" + currentDir.getPath() + "]");
		subFiles = currentDir.listFiles();
		for(File f : subFiles) {
			System.out.print(((f.isFile())?"file":"dir"));
			System.out.printf("%-15s", "\t\t" + f.length() + "바이트");
			System.out.println("\t\t" + f.getName());
		}		
	}
	
	private boolean contains(String filename) {
		for(File f : subFiles) {
			if(f.getName().equalsIgnoreCase(filename))
				return true;
		}
		return false;
	}
	
	public void run() {
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("***** 파일 탐색기입니다. *****");
		showSubDirtories();
		
		while(true) {
			System.out.print(">>");
			String command = scanner.nextLine().trim(); // 한 라인을 읽고 앞뒤에 입력한 빈칸 지우기
			if(command.equals("그만"))
				break; // 프로그램 종료
			if(command.equals("..")) {
				String s = currentDir.getParent();
				if(s == null) // s가 null이면, currentDir가 현재 최상위 디렉터리라서 부모 디렉터리가 없음
					continue;
				else { 					
					currentDir = new File(currentDir.getParent());
					showSubDirtories();
				}

			}
			else { // command는 서브디렉토리이름
				if(contains(command)) { // 현재 디렉터리의 파일이나 서브디렉토리라면
					if(new File(currentDir, command).isDirectory()) { // 디렉터리라면
						currentDir = new File(currentDir, command);
						showSubDirtories();
					}
					else { // 파일인 경우
						System.out.println("\t디렉터리가 아닙니다.!");
					}
				}
			}
		}
		
		scanner.close();
	}
	
	public static void main(String[] args) {
		FileExplorer fe = new FileExplorer("c:\\");
		fe.run();
	}

}

 

14번

import java.io.File;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.StringTokenizer;

public class FileExplorer2 {
	private File currentDir = null;
	private File subFiles [] = null;
	
	public FileExplorer2(String dirName) {
		currentDir = new File(dirName);
	}

	private void showSubDirtories() {
		System.out.println("\t[" + currentDir.getPath() + "]");
		subFiles = currentDir.listFiles();
		for(File f : subFiles) {
			System.out.print(((f.isFile())?"file":"dir"));
			System.out.printf("%-15s", "\t\t" + f.length() + "바이트");
			System.out.println("\t\t" + f.getName());
		}		
	}
	
	private void mkdir(String dirName) {
		File newDir = new File(currentDir, dirName); // 만들고자 하는 dirName의 전체 경로명 만들기 
		if(newDir.exists()) // 이미 존재한다면
			System.out.println("이미 존재하는 파일이나 디레터리 이름입니다.");
		else {
			System.out.println(dirName + " 디렉터리를 생성하였습니다.");
			newDir.mkdir(); // 디렉터리 생성
			showSubDirtories();
		}
	}
	private void rename(String src, String dest) {
		File srcFile = new File(currentDir, src); // 소스 파일 경로명 
		File destFile = new File(currentDir, dest); // 목적 파일 경로명 
		if(destFile.exists()) // 이미 존재한다면, 이름 바꿀 수없음
			System.out.println("이미 존재하는 파일이나 디레터리 이름입니다. 이름 바꿀 수 없습니다.");
		else {
			System.out.println(src + "를 " + dest + " 이름 변경하였습니다.");
			srcFile.renameTo(destFile); // 이름 변경
			showSubDirtories();
		}
	}
	
	private boolean contains(String filename) {
		for(File f : subFiles) {
			if(f.getName().equalsIgnoreCase(filename))
				return true;
		}
		return false;
	}
	
	public void run() {
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("***** 파일 탐색기입니다. *****");
		showSubDirtories();
		
		while(true) {
			System.out.print(">>");
			String line = scanner.nextLine().trim(); // 한 라인을 읽고 앞뒤에 입력한 빈칸 지우기
			StringTokenizer st = new StringTokenizer(line, " "); // 빈 칸으로 분리
			String command = st.nextToken(); //첫번째 문자열
			if(command.equals("그만"))
				break; // 프로그램 종료
			if(command.equals("..")) {
				String s = currentDir.getParent();
				if(s == null) // s가 null이면, currentDir가 현재 최상위 디렉터리라서 부모 디렉터리가 없음
					continue;
				else { 					
					currentDir = new File(currentDir.getParent());
					showSubDirtories();
				}

			}
			if(command.equalsIgnoreCase("mkdir")) {
				try {
					String dirName = st.nextToken(); //두번째 문자열
					mkdir(dirName);
				} catch(NoSuchElementException e) {
					System.out.println("생성할 디렉터리명이 주어지지 않았습니다!");
				}
			}
			else if(command.equalsIgnoreCase("rename")) {
				try { 
					String src = st.nextToken(); //두번째 문자열
					String dest = st.nextToken(); //두번째 문자열
					rename(src, dest);
				} catch(NoSuchElementException e) {
					System.out.println("두 개의 파일명이 주어지지 않았습니다.!");
				}
			}
			else { // command는 서브디렉토리이름
				if(contains(command)) { // 현재 디렉터리의 파일이나 서브디렉토리라면
					if(new File(currentDir, command).isDirectory()) { // 디렉터리라면
						currentDir = new File(currentDir, command);
						showSubDirtories();
					}
					else { // 파일인 경우
						System.out.println("\t디렉터리가 아닙니다.!");
					}
				}
			}
		}
		
		scanner.close();
	}
	
	public static void main(String[] args) {
		FileExplorer2 fe = new FileExplorer2("c:\\");
		fe.run();
	}

}

 

728x90
그리드형

댓글