0418_1 Stream, File, try~catch~finally

Fifty·2025년 4월 18일

2. JAVA

목록 보기
32/33

Stream

자료의 흐름, 데이터뭉치(콜렉션 자료)
중간연산만 하고 최종연산을 안하면 결과가 안나온다.

  • 중간연산
    filter: 조건에 맞는 자료들 추출하기
    map: 자료를 특정한 형태로 변환하기(예: 문자열 → 문자열의 길이)
    sorted(): 정렬
    distinct(): 중복제거
    limit(): 스트림 범위 제한
    skip(): 스트림 내 데이터들 중 앞에서 n개 요소 건너 뜀
    등등
  • 최종연산
    collect(): 콜렉션 자료 만들어 반환
    forEach(): 각 요소에 대한 작업 수행
    count(): 요소 갯수 반환
    reduce(): 요소들을 하나의 결과로 만들기
    anyMatch(), allMatch(): 조건 검사
    등등

정렬 후 출력

package ex0418;
import java.util.Arrays;
import java.util.List;

public class StreamSortedTest {
	public static void main(String[] args) {

		List<String> list = Arrays.asList("홍길동","멸린","해리포터");
		list.stream()
			.sorted()	// 정렬 후 출력
			.forEach(n->System.out.print(n+"\t"));
		System.out.println();
		
		list.stream()
			.sorted((s1,s2) ->s2.length() - s1.length())	// 길이별 내림차순
			.forEach(n->System.out.print(n+"\t"));

	}
}

대문자로 변환 후 출력

		List<String> list = Arrays.asList("apple","banana","orange");
		
		list.stream()
			.map(s->s.toUpperCase()) //대문자로 변환
			.forEach(n->System.out.print(n+"\t"));
코드를 입력하세요

조건에 맞는 데이터 출력

		List<String> list = Arrays.asList("apple","anana","orange");
				
		// 단어들을 대문자로 변환하여 출력
		list.stream()
			.map(s->s.toUpperCase()) //대문자로 변환
			.forEach(n->System.out.print(n+"\t"));
		System.out.println();
		
		// 문자열의 길이가 5보다 큰 단어만 출력하기
		list.stream()
			.filter(s->s.length()>5)
			.map(s->s.toUpperCase()) //대문자로 변환
			.forEach(n->System.out.print(n+"\t"));
		System.out.println();
		
		// banana에서 b지우기
		list.stream()
			.filter(s->s.startsWith("b"))
			.map(s->s.replace("b", ""))
			.forEach(s->System.out.print(s+"\t"));
		System.out.println();
		
		// banana에서 b지우고 a로 시작하면 단어 대문자로 출력하기
		list.stream()
			.filter(s->s.startsWith("b"))
			.map(s->s.replace("b", ""))
			.filter(s->s.startsWith("a"))
			.map(s->s.toUpperCase())
			.forEach(s->System.out.print(s+"\t"));
		System.out.println();
		
		// e로 끝나는 단어만 대문자로 출력
		list.stream()
			.filter(s->s.endsWith("e"))
			.map(s->s.toUpperCase())
			.forEach(s->System.out.print(s+"\t"));

IntStream

sum(), count()

		int sum = IntStream.of(1,3,5,7,9).sum();
		System.out.println("sum: "+sum);
		
		long count = IntStream.of(1,3,5,7,9).count();
		System.out.println("count: "+count);

reduce

reduce(초기기준값, 비교대상값)

		List<String> list = Arrays.asList("홍길동","전우치","손오공");
		String name = list.stream()
						  .reduce("이순신", (s1,s2)-> (s1.length() >= s2.length()) ? s1:s2);
		System.out.println(name);

결과: 이순신

		List<String> list = Arrays.asList("홍길동","전우치","손오공","해리포터");
		String name = list.stream()
						  .reduce("이순신", (s1,s2)-> (s1.length() >= s2.length()) ? s1:s2);
		System.out.println(name);

결과: 해리포터

삼항연산자(if~else)

조건? 참 : 거짓;

StreamMidOps

		List<Integer> numbers = List.of(10,20,30,40,50,60,70);
		numbers.stream()
			   .skip(2)
			   .limit(3)
			   .forEach(System.out::println);	// 메서드참조

결과
30
40
50

Collectors 활용

		List<Integer> result = numbers.stream()
								      .skip(2)
								      .limit(3)
								      .collect(Collectors.toList());
		System.out.println(result);
        
        int i = results.stream()
					   .reduce(0, (a,b) -> a+b);
		
		System.out.println(i);

결과
[30, 40, 50]
120

System.out::println 참고

StreamFinal

		List<String> words = List.of("hello","hi","world");
		
		boolean result = words.stream()
							   .anyMatch(s->s.length() < 3); 	// 길이가 3 미만인 단어가 있나?
		System.out.println(result==true? "Yes":"No");
		
		
		boolean result2 = words.stream()
							   .allMatch(s->s.length() < 3); 	// 조건을 모두 만족하나?
		System.out.println(result2==true? "Yes":"No");

