프로그래밍 언어/<Java>영어단어장 project

2. java 단어장에 글 입력, 저장하기(FileWriter(),OutputStreamWriter(),FileOutputStream())

창조적생각 2021. 7. 27. 12:20

목차

1. 전체 코드

 

2. FileWriter()의 사용과 인코딩 오류

 

3. OutputStreamWriter(),FileOutputStream() 사용하기

 

4. 마치며...

 

☆ [완성된 입력 및 외부 저장 장치]

 

지난 번 java 단어장에 저장된 글을 읽어 오기에 이어 자바 프로그램 안에서 단어장으로 저장하는 방법에 대해서 알아보겠습니다.

이 전 페이지를 보지 않으셨다면 한 번 보시는 것도 추천드립니다.

 

1. 전체 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    void Question_W() {
        OutputStreamWriter out = null;
        FileOutputStream fos = null;
        
        try {
            fos = new FileOutputStream("c:\\Temp\\test.txt",true);
            out = new OutputStreamWriter(fos,"UTF-8");
            String in_eng = sc.next();
            String in_kor = sc.next();
            out.write("/");
            out.write(in_eng);
            out.write("/");
            out.write(in_kor);
            out.close();
        }
        catch(IOException e){
            System.out.println("입출력오류");
        }
    }
cs

 

 

2. FileWriter()의 사용과 인코딩 오류

 

처음에는 단순하게 FileWriter을 사용해 간단하게 만들 수 있을 것이라는 안일한 생각을 했습니다.

그런데 실험을 위해 english,영어 라고 입력했더니

 

한글이 제대로 인코딩이 되지 않았습니다. 그래서 메모장 상태를 확인하러 갔습니다.

음... 앞의 문자들이 다 깨져있군요. 저 같은 초보자들은 이같은 문제를 자주 겪을거라고 생각합니다.

 그래서 확실하게 인코딩을 해주기 위해서 아예 자바 안에서 인코딩 문자집합을 불러오는 문자집합과 일치해서 입력해주기로 했습니다. 바로 프로그램안에서 인코딩 문자집합을 지정해서 입력하는 방법으로 말입니다.

 

[그래서 안타깝지만 일단은 텍스트 파일안에 있는 문자들을 모조리 지웠습니다.

 입력 함수부터 짰으면 이런 일이 없었을 것인데 아쉽네요.

 그리고 fileWriter가 아닌 인코딩을 지정해줄수 있는 OutputStreamWriter()를 사용해서 적기로 했습니다.]

 

3. OutputStreamWriter(),FileOutputStream() 사용하기

 

우리는 이미 앞 서 메모장에 있는 내용을 불러오기 위해 InputStreamReader()와 FileInputStream()을 사용했습니다.

OutputStreamWriter()과 FileOutputStream()은 정확하게 그 반대로 작동합니다.

(1) FileOutputStream을 fos로 객체지정을 해주고, 경로"c:\\Temp\\test.txt"를 지정해줍니다.

 

※ fos = new FileOutputStream("c:\\Temp\\test.txt",true); 여기에서 true는 이 문서 안에 다른 내용이 있느냐는 물음입니다. true 쓰게 된다면 그렇다라고 대답했으므로 안에 있는 내용에 이어서 작성이 됩니다.

 

그러나 저 곳에 아무것도 쓰지 않거나, false를 쓰게 된다면 안에 있는 내용을 다 지우고 새로이 작성하기때문에 구분을 반드시 해주셔야 합니다.

 

(2)OutputStreamWriter 를 out로 객체지정을 해줍니다. 그리고 fos를 경로로 지정해주고, 인코딩 문자집합을 'UTF-8'로 지정을 합니다.

 

이제 다 끝났습니다. scanner를 이용해 입력을 받아주기만 하면 됩니다.

앞서서 String 배열을 만들기 위한 구분자로 우리는 "/"를 사용했습니다.

그렇기때문에 입력할때도 그 것이 반영되게 해야 하는데요.

처음에 입력할때는

 

out.write(in_eng);

out.write("/");

out.write(in_kor);

 

