본문 바로가기
솔루션모음/자바 기초부터 하나씩

[자바 기초부터 하나씩/13장 연습문제 솔루션 답지 해답]스트림 I/O와 임의 접근 파일

by 이얏호이야호 2020. 4. 3.

1. 참 또는 거짓

a. 모든 파일은 임의 접근 파일이다.

: 거짓. 순차 파일은 임의 접근 파일이 아닙니다.

 

b. 텍스트 파일은 이진 숫자로 구성된다.

:

 

c. 텍스트 파일은 화면에 표기하기 쉽고, 읽기도 쉽다.

:

 

d. 이진 파일은 화면에 표시하기 쉽고, 읽기도 쉽다.

: 거짓. 이진파일을 해석하는 표준방법은 없습니다.

 

e. 스트림은 메소드를 가지지 않은 객체이다.

: 거짓. 스트림은 많은 메소드를 가집니다.

 

f. I/O는 요오드(Iodine)를 의미한다.

: 거짓. I/Oinput,output의 표준입니다.

 

g. System.in InputStream 클래스의 멤버이다.

:

 

h. System.outOutputStream 클래스의 자손이다.

:

 

I. 바이트 스트림 클래스는 문자 스트림 클래스보다 먼저 설계되었다.

:

 

j. ReaderWriter는 바이트 스트림 계층에 있는 클래스이다.

: 거짓. ReaderWriter는 캐릭터 스트림 계층에 있는 클래스입니다.

 

k. 바이트 스트림 클래스와 문자 스트림 클래스는 항상 서로에게 독립적으로 사용된다.

: 거짓. 두 클래스는 다른 목적을 가지고 디자인 됩니다. 하지만 필요에 따라서 같이 사

용할 수 있습니다.

 

l. 버퍼는 I/O의 속도와 효율성을 높이기 위해서 사용된다.

:

 

m. 임의 접근 파일은 반드시 각각의 레코드가 같은 수의 바이트로 된 레코드만을 저장한다.

: 거짓. 모두가 고정 길이 레코드가 포함되는 것은 아닙니다. 그렇지 않은 레코드도 있습니다.

2. 컴파일러 실행

다음 코드에서 오류()을 설명하라. 만약 코드에 오류가 없다면, 오류가 없다고 표시하여라. 이 문제에서의 모든 파일은 이미 존재하고 있다고 가정한다.

a.

import java.io.*;

File f = new File("hello.txt");

BufferedInputStream test = new BufferedIputStream(f);

: BufferedInputStream는 생성자에는 파일이 아닌 reader가 필요합니다.

 

b.

import java.io.*;

File g = new File("hello.dat");

BufferedInputStream test = new BufferedIputStream(g);

: 오류 없음

 

c.

import java.io.*;

File h = new File("goodbye.dat");

BufferedInputStream test = new BufferedIputStream(f);

BufferedOutputStream test = new BufferedIputStream(f);

: f가 아닌 파일 h로 고쳐야 합니다.

 

d.

import java.io.*;

File f = new File("goodbye.txt");

DataOutputStream test = new DataOutputStream(f);

: DataOutputStream은 파일이 아닌 OutputStream변수를 필요로 합니다.

 

e.

import java.io.*;

File f = new File("lastone.dat");

BufferedInputStream test = new BufferedIputStream(f);

BufferedOutputStream test = new BufferedIputStream(f);

: 오류 없음.

3. 스트림 계층 이해

다음 각각에 대하여 포장(wrapping)이 올바른지를 알아보아라. 만약 잘못되었다면 이유를 설명하라.

 

a. InputStreamReaderSystem.in을 포장.

:

 

b. OuputStreamWriterSystem.out을 포장.

:

 

c. BufferedReaderInputstreamReader를 포장.

:

 

d. FileInputStream으로 System.in을 포장.

: 거짓. FileInputStreamFile 객체가 필요합니다.

 

e. FileInputStream으로 File을 포장

:

 

f. FileReaderFile을 포장

:

 

g. BufferedReaderFileReader을 포장.

:

 

h. FileWriterSystem.out을 포장

: 거짓. FileWriterFile객체가 필요합니다.

 

I. BufferedWriterFileWriter를 포장

:

 

j. BufferedWriterFileOutputStream을 포장

: 거짓. BufferedWriterWriter객체가 필요합니다.

 

k. FileOutputStream으로 File을 포장

:

 

l. PrintWriterSystem.out을 포장

:

 

m. PrintWriterSystem.in을 포장

: 거짓. PrintWriterOutputStream이 필요합니다.

 

n. BufferedInputStream으로 File을 포장

: 거짓 . BuffedredInputStream InputStream 이 필요합니다.

 

o. PrintWriterBufferedWriter를 포장

:

4. 컴파일러 실행

다음 각 버전의 readCharacterData() 메소드를 사용했을 때의 문제점을 찾아보아라.

버전1

public void readCharacterData()

{

int c;

int count = 0;

InputStreamReader link = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(link);

while ( (c = br.read()) != -1)

{

count++;

System.out.println(c + " " + (char)c);

}

System.out.println("Number of Characters: " + count);

}

: BufferedReader클래스에서 IOException 이 일어날 수도 있습니다. ,IOException을 추가해야합니다.

 

버전2

public void readCharacterData() throws IOException

{

int c;

int count = 0;

BufferedReader br = new BufferedReader(System.in);

while ( (c = br.read()) != -1)

{

count++;

System.out.println(c + " " + (char)c);

}

System.out.println("Number of Characters: " + count);

}

