* 문자열 기반스트림
FileOutPutStream & FileInputStreamFileWriter & FileReader
: 텍스트파일에 문자데이터를 저장하거나(쓰거나) 텍스트파일로부터 문자에이터를 읽는 문자열 기반스트림
* 바이트기반의 스트림들은 데이터를 1바이트 단위로 입출력하지만,
문자기반스트림은 데이터를 2바이트(char) 씩 입출력한다.
자바의 문자는 2바이트이기 때문에 문자를 1바이트 단위로 쪼개서 입출력하게 될 경우
문제가 발생할 여지가 있다.
* 문자기반 스트림(Reader, Writer)는 데이터를 2바이트씩 주고 받기 때문에 문자 데이터를
보다 안전하게 다룰 수 있다.
1. FileWriter
텍스트 단위의 데이터만 써낼 수 있는 클래스
String fileName = sc.nextLine();
FileWriter fw = new FileWriter(fielName, true);
내가 원하는 문자열을 받아 파일명을 생성할 수 있다. (fielName, true) 여기서
true 값을 붙여주게 되면, 쓰고자하는 내용을 fileName에 이어붙여서 쓰겠다는 의미!
fw.write(contents); 를 통하여 입력받은 문자열을 써낼 수 있다.
또한 char타입이 아닌 String타입의 데이터도 받아주기 때문에 변환할 필요가 없다.
2. FileReader
텍스트 단위의 데이터만 읽어낼 수 있는 클래스
(텍스트의 경우 우리가 읽어낼 수 있는 형태로 반환하지만, 사진자료나 기타 스트림 형태의 자료를
FileReader를 통해 읽어내려고 하면 알 수 없는 코드형태의 문자가 반환된다.)
FileReader fr = new FileReader(fileName)
파일명(fileName)을 통해 읽어낼 파일객체를 만들어주고 난 뒤에
반복문을 통해 파일에 들어있는 텍스트데이터를 읽어주는데, 이떄 사용하는 메소드가
FileReader의 read를 통해서 읽어주게 된다. 하지만 이때 read메소드는 읽어낼 문자열은 int형
유니코드로 반환하기 때문에 이때 읽어내 결과값을(char)로 형변환 시켜줘야한다.
(char) 형태로 형변환 하지 않으면 결과값이 유니코드 문자로 출력된다는 걸 확인할 수 있다.
char형으로 형변환 시키지 않은경우 -> 유니코드 문자로 반환된다.
반복문으로 읽어낸 문자값을 char형으로 형변환 한 경우 -> 문자열이 제대로 반환됨
FileReader 의 read 메소드를 사용할 때 그 값을 -1이 아닌경우를 true로 설정하여 반복문을 돌리는 이유는
일단 read메소드는 읽어낼 값을 문자열 하나하나로 받아내기 때문에 모든 문자열을 읽어내려면
반복문을 돌려야 한다. 또한 -1과 비교하는 것은 read메소드는 데이터 안에 더이상 읽어낼 데이터가 없다면,
-1 값을 반환하기 때문이다 !
[ while((check = fr.read()) != -1) = FileReader로 읽어내는 파일의 데이터가 -1을 반환하지 않을 때까지 반복하시오 ]
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
|
package com.kh.filter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class C_FileWR {
Scanner sc = new Scanner(System.in);
public void fileOut() {
System.out.print("파일명을 작성하세요(확장자까지) : ");
String fileName = sc.nextLine();
System.out.println("문구를 작성하세요 : ");
String contents = sc.nextLine();
try(FileWriter fw = new FileWriter(fileName, true)){
fw.write(contents); //fileWriter는 String도 받아주기 때문에 byte로 변환할 필요 없음
System.out.println("파일 생성이 완료되었습니다. 프로젝트를 새로고침하세요");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void fileInput() {
System.out.print("읽어올 파일명을 작성하세요(확장자까지) : ");
String fileName = sc.nextLine();
try(FileReader fr = new FileReader(fileName)){
int check = 0;
String res = "";
while((check = fr.read()) != -1) {
res += (char)check;
}
//FileReader.getEncoding():이전 인코딩을 반환하는 메서드
res = new String(res.getBytes(fr.getEncoding()), "ksc5601");
System.out.println(res);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
|
cs |
'BackEnd > Java' 카테고리의 다른 글
JAVA 기본적인 코드 다루기 (0) | 2020.11.10 |
---|---|
IO_OutputStreamWriter & InputStreamReader (0) | 2020.11.10 |
IO_ ObjectInputStream & ObjectOutputStream (0) | 2020.11.01 |
IO_BufferedInputStream & BufferedOutputStream (0) | 2020.10.31 |
IO_FileOutPutStream & FileInputStream (0) | 2020.10.31 |
댓글