brograming
[입출력] 문자 기반 스트림 본문
입출력 I/O
Input과 Output의 약자로 입출력이라고 한다. 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것
입력 스트림 : 밖에서 프로그램쪽으로 데이터의 흐름을 소프트웨어로 구현한 모듈
출력 스트림 : 프로그램에서 밖으로 데이터의 흐름을 소프트웨어로 구현한 모듈
스트림
스트림이란 데이터를 운반하는데 사용되는 연결통로이다.
단방향 통신만 가능해서 하나의 스트림으로 입력과 출력을 동시에 처리불가하다.
동시에 수행하려면 입력 스트림과 출력 스트림 모두 필요하다.
스트림은 먼저 보낸 데이터를 먼저 받게 되는 FIFO 방식으로 이루어진다.
문자 기반 스트림
바이트 기반의 입출력 단위는 1byte이다. 한 문자를 의미하는 char형은 2byte이기 때문에 바이트 기반 스트림으로 2byte문자를 처리하는데는 어려움이 있다.
그래서 문자기반의 스트림이 제공된다.
ㆍ문자 스트림 : 한 문자씩(2byte) 읽고 씀. 문자만 입출력할 때 사용
- Reader : FileReader(파일에서 2바이트씩 읽는 스트림)
int read() : 2 바이트 읽어서 int 타입(4byte 끝 2개에 저장)으로 반환
int read( char[] ) : 파라미터로 넣은 배열 크기만큼 읽어서 배열에 저장. 반환값은 읽은 문자 수를 반환.
int read( char[], offs, size ) : size만큼 읽어서 배열에 저장. 저장 시작 위치를 offs로. 반환값은 읽은 문자 수를 반환.
- Writer : FileWriter(파일에 2바이트씩 출력 스트림)
void write(int ch) : 문자 한개 출력
void write( char[] ) : 배열 크기만큼 배열요소들을 출력. 출력한 문자 수 반환
void write( char[], offs, size) : byte[] 배열에서 offs위치부터 size크기만큼을 출력. 출력한 문자 수 반환
void write(String str) : 문자열(String) 출력
텍스트 파일을 다루는 경우에는 FileInputStream / FileOutputStream 보다 문자기반의 스트림인 FileReader / FileWriter를 사용하는 것이 좋다.
바이트 기반 스트림과 문자 기반 스트림 차이점
InputStream은 Reader
OutputStream은 Writer
byte배열 대신 char배열 사용
바이트 기반 스트림과 문자 기반 스트림은 이름만 조금 다를 뿐 활용방법은 거의 같다.
FileReader와 FileWriter
파일로부터 텍스트 데이터를 읽고, 파일에 쓰는데 사용된다.
read()
FileReader : 파일에서 문자단위로(2바이트씩) 읽는 스트림
(ch=fr.read()) : 읽은 문자를 ch에 담는다.
ch 출력시 char 로 변환하여 출력.
public class FileReaderTest {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("src/입출력스트림/files/a.txt");
int ch;
while((ch=fr.read())!=-1) {
System.out.print((char)ch);
}
fr.close();
}
}
}
read(char[ ])
char[] buf = new char[10]; : read(char[ ])읽은 데이터를 저장할 배열 생성. 길이 10
size : read(char[ ])가 읽은 문자 수 저장
buf : 실제 읽은 문자 저장
public class FileReaderTest {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("src/입출력스트림/files/a.txt");
char[] buf = new char[10];
int size;
while((size = fr.read(buf)) > 0) {
System.out.print(new String(buf));
Arrays.fill(buf, ' ');
}
fr.close();
}
}
}
read( ), write(int ch)
public class FileCopyTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String src = "src/입출력스트림/files/a.txt"; // 원본 파일 경로
String des = "src/입출력스트림/files/z.txt"; // 복사 파일 경로
try {
FileReader fr = new FileReader(src); // 원본 파일에서 1문자씩 읽는 스트림 생성
FileWriter fw = new FileWriter(des); // 복사 파일에서 1문자씩 출력 스트림 생성
int ch;
while ((ch = fr.read()) != -1) { // 원본 파일에서 1문자씩 읽어서 ch에 저장
fw.write(ch);; // ch값을 복사 파일에 출력
}
fr.close();
fw.close();
}
}
}
write( )
public class FileWriterTest {
public static void main(String[] args) {
try {
//파일에 문자 단위로 출력 스트림
FileWriter fw = new FileWriter("src/입출력스트림/files/d.txt");
String str = "hello java FileWriter";
for (int i = 0; i < str.length();i++) {
fw.write(str.charAt(i)); //문자열 길이만큼 문자 한개씩 출력
}
fw.write("\n");
fw.write(str); //String 값 하나 출력
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}'[JAVA]' 카테고리의 다른 글
| 자바 jdk-17 설치 및 환경변수 설정 (0) | 2023.07.25 |
|---|---|
| char 배열을 문자열로 변환 String.valueOf() / new String() (0) | 2023.04.17 |
| [입출력] 바이트 기반 스트림 (0) | 2023.04.17 |
| [Collection] ArrayList (0) | 2023.04.16 |
| [Collection] Map (0) | 2023.04.16 |