//////
Search
🗒️

전수진

날짜
2022/10/06
작성자
전수진
카테고리
회고

문자 스트림

실행되는 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
복사