결과
Yes
No


File

Exists()

		File file = new File("C:/temp/jv_test/test.txt");
		
		if(file.exists()) {
			System.out.println("파일이름: "+file.getName());
			System.out.println("절대경로: "+file.getAbsolutePath());
			System.out.println("파일크기: "+file.lastModified()+"bytes");
		}else {
			System.out.println("파일이 존재하지 않습니다.");
		}

결과

  • 파일이 있을 경우
    파일이름: test.txt
    절대경로: C:\temp\jv_test\test.txt
    파일크기: 1744940545221bytes
  • 파일이 없을 경우
    파일이 존재하지 않습니다.

CreateNewFile()

		File file2 = new File("C:/temp/jv_test/test.txt");
		try {
			if(file2.createNewFile()) {	// 파일생성 결과 t/f
				System.out.println("파일이 생성되었습니다."+file2.getName());
			}else {
				System.out.println("파일이 이미 존재합니다.");
			}
		}catch(IOException e) {
			System.out.println("파일 생성 중 문제가 발생했습니다.");
			e.printStackTrace();
		}

결과1(파일이 없는 상태에서 한 번 실행)
파일이 존재하지 않습니다.
파일이 생성되었습니다.test.txt

결과2(파일이 생성되고 또 실행)
파일이름: test.txt
절대경로: C:\temp\jv_test\test.txt
파일크기: 1744940862965bytes
파일이 이미 존재합니다.

FileWriter

		try {
			FileWriter fw = new FileWriter("C:/temp/jv_test/test1.txt");
			fw.write("Hello, Java File I/O를 연습중입니다.");
			fw.close();		// DB의 commit과 같은 것
			
			System.out.println("파일에 문자열을 성공적으로 썼습니다.");
		}catch(IOException e){
			e.printStackTrace();
		}

해당 경로에 test1.txt 파일이 있으면 그곳에 해당 내용을 작성, 없으면 생성 후 작성

			fw = new FileWriter("C:/temp/jv_test/test.txt",true);
			fw.write("\n이어서 씁니다. Hello, Java File I/O를 연습중입니다.2\n");
			fw.close();
			
			System.out.println("");

test.txt에 이어서 내용이 작성된다.
true하면 이어쓰기

Hello, Java File I/O를 연습중입니다.
이어서 씁니다. Hello, Java File I/O를 연습중입니다.2

true가 없으면 덮어쓰기


이어서 씁니다. Hello, Java File I/O를 연습중입니다.2

FileReader

파일 끝이 아니라면 한 숫자(→글자)씩 출력

EoF(End of File)

