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
그리드형
'IT > 프로그래밍' 카테고리의 다른 글
누구나 쉽게 즐기는 C언어 콘서트 2장 연습문제 정답 (0) | 2020.12.12 |
---|---|
누구나 쉽게 즐기는 C언어 콘서트 1장 연습문제 정답 (0) | 2020.12.12 |
명품 JAVA Programming 7장 실습문제 정답 (0) | 2020.12.12 |
명품 JAVA Programming 6장 실습문제 정답 (0) | 2020.12.12 |
명품 JAVA Programming 5장 실습문제 정답 (0) | 2020.12.12 |
댓글