: BufferedReader클래스에서 System.in이 아닌 리더 계층 개체가 필요합니다.

5. 스트림 개념

목적에 맞게 스트림 클래스의 유형을 연결하여라.

스트림 클래스 유형 목적
a. 바이트 스트림
b. 문자 스트림
c. 버퍼 스트림(Buffered Stream)
d. 데이터 스트림
e. 객체 스트림
f. System.inSystem.out
1. 원시 데이터 유형의 이진 I/O 처리
2. 콘솔러부터/콘솔로 I/O 처리
3. I/O 최적화
4. 객체의 이진I/O처리
5. 원본(raw) 바이트의 I/O 처리
6. 2 바이트 문자의 I/O 처리

1-a

2-b

3-c

4-e

5-a

6-b

 

6. 실행 결과는?

a. 다음 프로그램에 의해 생성되는 파일의 이름은 무엇인가?

: mystery라는 이름을 가진 파일이 생성됩니다.

b. 파일의 시작 부분에 저장되는 정보(데이터 유형, 데이터의 목적, 데이터의 값)을 기술하여라.

: 첫 번째 8바이트는 primitive데이터 유형으로서 우치가 4바이트인 위치에 저쟝됩니다. filler는 두 번째 문자열의 마커역할을 하고 마커의 위치는 파일의 맨 위에 저장됩니다.

c. 파일의 나머지 부분에 저장되는 정보를 기술하여라.

: 다음 28바이트는 14개의 2바이트 문자 Ralphlikesjava입니다. fillerRalphlikesjava의 바이트 뒤에 쓰여집니다. 다음은 "ShailikesCopfes"15문자열의 30바이트입니다.

 

import java.io.*;

public class FileWriter

{

public static void main(String[] args)

{

try

{

long fillerPos = 0;

int filler = 1000;

RandomAccessFile f = new RandomAccessFile("mystery", "rw");

f.writeLong(0);

f.writeChars("RalphlikesJava");

fillerPos = f.getFilePointer();

f.writeInt(filler);

f.writeChars("ShailikesCoffee");

f.seek(0);

f.writeDouble(fillerPos);

f.close();

}

catch (FileNotFoundException e)

{

System.err.println("File not Found " + e);

}

catch (IOException e)

{

System.err.println("Write Error: " + e);

}

}

}

 

7. 스트림에 대한 생각

그림 13.12PrintWriter 객체 (바이트 스트림)로 포장(wrap)BufferedWriter 객체(문자 스트림)를 보여주고 있다.

 

a. BufferedWriter 객체를 포장한 목적은 무엇인가?

그림 13.6PrintWriter 객체(바이트 스트림)로 포장된 OutputStream 객체(바이트 스트림)System.out을 보여주고 있다.

: BufferedWriter를 사용하면 성능을 향상시킬 수 있습니다.

 

b. PrintWriter에 대해 썬(Sun) 사의 문서를 조사해보고, PrintWriter가 두 개의 다른 계층(바이트 스트림과 문자스트림)의 객체를 포장하는 것이 적법한 이유를 설명해보아라.

: 문자 스트림 주위에 인쇄를 래핑할 때 Writer는 문자를 원시 바이트로 변환합니다. 이 원시바이트는 스트림의 두 계층을 모두 사용할 수 있게끔 해줍니다.

 

c. BufferedWriter 객체로 PrintWriter를 포장하는 것은 적법한가?

만약 그렇지 않다면 이유를 설명하고, 적법하다면 그렇게 하기 위한 가능한 이론적 근거를 설명하여라.

: 합법적입니다. 인쇄물 버퍼링시에 작은 항목이 연속적으로 쓰여짐에 따라 인쇄 프로세스가 더 효율적으로 동작합니다.

8. 스트림 클래스 선택

다음 각각의 상황에서 사용할 수 잇는 스트림 클래스()를 정하고, 어느 래퍼(Wrapper)로 포장할 수 있는지를 기술하고, 그와 같은 선택에 대해 설명하여라.

 

a. 이전 파일로부터 정수 읽기

: DataInputStream은 래퍼 FileInputStream을 사용합니다. 이진 데이터 처리에 적합합니다.

 

b. 텍스트 파일로 문자 쓰기

: PrintWriter를 버퍼링 함으로써 효율성이 향상됩니다.

 

c. 이진 파일로부터 객체 읽기

: FileInputStream은 래퍼 ObjectIntputStream을 사용합니다. 바이러니 파일에서 객체를 자동으로 읽기 때문입니다.

 

d. 텍스트 파일로부터 문자 읽기

: BufferedReader로 래핑할 수 있습니다. File텍스트파일에서 문자데이터를 읽도록 설계되었습니다.

 

e. 콘솔로부터 바이트 읽기

: System.in.read()를 사용합니다.

 

f. 콘솔로부터 문자 읽기

; 문자 입력은 BufferedReader객체로 수행합니다.

 

g. 콘솔로 실수(double) 쓰기

: System.out.print(실수)로 출력합니다.

 

h. 이진 파일로 실수(double) 쓰기

: FileOutputStreamDataOutputStream으로 래핑할 수 있습니다. 바이너리 데이터를 파일에 씁니다.

 

I. 텍스트 파일로부터 문자열 읽기

: BufferedReaderFileReader를 이용합니다.

 

j. 파일로 고객 레코드 쓰기

: 스트림 클래스를 사용하지 않습니다

댓글