상세 컨텐츠

본문 제목

[JAVA] 파일 입력 스트림(문자 기반 스트림)

JAVA/Java 기초

by 미로910 2024. 5. 20. 11:06

본문

Seoul.txt, NewYork.txt 파일 생성하고 내용을 넣기
기반 스트림 FileReader → 단 인코딩에 대한 단점이 존재한다

                                            

실행 결과______

 

인코딩 설정을 위한 해결 방안


  • 파일 입력 스트림 (FileInputStream): 지정된 파일 이름으로부터 바이트 단위의 입력 스트림을 생성한다.
  • 문자 입력 스트림 변환기 (InputStreamReader): FileInputStream을 통해 읽은 바이트 데이터를 문자 데이터로 변환합니다. 여기서는 UTF-8 인코딩을 사용한다.
  • 버퍼링된 문자 입력 스트림 (BufferedReader): InputStreamReader 로부터 데이터를 효율적으로 읽기 위해 버퍼링을 추가한다. readLine() 메서드를 사용하여 파일의 각 줄을 편리하게 읽을 수 있다.

 

🔥도전!!

도전 학습 - 가장 많이 사용된 단어 찾기(공백 기준)

파일에는 임의의 긴 문장이 저장되어 있으며 파일 스트림을 활용해서
데이터를 읽고 코드상에서 프로그램을 만들어 보자.

 

String 클래스의 split 메서드활용 (사전 기반 지식)

Java의 split 메서드는 String 클래스의 메서드로, 문자열을 특정 패턴 또는 정규 표현식을 기준으로 분리하여 문자열 배열(String[])로 반환합니다.

  • regex: 분리할 기준이 되는 정규 표현식.
  • limit: 결과 배열의 크기를 제한할 수 있는 옵션. 이 값을 설정하면 반환되는 배열의 최대 요소 수를 제한할 수 있다

 

^(캐럿)

  • 용도: 입력 문자열의 시작을 나타내는 앵커이다. 이 메타 문자는 패턴이 문자열의 시작 부분과 일치해야 함을 지정할 때 사용된다.
  • 예시:
    • ^abc: "abc"로 시작하는 문자열에만 일치한다. 예를 들어, "abcdef"는 매치되지만, "defabc"는 매치되지 않는다.

+ (플러스)

  • 용도: 바로 앞에 있는 요소가 하나 이상 존재할 경우에 일치한다. 즉, 앞의 표현이 최소 한 번 이상 반복되어야 할 때 사용한다.
  • 예시:
    • a+: 'a'가 하나 이상 있는 모든 시퀀스에 일치한다. "a", "aa", "aaa" 등이 이에 해당한다.

 

[ … ] 대괄호의 주요 의미와 사용

  1. 문자 집합:
    • 대괄호 안에 나열된 문자들 중 하나와 매치된다.
    • 예: **[abc]**는 a, b, 또는 c 중 하나와 매치된다.
  2. 문자 범위:
    • 대괄호 안에 하이픈(-)**``**을 사용하여 범위를 지정할 수 있다.
    • 예: **[a-z]**는 소문자 알파벳 **a**에서 **z**까지의 모든 문자와 매치된다.
    • 예: **[A-Z]**는 대문자 알파벳 **A**에서 **Z**까지의 모든 문자와 매치된다.
    • 예: **[0-9]**는 숫자 **0**에서 **9**까지의 모든 문자와 매치된다.
  3. 부정 (not):
    • 대괄호 안의 첫 번째 문자로 **^**를 사용하여 부정을 나타낼 수 있다. 이는 대괄호 안에 나열된 문자들을 제외한 모든 문자와 매치됨을 의미한다.
    • 예: **[^abc]**는 a, b, **c**를 제외한 모든 문자와 매치된다.

[^가-힣A-Za-z]+의 의미:

  • 가-힣: 한글 문자 범위 (가에서 힣까지 모든 한글 문자)
  • A-Za-z: 모든 영문 대소문자
  • [^가-힣A-Za-z]: 한글 문자와 영문 대소문자를 제외한 모든 문자
  • +: 한 번 이상 반복

문자열 "안녕하세요! Hello123" 에서 [^가-힣A-Za-z]+ 패턴을 적용하면,

"! "와 "123" 이 매치됩니다.

 

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class WordFinder {

	public static void main(String[] args) {

		String fileName = "Seoul.txt";

		try (FileInputStream fis = new FileInputStream(fileName);
				InputStreamReader isr = new InputStreamReader(fis);
				BufferedReader br = new BufferedReader(isr)) {

			// 단어 빈도를 저장하기 위한 HashMap 생성
			Map<String, Integer> wordCountMap = new HashMap<>();
			String line;
			while ((line = br.readLine()) != null) {
				String[] words = line.split("\\s+");

				// 분리된 단어들을 반복 처리
				for (String word : words) {
					//System.out.println("word : " + word);

					// 빈 문자열이 아닐 경우에만 처리
					if (!word.isEmpty()) {
						// getOrDefault - 분리한 word 단어가 이미 map 구조에 존재한다면 현재
						// 값을 가져오고 없다면 0을 반환 합니다
						// wordCountMap Key - String
						// wordCountMap value - Integer

						wordCountMap.put(word, wordCountMap.getOrDefault(word, 0) + 1); // 데이터 넣는 거 -> put
					}

				}

			} // end of while

			String mostCommon = null;
			int maxCount = 0;

			for (Map.Entry<String, Integer> entry : wordCountMap.entrySet()) {

				if (entry.getValue() > maxCount) {
					mostCommon = entry.getKey();
					maxCount = entry.getValue();
				}

			}

			System.out.println("가장 많이 사용된 단어 : " + mostCommon + " , " + maxCount + "회");

		} catch (Exception e) {
			e.printStackTrace();
		}

	}// end of main

}// end of class

실행 결과_____

 

관련글 더보기