파일의 끝을 -1로 표현해두었음.

		try {
			FileReader fr = new FileReader("C:/temp/jv_test/test.txt");
			
			int data = 0;
			while((data=fr.read()) != -1) {	// EoF: -1이 끝이다.
				System.out.print((char)data);
			}
			fr.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

결과

Hello, Java File I/O를 연습중입니다.
이어서 씁니다. Hello, Java File I/O를 연습중입니다.2

EoF(End of File)

파일의 끝을 -1로 표현해두었음.

			FileReader fr = new FileReader("C:/temp/jv_test/test.txt");
			
			int data = 0;

			System.out.println(fr.read());
			System.out.println(fr.read());
			System.out.println(fr.read());

위 처럼 fr.read()값만 세번 출력했을 때, 72, 101, 108이 출력되는데 이것은 ascii코드 H, e, l 이 된다.
그래서 char로 형변환해서 출력해주면 우리가 볼 수 있는 문자로 출력된다.

BufferedReader

Buffered로 파일을 readLine()하면 문장 단위로 읽음. (문장의 처음부터 Enter키가 있는 지점까지)
문장이 더 이상 없으면 null을 반환

			FileReader fr = new FileReader("C:/temp/jv_test/test.txt");

			BufferedReader br = new BufferedReader(fr);
			System.out.println("버퍼 사용하기");
			String s = null;
			while((s=br.readLine()) != null) {
				System.out.println(s);
			}

결과

버퍼 사용하기
Hello, Java File I/O를 연습중입니다.
이어서 씁니다. Hello, Java File I/O를 연습중입니다.2

버퍼 → 보조스트림 이라고도 함


try ~ catch ~ finally

		System.out.println("---START---");
		try{// 해야할 일(기능)
			String s = null;
			System.out.println(s.charAt(0));
		}catch(NullPointerException e){
			// 문제가 생기면 문제가 생겼다고 알려주고 프로그램은 지속되어야 한다.
			System.out.println("---END---");
		}	

결과

---START---
---END---

finally

try ~ catch를 해주지 않으면
---START--- 만 출력되고 프로그램이 중단된다.(완전 끝나지 않은 상태)

		System.out.println("---START---");
		try{// 해야할 일(기능)
			String s = "abc";
			System.out.println(s.charAt(0));
		}catch(NullPointerException e){
			// 문제가 생기면 문제가 생겼다고 알려주고 프로그램은 지속되어야 한다.
			System.out.println("---s에 문자열이 담겨있지 않아요---");
		}finally {
			// try의 결과가 정상 or 비정상 상관없이 무조건 하는 기능
			System.out.println("반드시 해야할 일을 하자.");
		}
		System.out.println("---END---");

결과

---START---
a
반드시 해야할 일을 하자.
---END---

finally 사용 예시

br.close();나 fr.close();와 같이 반드시 종료해줘야하는 것들을 작성해줄 수 있다.
단 try ~ catch ~ fianlly에서 br.close()나 fr.close()를 사용하기 위해서는 try~catch~finally 밖에서 선언해주어야 한다.(전역 or 멤버)

package ex0418;

public class FinallyTest {

	static String s;		// 전역변수로 선언해준다.
    
	public static void main(String[] args) {
		System.out.println("---START---");
		try{// 해야할 일(기능)
			s = "abc";
			System.out.println(s.charAt(0));
		}catch(NullPointerException e){
			// 문제가 생기면 문제가 생겼다고 알려주고 프로그램은 지속되어야 한다.
			System.out.println(s+"에 문자열이 담겨있지 않아요");
		}finally {
			// try의 결과가 정상 or 비정상 상관없이 무조건 하는 기능
			System.out.println(s+" 반드시 해야할 일을 하자.");
		}
		System.out.println("---END---");
		
	}
}

일기장 프로그램 만들기

  1. 일기 쓰기 → 쓰고 저장
  2. 일기 읽기 → 일기 목록, 어떤 것을 읽을 건지 선택, 내용 출력
  3. 종료

해결 필요
일기를 쓸 때(새로, 추가) 문장을 입력하고 싶은데 어떻게 해야하나..

package ex0418;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class DiaryTest {

	static Scanner sc = new Scanner(System.in);
	static FileWriter fw;
	public static void main(String[] args) {
		
		int i;
		boolean flag=true;
		while(flag) {
			printMenu();
			i = sc.nextInt();
			switch(i) {
			case 1: writeDiary(); break;
			case 2: readDiary(); break;
			case 3: System.out.println("종료합니다."); flag = false; break;
			default: System.out.println("메뉴를 다시 선택하세요.");
			}
		}
		
	}
	
	public static void printMenu() {
		System.out.println("===== MENU =====");
		System.out.println("1. 일기 쓰기");
		System.out.println("2. 일기 읽기");
		System.out.println("3. 종료");
		System.out.println("---------------");
		System.out.print("메뉴 선택 > ");
	}
	
	public static void writeDiary() {
		
		System.out.println("-----일기 쓰기-----");
		System.out.println("1. 새 일기 쓰기");
		System.out.println("2. 기존 일기 이어쓰기");
		System.out.println("3. 메인 메뉴로 가기");
		System.out.print("메뉴 선택 > ");
		
		int i = sc.nextInt();
		
		switch(i) {
		case 1: writeNewDiary(); break;
		case 2: writeContinueDiary(); break;
		case 3: break;
		default: System.out.println("메뉴를 다시 선택하세요."); break;
		}
				
	}
	
	public static void writeNewDiary() {
		System.out.print("[새 일기] 일기 제목 > ");
		String title = sc.next();
		try {
			fw = new FileWriter("C:/temp/jv_test/"+title+".txt");
			System.out.print("[새 일기] 일기 내용 > ");
			String content = sc.next();
			fw.write(content);
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void writeContinueDiary() {
		System.out.print("[일기 이어쓰기] 일기 제목 > ");
		String title = sc.next();
		System.out.print("[일기 이어쓰기] 추가 내용 > ");
		String content = sc.next();
		try {
			fw = new FileWriter("C:/temp/jv_test/"+title+".txt",true);
			fw.write("\n"+content);
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void readDiary() {
		String title = null;
		File dir = new File("C:/temp/jv_test/");
		File[] files = dir.listFiles();
		List<String> list = new ArrayList<>();
		
		for(int i=0; i<files.length; i++) {
			list.add(files[i].getName());
		}
		
		System.out.println("-----일기 목록-----");
		list.stream()
			.filter(s->s.endsWith(".txt"))
			.map(s->s.replace(".txt", ""))
			.forEach(s->System.out.println(s));
		System.out.println("-----------------");
		System.out.print("읽고 싶은 일기 제목 > ");

		try {
			title = sc.next();
			FileReader fr = new FileReader("C:/temp/jv_test/"+title+".txt");
			
			BufferedReader br = new BufferedReader(fr);
			String s = null;
			while( (s=br.readLine()) != null) {
				System.out.println(s);
			}	
		} catch (FileNotFoundException e) {
			System.out.println(title +" 제목을 가진 일기는 없습니다.");
			//e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

0개의 댓글