문자 스트림
•
실행되는 OS의 기본 문자 인코딩 방식에 맞춰 문자를 입출력하는 스트림
◦
char c; //자바에선 2바이트 유니코드
◦
MS windows의 경우 멀티 바이트
▪
영문/숫자/기호 : 1바이트로 인코딩
▪
한글: 2바이트로 인코딩
•
종류
◦
바이트 스트림에 대응하는 Reader와 Writer 클래스로 구성
문자 스트림 클래스 계층 구조
Reader / Writer
•
Reader
◦
문자 입력 스트림의 최상위 추상 클래스
▪
바이트 스트림의 InputStream에 대응
▪
한 문자(2바이트)를 스트림으로부터 읽어드림
•
Writer
◦
문자 출력 스트림의 최상위 추상 클래스
▪
바이트 스트림의 OutputStream에 대응
▪
한 문자(2바이트)를 스트림에 씀
BufferedReader / BufferedWriter
•
FileReader
◦
character 파일을 읽을 수 있는 기능을 제공
FileReader(File file)
FileReader(File file, Charset charset) // Java 11 이후
FileReader(FileDescriptor fd)
FileReader(String fileName)
FileReader(String fileName, Charset charset) // Java 11 이후
Java
복사
•
BufferedReader
◦
String readLine( ) 추가
▪
한 줄(개행문자까지)씩 읽어 들임
BufferedReader br = Files.newBufferedReader(
Paths.get(filename), StandardCharsets.UTF_8)
Java
복사
•
FileWriter
◦
void write(String) 추가
•
BufferedWriter
◦
newLine( ) 추가
◦
개행문자를 추가하기 위해 끝에 다음을 삽입할수도 있음
▪
System.getProperty(”line.separator”);
FileNotFoundException
•
경로가 존재하지 않을 때 발생하기에 반드시 이 예외에 대한 예외처리를 해주어야 함
•
경로는 존재하나 파일이 없을 때는 예외 발생 없이, 파일이 생성됨
자바로 대용량 데이터 분석하기
•
MDIS 사이트에서 국내인구이동통계 관련 자료를 CSV파일로 저장하기
•
2021 서울에서 가장 많이 이사간 지역이 어디인지 알아내기
PopulationMove 클래스
package week3.day4.java;
public class PopulationMove {
private int fromSido; //전입
private int toSido; //전출
// constructor추가 fromSido, toSido를 받아서 멤버변수에 넣는 기능
public PopulationMove(int fromSido, int toSido) {
this.fromSido = fromSido;
this.toSido = toSido;
}
public PopulationMove(String fromSido, String toSido) {
this.fromSido = Integer.parseInt(fromSido);
this.toSido = Integer.parseInt(toSido);
}
public int getFromSido() { //getter 추가
return fromSido;
}
public int getToSido() {
return toSido;
}
}
Java
복사
PopulationStatistics 클래스
package week3.day4.java;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class PopulationStatistics {
public void readByChar(String filename) throws IOException {
FileReader fileReader = new FileReader(filename);
// 파일을 읽지 않는다
//한 바이트씩 읽기
//BufferedReader 보다 비효율적
String fileContents = "";
while (fileContents.length() < 1_000_000) {
char c = (char)fileReader.read();
fileContents += c;
System.out.println(fileContents);
}
/*
char c = (char)fileReader.read(); //한 바이트씩 읽음
System.out.println(c);
*/
}
public List<PopulationMove> readByLine(String filename) throws IOException {
//삽
List<PopulationMove> pml = new ArrayList<>();
BufferedReader reader = new BufferedReader(
new FileReader(filename)
);
String str;
while ((str = reader.readLine()) != null) {
// System.out.println(str);
PopulationMove pm = parse(str);
pml.add(pm);
}
reader.close();
return pml;
}
public void readByLine2(String filename) {
try(BufferedReader br = Files.newBufferedReader(
Paths.get(filename), StandardCharsets.UTF_8)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void createAFile(String filename) {
File file = new File(filename);
try {
file.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// List<String>을 지정한 파일에 wirte
public void write(List<String> strs, String filename) {
File file = new File(filename);
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
for (String str : strs) {
writer.write(str);
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public PopulationMove parse(String data) {
String[] splittedLine = data.split(",");
return new PopulationMove(splittedLine[6],splittedLine[1]); // 전입 전출
}
public String fromToString(PopulationMove populationMove) {
return populationMove.getFromSido() + "," + populationMove.getToSido() + "\n";
}
public static void main(String[] args) throws IOException {
String address = "C:\\Users\\baeks\\OneDrive\\바탕 화면\\221007\\LikeLionJava-221007\\from_to.txt";
PopulationStatistics populationStatistics = new PopulationStatistics();
List<PopulationMove> pml = populationStatistics.readByLine(address);
for(PopulationMove pm : pml) {
System.out.printf("전입:%s, 전출:%s\n",pm.getFromSido(), pm.getToSido());
}
}
}
Java
복사