[Java] FileInputStream / FileOutputStream
ํ๊ทธ: Java, Refactoring
์นดํ ๊ณ ๋ฆฌ: Java
์ด์ ๊ธ์์๋ ์ดํฐ๋ ์ดํฐ ํจํด์ ์ด์ฉํด ๋ฉ๋ด๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํด๋ดค๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ฐ์ดํฐ ์ ์ฅ/์กฐํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ํ์ผ์ ์ฐ๊ณ /์ฝ๋๋ก ๋ณ๊ฒฝํด ๋ณธ๋ค.
ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์์์ List
๊ตฌํ์ฒด์ ์ ์ฅํ๋ ๋ก์ง๋ง ์๊ธฐ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์์์ฑ์ ๊ฐ์ง ์๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ์๋ ๋ฐ์ดํฐ๊ฐ ์ง์์ง๋ค.
์ด ๋ถ๋ถ์ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ํ์ผ์ ์ ์ฅ๋๋๋ก ์์ ํด๋ณด์.
ํ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ธ๋ค.
ํ์ผ ์
์ถ๋ ฅ์ ๊ตฌํํ๊ธฐ ์ ์, ๋จผ์ ๊ฐ ๋ฉ๋ด์ ๋ํ ๋ฐ์ดํฐ ์
์ถ๋ ฅ์ ํธํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด App
ํด๋์ค ์์ค์ฝ๋๋ฅผ ์ ๋ฆฌํ๋ค.
ํ์ฌ App
ํด๋์ค๋ ์๋์ ๊ฐ์ด main ๋ฉ์๋์ ์คํ ์์์ ๋ฐ๋ผ ์์ฑ๋์ด ์๋ค.
App ํด๋์ค ๋ฆฌํฉํ ๋ง
before
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class App {
public static void main(String[] args) throws Exception {
Prompt prompt = new Prompt(System.in);
// ํ์ฌ ์์ค์์๋ List ์ ์ ์ฅํ๊ณ ์๋ค.
List<Board> boardRepository = new LinkedList<>();
List<Assignment> assignmentRepository = new LinkedList<>();
List<Member> memberRepository = new ArrayList<>();
List<Board> greetingRepository = new ArrayList<>();
// ๋ฉ์ธ ๋ฉ๋ด
MenuGroup mainMenu = MenuGroup.getInstance("๋ฉ์ธ");
// ๊ณผ์ ๋ฉ๋ด
MenuGroup assignmentMenu = mainMenu.addGroup("๊ณผ์ ");
assignmentMenu.addItem("๋ฑ๋ก", new AssignmentAddHandler(assignmentRepository, prompt));
assignmentMenu.addItem("์กฐํ", new AssignmentViewHandler(assignmentRepository, prompt));
assignmentMenu.addItem("๋ณ๊ฒฝ", new AssignmentModifyHandler(assignmentRepository, prompt));
assignmentMenu.addItem("์ญ์ ", new AssignmentDeleteHandler(assignmentRepository, prompt));
assignmentMenu.addItem("๋ชฉ๋ก", new AssignmentListHandler(assignmentRepository, prompt));
// ๊ฒ์๊ธ ๋ฉ๋ด
// ๊ฐ์
์ธ์ฌ ๋ฉ๋ด
// ํ์ ๋ฉ๋ด
// ๋์๋ง ๋ฉ๋ด
while (true) {
try {
mainMenu.execute(prompt);
prompt.close();
break;
} catch (Exception e) {
System.out.println("main() ์์ธ ๋ฐ์");
}
}
}
}
์ญํ ์ ๋ฐ๋ผ ๋ฉ์๋๋ก ๊ตฌ๋ถํ๊ณ ๋ฉ์๋ ํธ์ถ๋ก ๋์ํ๋๋ก ์์ ํด๋ณด์. ๊ตฌํ์ ๋จ์ํ ํ๊ธฐ ์ํด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋ ํ์ผ์ ์ถ๋ ฅํ๊ณ , ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ ํ์ผ์ ๋ชจ๋ ์ฝ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉํ๊ธฐ๋ก ํ๋ค.
after
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
public class App {
Prompt prompt = new Prompt(System.in);
List<Board> boardRepository = new LinkedList<>();
List<Assignment> assignmentRepository = new LinkedList<>();
List<Member> memberRepository = new ArrayList<>();
List<Board> greetingRepository = new ArrayList<>();
MenuGroup mainMenu;
// ์์ฑ์๊ฐ ํธ์ถ๋๋ ์์ ์ ํ์ผ์์ ๋ฐ์ดํฐ ๋ก๋ฉํ๋ค.
App() {
prepareMenu();
loadAssignment();
loadMember();
loadBoard();
loadGreeting();
}
void prepareMenu() {
// ๋ฉ์ธ ๋ฉ๋ด
mainMenu = MenuGroup.getInstance("๋ฉ์ธ");
// ๊ณผ์ ๋ฉ๋ด
MenuGroup assignmentMenu = mainMenu.addGroup("๊ณผ์ ");
assignmentMenu.addItem("๋ฑ๋ก", new AssignmentAddHandler(assignmentRepository, prompt));
assignmentMenu.addItem("์กฐํ", new AssignmentViewHandler(assignmentRepository, prompt));
assignmentMenu.addItem("๋ณ๊ฒฝ", new AssignmentModifyHandler(assignmentRepository, prompt));
assignmentMenu.addItem("์ญ์ ", new AssignmentDeleteHandler(assignmentRepository, prompt));
assignmentMenu.addItem("๋ชฉ๋ก", new AssignmentListHandler(assignmentRepository, prompt));
// ๊ฒ์๊ธ ๋ฉ๋ด
// ๊ฐ์
์ธ์ฌ ๋ฉ๋ด
// ํ์ ๋ฉ๋ด
// ๋์๋ง ๋ฉ๋ด
}
void run() {
while (true) {
try {
mainMenu.execute(prompt);
prompt.close();
break;
} catch (Exception e) {
System.out.println("main() ์์ธ ๋ฐ์");
}
}
// ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์ ํ์ผ์ ๋ฐ์ดํฐ ์ ์ฅ
saveAssignment();
saveMember();
saveBoard();
saveGreeting();
}
/* ์๋ ๋ฉ์๋๋ค์ ํตํด ํ์ผ ์
์ถ๋ ฅ์ ๋ค๋ฃฌ๋ค. */
void saveAssignment() {
...
}
void loadAssignment() {
...
}
void saveMember() {
...
}
void loadMember() {
...
}
void saveBoard() {
...
}
void loadBoard() {
...
}
void saveGreeting() {
...
}
void loadGreeting() {
...
}
public static void main(String[] args) throws Exception {
new App().run(); // App ์์ฑ์ ํธ์ถ
}
}
run()
๋ฉ์๋๊ฐ ์ข
๋ฃ๋๊ธฐ ์ ์ ๊ฐ ๋ฉ๋ด์์ List
๊ตฌํ์ฒด์ ์ ์ฅํ๋ ๋ฐ์ดํฐ๋ค์ ํ์ผ์ ์ ์ฅํ๋๋ก ํ๊ณ ,
ํ๋ก๊ทธ๋จ ์์ ์ App
ํด๋์ค ์์ฑ์๋ฅผ ํธ์ถํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฉ์๋๋ฅผ ์ต์ด ํธ์ถํ๋๋ก ์์ ํ๋ค.
FileOutputStream
ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ์ํด FileOutputStream
๋ฅผ ์ฌ์ฉํ๋ค. ์์ฑ์์ String ํ์
์ผ๋ก ํ์ผ๋ช
์ ์ง์ ํด ์ค ์ ์๋ค.
ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ byte
(8 bit)๋จ์๋ก ์ฝ์ด ์ ์ฅํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void saveAssignment() {
try (FileOutputStream out = new FileOutputStream("assignment.data")) {
// ์ถํ ํ์ผ์์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ ๋ฐ์ดํฐ ๊ฐฏ์๋ฅผ for ํ์๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ ํ์ผ์ ๊ธฐ๋กํด๋๋ค.
out.write(assignmentRepository.size() >> 8);
out.write(assignmentRepository.size());
for (Assignment assignment : assignmentRepository) {
byte[] bytes = assignment.getTitle().getBytes(StandardCharsets.UTF_8);
// byte๊ฐฏ์๋ฅผ 2๋ฐ์ดํธ๋ก ์ถ๋ ฅ
out.write(bytes.length >> 8);
out.write(bytes.length);
out.write(bytes);
bytes = assignment.getContent().getBytes(StandardCharsets.UTF_8);
out.write(bytes.length >> 8);
out.write(bytes.length);
out.write(bytes);
out.write(assignment.getDeadline().toString().getBytes(StandardCharsets.UTF_8));
}
} catch (Exception e) {
System.out.println("๊ณผ์ ๋ฐ์ดํฐ ์ ์ฅ ์ค ์ค๋ฅ ๋ฐ์!");
e.printStackTrace();
}
}
- ์ ์ฒด ๋ฐ์ดํฐ์ ๊ฐฏ์๋ฅผ ๋ฏธ๋ฆฌ ํ์ผ์ ๊ธฐ๋กํด ๋๋ค. ๋ฐ์ดํฐ ๋ก๋ฉ ์(
loadAssignment()
) ๋ฐ๋ณต ํ์๋ก ์ฌ์ฉ๋๋ค.1 2
out.write(assignmentRepository.size() >> 8); out.write(assignmentRepository.size());
FileOutputStream
์write()
๋ ํ๊ฐ์ง ์ฌ๋ฐ๋ ์ ์ด ์๋๋ฐ, ํ๋ผ๋ฏธํฐ๋กint
ํ์ (4byte)์ ๋ฐ์ง๋ง ์ค์ ๋ก ์ฐ์ด๋๊ฑด ๋งจ ๋ 1 byte๋ง ์ฌ์ฉ๋๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ์๋ C์ธ์ด์์ ํ์ผ ์ ์ถ๋ ฅ์ ๋ค๋ฃฐ๋์ API spec์ ๊ทธ๋๋ก ๊ณ์นํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ค์ ๋ก JVM์ ๋ด๋ถ์ ์ผ๋ก JNI๋ฅผ ์ด์ฉํด OS ์ API๋ฅผ ํธ์ถํ๋ค. ์ด๋ ์๋์ ์ผ๋ก ๋๋ถ๋ถ์ ์ธ์ด์์ ํ์ผ์ ์ถ๋ ฅ ๋ฐฉ์์ ํต์ผ์ํค๊ธฐ ์ํจ์ผ๋ก ๋ณด์ธ๋ค.(์คํ์ค๋ฒํ๋ก์ฐ์๋ ๋น์ทํ ์ง๋ฌธ์ด ์ฌ๋ผ์จ๋ค.)FileOutputStream ์ write()๋ ๋ด๋ถ์ ์ผ๋ก OS API๋ฅผ ํธ์ถํ๋ค.
ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด์ค๋
size()
๊ฐ int ์ด๋ฏ๋ก 4byte(์์ ๋ฐ์ดํฐ๋ง ์ฝ 21์ต๊ฐ)๋ฅผ ์ฝ์ด์ผ ํ์ง๋ง, ๊ทธ์ ๋ ํฌ๊ธฐ์ ์ฌ์ด์ฆ๋ฅผ ๋ค๋ฃจ๋ ํ๋ก๊ทธ๋จ์ ์๋๊ธฐ ๋๋ฌธ์ ๋งจ ๋ค 2byte ์ ๋๋ง ์ฝ์ด๋ ์ถฉ๋ถํ๋ค๊ณ ๊ฐ์ ํ๋ค. - title, content ์ ์ ๋ณด๋ฅผ ์ฝ์ด์ byte ๋ฐฐ์ด๋ก ๋ณํํ๋ค.
1 2 3 4 5
byte[] bytes = assignment.getTitle().getBytes(StandardCharsets.UTF_8); // byte๊ฐฏ์๋ฅผ 2๋ฐ์ดํธ๋ก ์ถ๋ ฅ out.write(bytes.length >> 8); out.write(bytes.length); out.write(bytes);
์ด๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ ํญ๋ชฉ์ ๊ธ์์๋ฅผ ํจ๊ป ํ์ผ์ ๊ธฐ๋กํด ๋๋ค.
write([] byte)
์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํธ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๊ธฐ๋กํ๋ค.getDeadline()
์ ๊ฒฝ์ฐjava.sql.Date
ํ์ ์ธ๋ฐ, ์ด๋toString()
์ ํธ์ถํ๋ฉดyyyy-mm-dd
ํ์์ผ๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๊ธ์์๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ด ๋ ์ง๋ฅผ ๋ค๋ฃจ๊ธฐ ํธํ๋ค.
FileInputStream
ํ์ผ์ ์
๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ์ํด FileInputStream
๋ฅผ ์ฌ์ฉํ๋ค. ์์ฑ์์ String ํ์
์ผ๋ก ์ฝ์ด ๋ค์ผ ํ์ผ๋ช
์ ์ง์ ํด ์ค ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก byte
(8 bit)๋จ์๋ก ์ฝ์ด์จ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void loadAssignment() {
try (FileInputStream in = new FileInputStream("assignment.data")) {
byte[] bytes = new byte[60000];
int size = in.read() << 8 | in.read();
for (int i = 0; i < size; i++) {
int len = in.read() << 8 | in.read();
in.read(bytes, 0, len);
String title = new String(bytes, 0, len, StandardCharsets.UTF_8);
len = in.read() << 8 | in.read();
in.read(bytes, 0, len);
String content = new String(bytes, 0, len, StandardCharsets.UTF_8);
// ๋ ์ง๋ 10 byte ๋ง ์ฝ๋๋ค
in.read(bytes, 0, 10);
Date deadline = Date.valueOf(new String(bytes, 0, 10, StandardCharsets.UTF_8));
Assignment assignment = new Assignment();
assignment.setTitle(title);
assignment.setContent(content);
assignment.setDeadline(deadline);
assignmentRepository.add(assignment);
}
} catch (Exception e) {
System.out.println("๊ณผ์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ค ์ค๋ฅ ๋ฐ์!");
e.printStackTrace();
}
}
- ํ์ผ์ ์ ์ฅ ์ ๋งจ ์ฒ์ 2byte์ ์
๋ ฅํ ๋ฐ์ดํฐ ์ ์ฒด ๊ฐฏ์(
size()
)๋ฅผ ์ง์ ํ์ผ๋ฏ๋ก ์ด๋ฅผ ์ฝ์ด์จ๋ค.1
int size = in.read() << 8 | in.read();
8bit ์ผ์ชฝ ์ด๋ ๋นํธ ์ฐ์ฐ์ ๊ฒฐ๊ณผ์ ๋ง์ง๋ง ๋นํธ์ OR ์ฐ์ฐ์ ์ด์ฉํ๋ฉด ์ด 2byte๋ฅผ ์ฝ์ด์ฌ ์ ์๋ค.
1 2 3
0101 OR 0011 = 0111
- size๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ๋ฐ์ดํฐ์ ์๋ฆฟ์ ๋งํผ ๊ฐ์ ธ์จ๋ค.
1 2
int len = in.read() << 8 | in.read(); in.read(bytes, 0, len); // ์ฝ์ด์จ ๋งํผ ๋ฒํผ์ ๊ธฐ๋กํ๋ค.
ํ์ผ์ ์ ๋ ฅ ์ ๋ฐ์ดํฐ ๊ฐฏ์์ ์ฌ์ด์ฆ๋ฅผ ๋จผ์ ์ ๋ ฅํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ์ผ๋ฏ๋ก ์ ๋ ฅํ ๋ฐ์ดํฐ์ ๊ธธ์ด๋ฅผ ์ ์ ์๋ค. ์ฝ์ด ์จ ๋ฐ์ดํฐ์ ๊ธธ์ด๋ฅผ
len
๋ณ์์ ์ฌํ ๋นํ๋ฉด์ ๊ณ์ ์ฝ์ด๋๊ฐ๋ค. ์ด๋ฅผ ๋ฒํผ(byte[] bytes = new byte[60000]
)์ ์์ ์ ์ฅํ๋ค๊ฐ ๋ฐ๋ก String ๊ฐ์ฒด๋ก ์ฝ์ด ๋ณํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒํผ๋ ๊ณ์ ์ฌ์ฌ์ฉ ๋๋ค. ๋ ์ง์ ๊ฒฝ์ฐ ํ์์ด ํญ์ ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ 10byte๋ง ์ฝ๋๋ค.(yyyy-mm-dd
)์ฝ์ด์จ ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ ์ํจ๋ค.(
assignmentRepository.add(assignment)
)
๋ฐ์ดํฐ ์ ์ถ๋ ฅ ํ๋ฆ
๋ฐ์ดํฐ ํ๋ฆ
DataOutputStream / DataInputStream (wrapper class ๊ตฌํ)
์ด์ ์ฝ๋์์ FileOutputStream
๊ณผ FileInputStream
์ ์ด์ฉํด ํ์ผ ์
์ถ๋ ฅ์ ๋ค๋ฃจ๋ฉด์ ๋ถํธํ ์ ์ด ์์๋๋ฐ,
๊ทธ๊ฑด ๋ฐ๋ก byte ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค๋ ๊ฒ์ด๋ค. ํ์ผ ์
์ถ๋ ฅ ์ ๋ฐ์ดํธ ํ๋ํ๋ ์ฝ์ด์ค๋ ์ฝ๋๋ฅผ ์ฌ๊ธฐ์ ๊ธฐ ์ค๋ณต์ผ๋ก ์์ฑํด์ผ ํ๋ค.
์ด๋ฐ ๋ถ๋ถ์ ๋์ ํ ํด๋์ค(wrapper class
) ๋ฅผ ๋ง๋ค์ด๋ณด์.
DataOutputStream
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class DataOutputStream extends FileOutputStream {
public DataOutputStream(String name) throws FileNotFoundException {
super(name);
}
// 2 byte ์ถ๋ ฅํ๊ธฐ
public void writeShort(int value) throws IOException {
write(value >> 8);
write(value);
}
// 4 byte ์ถ๋ ฅํ๊ธฐ
public void writeInt(int value) throws IOException {
write(value >> 24);
write(value >> 16);
write(value >> 8);
write(value);
}
// 8 byte ์ถ๋ ฅํ๊ธฐ
public void writeLong(long value) throws IOException {
write((int) (value >> 56));
write((int) (value >> 48));
write((int) (value >> 40));
write((int) (value >> 32));
write((int) (value >> 24));
write((int) (value >> 16));
write((int) (value >> 8));
write((int) value);
}
// ๋ฌธ์์ด ์ถ๋ ฅ
public void writeUTF(String value) throws IOException {
byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
writeShort(bytes.length);
write(bytes);
}
public void writeBoolean(boolean value) throws IOException {
if (value) {
write(1);
} else {
write(0); // ์ค์ ๋ก๋ 0x00 ๋๋ 0x01 ์ด๋ค. ์ฆ, ๋
ผ๋ฆฌ๊ฐ ์ถ๋ ฅ.
}
}
}
๊ธฐ์กด์ ๋น์ฆ๋์ค ๋ก์ง์์ ๋นํธ ์ด๋ ์ฐ์ฐ์ ํ๋ ์ฝ๋๋ฅผ ์ถ์ถํด ๋ฉ์๋์์์ ์์ ํ๋๋ก ๋ง๋ค์๋ค. ์ด๋ก ์ธํด ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด ์ง๋ค.
saveAssignment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void saveAssignment() {
try (DataOutputStream out = new DataOutputStream("assignment.data")) {
// ์ ์ฅํ ๋ฐ์ดํฐ ๊ฐฏ์๋ฅผ 2๋ฐ์ดํธ๋ก ์ถ๋ ฅํ๋ค.
out.writeShort(assignmentRepository.size());
for (Assignment assignment : assignmentRepository) {
out.writeUTF(assignment.getTitle());
out.writeUTF(assignment.getContent());
out.writeUTF(assignment.getDeadline().toString());
}
} catch (Exception e) {
System.out.println("๊ณผ์ ๋ฐ์ดํฐ ์ ์ฅ ์ค ์ค๋ฅ ๋ฐ์!");
e.printStackTrace();
}
}
ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ดํฐ๋ง ์ ๋ฌํด์ฃผ๋ฉด ๋ฐ์ดํธ๋ฅผ ํ๋์ฉ ์ด๋ํ๋ฉด์ ํ์ผ์ ์ฐ๋ ์์ ์ ๋ฉ์๋ ๋ด๋ถ์์ ํ๋ค.
DataInputStream
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class DataInputStream extends FileInputStream {
public DataInputStream(String name) throws FileNotFoundException {
super(name);
}
public short readShort() throws IOException {
return (short) (read() << 8 | read());
}
public int readInt() throws IOException {
return (read() << 24 | read() << 16 | read() << 8 | read());
}
public long readLong() throws IOException {
return ((long) read() << 56 |
(long) read() << 48 |
(long) read() << 40 |
(long) read() << 32 |
(long) read() << 24 |
(long) read() << 16 |
(long) read() << 8 |
(long) read());
}
public boolean readBoolean() throws IOException {
return read() == 1; // 0์ด๋ฉด false, 1์ด๋ฉด true ๋ฆฌํดํ๋ค.
}
public String readUTF() throws IOException {
int len = readShort();
// byte[] buf = new byte[len];
// read(buf, 0, len);
byte[] buf = readNBytes(len); // ์์ ๊ฐ์ ์ฝ๋ (java11 ๋ถํฐ ์ง์๊ฐ๋ฅ)
return new String(buf, 0, len, StandardCharsets.UTF_8);
}
}
loadAssignment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void loadAssignment() {
try (DataInputStream in = new DataInputStream("assignment.data")) {
int size = in.readShort();
for (int i = 0; i < size; i++) {
Assignment assignment = new Assignment();
assignment.setTitle(in.readUTF());
assignment.setContent(in.readUTF());
assignment.setDeadline(Date.valueOf(in.readUTF()));
assignmentRepository.add(assignment);
}
} catch (Exception e) {
System.out.println("๊ณผ์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ค ์ค๋ฅ ๋ฐ์!");
e.printStackTrace();
}
}
์ ๋ฆฌ & ๊ฐ์ ์ฌํญ
๊ธฐ์กด ์ฝ๋์์ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ด ๋ฉ๋ชจ๋ฆฌ ์์์๋ง ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ํ์ผ ์
์ถ๋ ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํด ํ์ผ๋ก ์ฝ๊ณ ์ฐ๋๋ก ์์ ํ๋ค.
๋ํ FileInputStream
๊ณผ FileOutputStream
์ ์์๋ฐ์ ๋ง๋ wrapper class
๋ฅผ ์ด์ฉํด ํด๋ผ์ด์ธํธ์์ ์ฝ๋๋ฅผ ๊ฐํธํ๊ฒ ์์ฑํ ์ ์๋๋ก ๋ง๋ค์๋ค.
๊ทธ๋ฌ๋ ์์ง ๋ช๊ฐ์ง ๊ฐ์ ํด์ผ ํ ์ฌํญ์ด ์๋ค. ์ฒซ๋ฒ์งธ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ ์ถ๋ ฅ ์๋๊ฐ ๋งค์ฐ ๋๋ ค์ง๋ค๋ ์น๋ช ์ ์ธ ๋ฌธ์ ๊ฐ ์๋ค. (data seek time) ๋๋ฒ์งธ๋ ์ฒซ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์์์ ์ด์ฉํ๋๋ฐ, ์ด๋ก์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ ๋ํด ์์๋ณธ๋ค. (์์์ ์ด์ฉํ ๊ธฐ๋ฅํ์ฅ ๋ฐฉ์์ ๋ฌธ์ ์ )
๋ค์ ๊ธ์ ์ด์ด์ ๊ฐ์ ํด ๋ณด๋๋ก ํ๋ค.
1. data seek time
๐ ๋ฒํผ์ ๋ด์์ ์ฝ๊ณ ์ฐ๋๋ก ๋ณ๊ฒฝํ๊ธฐ
2. ์์์ ์ด์ฉํ ๊ธฐ๋ฅํ์ฅ ๋ฐฉ์์ ๋ฌธ์ ์
๐ ๋ฐ์ฝ๋ ์ดํฐ ํจํด(Decorator pattern)์ ์ด์ฉํด ๊ฐ์ ํด๋ณด์.
๋๊ธ๋จ๊ธฐ๊ธฐ