[section 1] Java 심화(2) - 스트림, 파일 입출력

수경·2022년 11월 16일
0

코드스테이츠

목록 보기
20/57
post-thumbnail

스트림 Stream

배열, 컬렉션의 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자

특징

  • 선언형 프로그래밍

  • 람다식으로 요소 처리 코드 제공

  • 내부 반복자를 사용 ➡️ 병렬 처리 쉬움

    • 외부 반복자: for, while(iterator) ➡️ 개발자가 직접 코딩
    • 내부 반복자: 컬렉션 내부에서 요소들을 반복시킴
  • 중간 연산과 최종 연산

    • 중간 연산: 매핑, 필터링, 정렬
    • 최종 연산: 반복, 카운팅, 평균, 총합

스트림 생성

// List
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> listStream = list.stream();

// 배열
String[] arr = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);
Stream<String> stream = Stream.of("a", "b", "c");

// range 지정
IntStream stream = IntStream.range(1, 10);

❗️주의

  • 스트림은 read-only
  • 한 번 사용하면 닫힘 ➡️ 또 사용하려면 새로운 스트림 생성

스트림 중간 연산

  1. filter() distinct() : 필터링, 중복 제거
  2. map() : 매핑
    map()flatmap()
  1. sorted() : 정렬
  2. peek() : 결과 미리보기

❗️주의

  • 여러번 사용 가능

스트림 최종 연산

  1. forEach() : 요소를 하나씩 연산

  2. match() : 특정 조건을 충족하는지 검사

  3. sum(), count(), average(), max(), min() : 기본 연산

  4. reduce() : 누적 연산

  5. collect() : 요소들을 List, Set, Map 등 다른 컬렉션으로 수집하고 싶은 경우 사용

❗️주의

  • 한 번만 사용 가능

파일 입출력 I/O

FileInputStream / FileOutputStream

❗️byte 기반 스트림

import java.io.FileInputStream;
  
public class FileInputStreamExample {
    public static void main(String args[])
    {
        try {
        	// 이름이 codestates.txt인 파일의 파일인풋스트림을 생성
            FileInputStream fileInput = new FileInputStream("fileStream.txt");
            int i = 0;
            //fileInput.read() = -1이면 파일의 마지막
            while ((i = fileInput.read()) != -1) { 
                System.out.print((char)i);
            }
            fileInput.close();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}
import java.io.FileOutputStream;
  
public class FileOutputStreamExample {
    public static void main(String args[]) {
        try {
        	// 이름이 codestates.txt인 파일의 파일아웃스트림을 생성
            FileOutputStream fileOutput = new FileOutputStream("fileStream.txt");
            String word = "hello";

			// 바이트 단위
            byte b[] = word.getBytes();
            // 파일에 작성
            fileOutput.write(b);
            fileOutput.close();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

FileReader / FileWriter

FileInputStream / FileOutputStream는 byte 기반 스트림이기 때문에 자바의 문자 처리에 적합하지 않음(java char: 2byte). 이를 해결하기 위해 문자 기반 스트림 제공.

public class FileReaderExample {
    public static void main(String args[]) {
        try {
        	// 파일명 codestates.txt
            String fileName = "file.txt";
            FileReader file = new FileReader(fileName);

            int data = 0;

			// 파일의 마지막까지 읽음
            while((data=file.read()) != -1) {
                System.out.print((char)data);
            }
            file.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

BufferedReader로 성능 개선

public class BufferedReaderExample {
    public static void main(String args[]) {
        try {
        	// 파일명 codestates.txt
            String fileName = "File.txt";
            FileReader file = new FileReader(fileName);
            BufferedReader buffered = new BufferedReader(file);

            int data = 0;
			// 파일의 마지막까지 읽음
            while((data=buffered.read()) != -1) {
                System.out.print((char)data);
            }
            file.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class FileWriterExample {
    public static void main(String args[]) {
        try {
        	// 파일명 codestates.txt
            String fileName = "File.txt";
            FileWriter writer = new FileWriter(fileName);

			// 파일에 새로 작성할 문자열
            String str = "written!";
            writer.write(str);
            writer.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

File

파일과 디렉토리에 접근

// 생성할 파일의 디렉토리와 이름
File file = new File("./", "newFile.txt");
// 파일 생성
file.createNewFile();
profile
어쩌다보니 tmi뿐인 블로그😎

0개의 댓글