로 해서 "/"가 하나만 들어가게 해줍니다.

 

그리고 그 다음부터는

out.write("/");

out.write(in_eng);

out.write("/");

out.write(in_kor);

 

로 해서 항상 구분이 될수 있도록 해줍니다.

 

여기서 간단하게 for 문과 if구문을 써서 빠르게 적어줄수도 있지만, 하나하나 들어가서 벡터값에 저장되는지를 보기 위해 저는 그냥 프로그램을 한번씩 돌려가며 입력했습니다. 머리가 나쁘면 몸이 고생하는 법입니다.

잘들어가고 있습니다.

이렇게 하나하나 다 쳐넣어서 벡터값에 저장되는 것을 확인한 후에 메모장을 열어서 역시 확인해보았습니다.

잘 들어가 있었습니다.

 

이제 입력 및 외부 저장 장치가 완료되었습니다. 벡터저장 시스템과 붙여보겠습니다.

간단하게 Question_W() 함수를 이어붙여주고 생성자에 넣어주면 됩니다.

 

[완성된 입력 장치 및 외부 저장 장치]

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
91
92
93
94
import java.util.*;
import java.io.*;
class Word{
    private String english; 
    private String korean; 
    public Word(String english, String korean) {
        this.english = english;
        this.korean = korean;
    }
    public String getEnglish() { return english; }
    public String getKorean() { return korean; }
}
public class question_box {
    question_box(){
        Question_W();
        Question_R();
        addvector();
    }
    Scanner sc = new Scanner(System.in);
    
    Vector<Word> v = new Vector<Word>();
    Vector<String> V_eng = new Vector<String>();
    Vector<String> V_kor = new Vector<String>();
    
    String meta ="";
 
    
    void Question_R() {
        InputStreamReader in = null;
        FileInputStream fin = null;
        try {
            fin = new FileInputStream("c:\\Temp\\test.txt");
            in = new InputStreamReader(fin,"UTF-8");
            int c;
            
            while((c = in.read()) != -1) {
                meta += (char)c;
            }
        
            fin.close();
            in.close();
        }
        catch(IOException e) {
            System.out.println("입출력오류");
        }
    }
    void addvector() {
        String [] tokens = meta.split("/");
        for(int i =0; i<tokens.length;i++) {
            if(i%2 == 0)
                V_eng.add(tokens[i]);
            else V_kor.add(tokens[i]);
                
        }
        for(int i =0; i < V_kor.size();i++) {
            String Kor = V_kor.get(i);
            String Eng = V_eng.get(i);
            v.add(new Word(Eng,Kor));
            String M = v.get(i).getEnglish();
            String N =v.get(i).getKorean();
            System.out.print("("+M+","+N+")");
            
            
        }
        
    }
    void Question_W() {
        OutputStreamWriter out = null;
        FileOutputStream fos = null;
        
        try {
            fos = new FileOutputStream("c:\\Temp\\test.txt",true);
            out = new OutputStreamWriter(fos,"UTF-8");
            String in_eng = sc.next();
            String in_kor = sc.next();
            out.write("/");
            out.write(in_eng);
            out.write("/");
            out.write(in_kor);
            out.close();
        }
        catch(IOException e){
            System.out.println("입출력오류");
        }
    }
    
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new question_box();
        
    }
 
}
cs

 

[실행결과]

'decision' '결정'을 입력하면

 

벡터에 저장됨을 확인할 수 있습니다.
그리고 메모장에도 저장되는 것을 알 수 있습니다.

 

4. 마치며...

 

입출력 장치를 만듦에 있어 한글을 써야 해서 인코딩 문제가 발생했습니다.

 

그래서 외부에 저장하는 것과 외부에서 가져오는 인코딩 문자집합을 일치시켜줌으로써 해결했습니다.

 

다음시간에는 이렇게 벡터로 저장된 문자열을 가지고 랜덤으로 객관식 문제를 내는 함수를 작성하겠습니다.

 

*긴 글 읽어봐 주셔서 감사합니다.

 

**귀하의 앞 길에 꽃길만이 이어지기를 기원하겠습니다.

 

 

[처음으로]

728x90