project X) 3주차과제 메모
출처: https://zangzangs.tistory.com/171 [장장스:티스토리]
일단 스트림이 데이터 컬렉션 반복을 멋지게 처리하는 기능이라고 생각하자. 또한 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다.
스트림(Stream)은 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소로 정의할 수 있다.
출처: https://zangzangs.tistory.com/171 [장장스:티스토리]
데이터 처리 연산
스트림은 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산과 데이터베이스와 비슷한 연산을 지원한다. 예를 들어 filter, map, reduce, find, match, sort 등으로 데이터를 조작할 수 있다. 스트림 연산은 데이터를 순차적으로 또는 병렬로 실행할 수 있다.
소스
스트림은 컬렉션, 배열, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비한다. 정렬된 컬렉션으로 스트림을 생성하면 정렬이 그대로 유지된다. 즉, 리스트로 스트림을 만들면 스트림의 요소는 리스트의 요소와 같은 순서를 유지한다.
연속된 요소
컬렉션과 마찬가지로 스트림은 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다. 컬렉션은 자료구조이므로 컬렉션에서는 시간과 공간의 복잡성과 관련된 요소 저장(ex: add) 및 접근(ex: get) 연산이 주를 이룬다. 반면, 스트림은 filter, map, sorted처럼 표현 계산식이 주를 이룬다. 정리하면, 컬렉션의 주제는 데이터이고, 스트림의 주제는 계산이다.
컬렉션과의 차이
컬렉션이란??
https://kadosholy.tistory.com/117#google_vignette
자바 스트림이 뭔지?
https://zangzangs.tistory.com/171
FileInputStream으로 파일내용 출력
자바 exception 종류
https://dreamcoding.tistory.com/70
IOException은 입출력 작업 중에 발생하는 예외로, 파일이 존재하지 않거나 파일에 접근할 수 없는 경우 등의 입출력 관련 오류 시 발생합니다.
파일을 열거나 읽거나 쓸 때, 네트워크와의 통신 시, 입출력 작업을 수행하는 도중에 오류가 발생하는 경우 등에 발생합니다.
출처: https://yourusername.tistory.com/418 [가비엘:티스토리]
try/catch/finally 예외처리
https://blog.naver.com/phoenixttt/70042603452
자바 파일 입출력 스트림 FileInputStream과 FileOutputStream 개념 정리 및 활용
스트림은 단방향으로만 데이터를 전송할 수 있기 때문에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요하다.
출처: https://ittrue.tistory.com/167 [IT is True:티스토리]
FileInputStream, FileReader, 파일 불러오기
https://lasbe.tistory.com/65#04
throws 란?
텍스트파일 읽으려면 txt파일 위치를 프로젝트 내부에서 최상단에 해야 함
한글출력깨짐
https://m.blog.naver.com/sshoon3333/222205301927
<최종코드에서 쓴 새로운 기술들 정리>
각 클래스의 인자와 반환값
InputStreamReader: 문자단위로 읽어들인다
바이트 단위로 읽어 들이는 InputStream을 통해 입력을 받은 뒤,
문자 단위로 데이터를 변환시키는 중개자 역할을 하는 클래스
InputStream(아스키코드로 출력됨)의 단점을 보완해 우리가 입력한 문자 값을 그대로 출력해주는 역할을 한다.
사용예제
① : 주어진 입력 바이트 스트림 in에 대해 기본 인코딩을 사용하는 객체를 생성한다.
- InputStreamReader reader = new InputStreamReader(in); -
② : byte 배열대신에 char 배열로 데이터를 받을 수 있다.
Char[] a = new char[3];
reader.read(a)
FileInputStream
BufferReader -> 어떻게 더 효율적인지?
3) BufferedReader : 문자열을 읽어 들인다.
저번 포스팅에서 InputStreamReader 클래스는 고정된 길이로만 읽어야 한다는 불편한점이 있다고 하였다.
BufferedReader는 사용자가 엔터키를 입력할 때까지 사용자의 입력을 전부 받아들일 수 있게 하는 클래스로,
InputStreamReader의 단점을 보완해준다.
bufferreader vs scanner
StringBuilder
try-catch-finally
isr = new InputStreamReader(fis,"UTF-8");
stringBuilder.append(System.lineSeparator)
stringBuilder.toString
br, isr, fis 각각 닫혀있는지 확인해야 하는 이유... bufferreader도 stream인가요?
throws
public String getFormattedDate() throws ParseException{
// 날짜 형식변환 중 발생할 수 있는 예외 처리
String dateStr = fileName.substring(0, 12); // fileName의 12자리 추출하여 dateStr에 저장
// 객체 생성하여 입력 문자열의 날짜 형식을 지정
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMddHHmm");
// 출력 문자열의 날짜 형식 지정
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
// inputFormat.parse()를 사용하여 dateStr 문자열을 Date객체로 변환(parseException 예외 가능성 있음)
Date date = new Date();
try {
date = inputFormat.parse(dateStr);
// outputFormat.format()을 사용하여 Date객체 date를 지정된 출력 형식의 문자열로 변환하여 반환
return outputFormat.format(date);
} catch (ParseException e) { // 오류 발생시 처리
System.out.println("java.text.ParseException: " + e.getMessage());
System.out.println("파일 이름에서 날짜를 확인할 수 없습니다.");
e.printStackTrace();
}
return "";
}
SimpleDateFormat class의 인자와 반환형과 역할
파일 12글자 추출한 String 변수를
"yyyyMMddHHmm"
형식으로 바꾸는 SimpleDateFormat 객체 "inputFormat" 만들기
inputFormat.parse(dateStr) 파싱해서 date라는 Date 클래스 객체에 저장
이걸 또 format으로 바꿔서
yyyy-MM-dd HH:mm
로 리턴
main에서 manager 클래스의 manageNote(fileName) 함수 호출
manageNote에서 try로 Note 클래스의 note.getFormattedDate() 함수 호출해서 객체의 데이터 가져오기 시도
note.readContent로 파일내용 읽어오고... note.display로 파일내용 출력하고...
note객체의 getFormattedDate() 메서드는 파일명에서 글자 추출해서 날짜형식으로 바꾸는 메서드임
근데 이때 ParseException 으로 오류 날 수 있음
그래서 이 함수는 throws ParseException
여튼 try에서 readContent할 떄는 InputStreamReader, FileInputStream, BufferReader 를 생성
bufferreader의 readline 메서드로 한줄씩 읽어서 stringBuilder객체에 넣음
Try-catch-finally 대신 Try-with-resources
GC: JVM의 가비지 컬렉터. 불필요한 메모지 알아서 정리해줌
https://mangkyu.tistory.com/118