Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

햄발

문자 기반 스트림 본문

Java

문자 기반 스트림

햄발자 2024. 6. 28. 09:16

 

 

문자 기반 스트림

 

  • 문자 인코딩 처리

문자 기반 스트림은 자동으로 플랫폼의 기본 문자 인코딩을 사용하여 문자 데이터를 올바르게 인코딩하거나 디코딩합니다. 이는 다양한 문자 인코딩을 처리하면서 발생할 수 있는 복잡성을 추상화하고, 개발자가 문자 데이터를 쉽게 처리할 수 있도록 돕습니다.

 

  • 국제화 지원

유니코드와 같은 다국어 지원을 통해 전 세계적으로 소프트웨어를 배포할 때 필수적입니다. 문자 기반 스트림을 사용하면 다양한 언어의 문자 처리가 간편해집니다.

 

  • 가독성 및 편의성 

문자 데이터를 읽고 쓰는 코드를 작성할 때, 문자 기반 스트림을 사용하면 바이트를 직접 처리하는 것보다 더 직관적이고 오류가 적은 코드를 작성할 수 있습니다.

 

 

 

문자 기반 스트림의 기본 클래스

  • Reader : 문자 입력 스트림의 모든 클래스의 상위 클래스입니다.
  • Writer : 문자 출력 스트림의 모든 클래스의 상위 클래스입니다.

 

표준 입력출 확인

package io.ch02;

import java.io.IOException;
import java.io.InputStream;

/**
 * 한 바이트를 받아서 char로 변환 InputStreamReader 사용
 * 
 */
public class SingleCharReader {

	public static void main(String[] args) {
		System.out.println("문자 하나를 입력하세요:");
		// 시나리오 1 - InputStream 사용 
		// 키보드에서 값을 받아 내는 표준 입력 복습 
		// InputStream 은 추상클래스로 설계 되어 있다.
		// InputStream isr = System.in(키보드) 사용
		try (InputStream isr = System.in) {
			// 첫 번째 문자를 읽습니다.
			int charData = isr.read(); // 바이트를 읽고 int로 반환합니다.
			if (charData != -1) { // 파일 끝(EOF)가 아니라면
				char character = (char) charData; // int를 char로 변환합니다.
				System.out.println("입력된 문자: " + character);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
표준 입출력 사용시  - 영어는 ○  한글 사용시 깨짐 발생 ,  1byte 로 한글 표현 불가
문자 하나를 입력하세요:
한
입력된 문자: í

 

 

문자 인코딩에 따른 바이트 수

 

  • ASCII 

    이 인코딩에서는 모든 문자가 하나의 바이트로 표현됩니다.

 

  • UTF-8 

    이 인코딩은 가변 길이 문자 인코딩 방식을 사용하며, 문자에 따라 1바이트에서 4바이트까지 사용할 수 있습니다. 영문      자 및 숫자는 일반적으로 1바이트를 사용하고, 한글이나 다른 유니코드 문자는 2바이트 이상을 사용할 수 있습니다.

 

  • UTF-16

    이 인코딩에서는 대부분의 문자가 2바이트를 사용하며, 일부 보충 문자는 4바이트를 사용합니다.

 

  • ISO-8859-1

    이 인코딩에서는 모든 문자가 1바이트로 표현됩니다.

 

InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");

 

 

InputStreamReader의 사용

InputStreamReader는 한 바이트씩 읽는게 아니라 한번에 하나의 문자를 읽음. 읽는 바이트 수는 사용되는 문자 인코딩에 따라 달라 진다.

 

package io.file.ch04;

import java.io.InputStreamReader;

public class SingleCharReader {

	public static void main(String[] args) {

		// 문자 기반에 InputStreamReader 사용 방법
		// ** 중요 **
		// InputStreamReader 는 한 바이트씩 데이터를 읽는 것이 아니라
		// 하나의 문자 단위로 읽음 !!!

		System.out.println("문자 하나를 입력 하세요");
		// try catch resource
		try (InputStreamReader isr = new InputStreamReader(System.in)) {
			
			// 한 <-- 통으로 읽음 --> InputStreamReader
			// 한 <-- 한 바이트로는 못 읽음 --> InputStream 
			int charData = isr.read(); // 사용자가 키보드에 값을 입력할 때 까지 대기

			if (charData != -1) {
				// -1 --> 파일 끝 (EOF) 가 아니라면 출력 ...
				// char --> 2byte (한글은 2byte로 거의 모든 글자 표현이 가능하다)    
				System.out.println("사용자가 입력한 값 : " + (char)charData);
			}

		} catch (Exception e) {
			System.out.println("뭔가 잘못 되었습니다.");
			e.printStackTrace();
		}

	}// end of main

}

 

 

BufferedReader 사용해보기

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class MyBufferedReadConsoleIO {

	public static void main(String[] args) {
		
		// 문자 기반 스트림 + 보조 문자 기반 스트림을 사용 한다. !! 
		try (InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
				BufferedReader br = new BufferedReader(isr)) {
			
			// isr -> 한 문자씩 읽는 기능 read() 가지고 있었다. 
			// br -> 한번에 한 라인씩 읽을 수 있는 기능을 가지고 있다. 
			System.out.println("더 많은 텍스트를 입력 하세요 (한줄 단위) -> 엔터");
			
			// isr.read(); --> 기능 확장인 
			String inputUserData = br.readLine();
			System.out.println("이력 확인 : " + inputUserData);
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

 

BufferedReader 와 기능 확장 (while 문 사용)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

// 문자 기반 스트림 + 보조 문자 기반 스트림 확인 
// 한줄 입력 하면 종료 됨 
// 여러줄 반복적을 동작할 수 있도록 기능을 추가해주세요 
public class StandardInputExample {

	public static void main(String[] args) {
		
		// 데이터를 통으로 관리 하고 싶다면 --> 자료구조 --> 적절한 자료 구조를 선택 
		List<String> lines = new ArrayList<String>();
		
		System.out.println("여러 줄의 텍스트를 입력하세요");
		System.out.println("입력을 종료하려면 빈 줄에서 엔터를 누르세요");
		// <-- 종료 
		// 안녕 -> 엔터 사용하면  출력 
		// "" -> 엔터 종료가 됨 
		
		// 문자 기반 스트림 + 보조 문자 기반 스트림을 사용 한다. !! 
		try (InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
				BufferedReader br = new BufferedReader(isr)) {
			
			// while() {}			 
			String line;
			// "" --> 엔터 ---> ine.isEmpty() -- ! --> F --> 실행에 종료가 된다. 
			while( ( line = br.readLine()  ) != null && !line.isEmpty()) {
				lines.add(line); // 한줄에 데이터를 자료구조에 저장 
				// System.out.println("입력 확인 : " + line);
			}
			
			for (String data : lines) {
				System.out.println(data);
			}
			System.out.println("프로그램 종료 처리 ");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

 

파일 입력 스트림

 

Seoul.txt, NewYork.txt 파일 생성하고 내용을 넣어 주세요
기반 스트림 FileReader → 단 인코딩에 대한 단점이 존재한다.
package io.file.ch05;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Scanner;

public class CityInfoApp1 {

	public static void main(String[] args) {
		
		System.out.println("도시 이름을 입력 하세요(예: Seoul, NewYork)"); 
		
		// try catch resource 
		try(Scanner scanner = new Scanner(System.in)) {
			
			String city = scanner.nextLine();
			String fileName = city + ".txt";
			
			// 1. 파일에 있는 데이터를 응용프로그램으로 가져와야 한다. (문자 기반)
			// FileReader (문자 기반 스트림 이다) 단 주의할 사항 
			// 파일을 읽을 때 시스템의 기본 문자 인코딩을 사용, 운영체제, 지역에 따라 다름 
			try(FileReader fr = new FileReader(fileName); 
					BufferedReader br = new BufferedReader(fr)) {
				System.out.println(city + " 에 대한 정보 입니다.");
				
				String line; 
				while( ( line = br.readLine() ) != null ) {
					System.out.println(line);
				}
				
			} catch (Exception e) {
				System.out.println("해당 파일을 찾을 수 없습니다.");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		

	} // end of main 

} // end of class

 

 

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

package io.file.ch05;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.Scanner;

public class CityInfoApp2 {

	public static void main(String[] args) {
		
		System.out.println("도시 이름을 입력 하세요(예: Seoul, NewYork)"); 
		
		// try catch resource 
		try(Scanner scanner = new Scanner(System.in)) {
			
			String city = scanner.nextLine();
			String fileName = city + ".txt";
			
			// 1. FileReader 단점 보안 코드  
			try (FileInputStream fis = new FileInputStream(fileName);
					InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
					BufferedReader br = new BufferedReader(isr)) {
				
				System.out.println(city + " 에 대한 정보 : ");
				String line; 
				while(  (line = br.readLine() ) != null ) {
					System.out.println(line);
				}
				
			} catch (Exception e) {
				System.out.println("해당 파일을 찾을 수 없습니다");
			}
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		

	} // end of main 

} // end of class

 

 

 

  • 파일 입력 스트림 (FileInputStream) 

지정된 파일 이름으로부터 바이트 단위의 입력 스트림을 생성합니다.

 

  • 문자 입력 스트림 변환기 (InputStreamReader)

 FileInputStream을 통해 읽은 바이트 데이터를 문자 데이터로 변환합니다. 여기서는 UTF-8 인코딩을 사용합니다.

 

  • 버퍼링된 문자 입력 스트림 (BufferedReader)

InputStreamReader 로부터 데이터를 효율적으로 읽기 위해 버퍼링을 추가합니다. readLine() 메서드를 사용하여 파일의 각 줄을 편리하게 읽을 수 있습니다.

 

 

 

가장 많이 사용된 단어 찾기(공백 기준)

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

 

 

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

Java의 split 메서드는 String 클래스의 메서드로, 문자열을 특정 패턴 또는 정규 표현식을 기준으로 분리하여 문자열 배열(String[])로 반환합니다.
public String[] split(String regex)
public String[] split(String regex, int limit)
  • regex : 분리할 기준이 되는 정규 표현식입니다.
  • limit : 결과 배열의 크기를 제한할 수 있는 옵션입니다. 이 값을 설정하면 반환되는 배열의 최대 요소 수를 제한할 수 있습니다.
String[] words = line.split("\\s+");  // 공백을 기준으로 분리
String[] words = line.split("[,.\\s]+");  // 쉼표, 마침표, 공백을 구분자로 사용
String[] words = line.split("[^가-힣A-Za-z]+");  // 한글과 영문을 제외한 모든 문자를 구분자로 사용
// "[^가-힣A-Za-z]+"
​
^(캐럿)
용도: 입력 문자열의 시작을 나타내는 앵커입니다. 이 메타 문자는 패턴이 문자열의 시작 부분과 일치해야 함을 지정할 때 사용됩니다.
예시:
^abc: "abc"로 시작하는 문자열에만 일치합니다. 예를 들어, "abcdef"는 매치되지만, "defabc"는 매치되지 않습니다.
+ (플러스)
용도: 바로 앞에 있는 요소가 하나 이상 존재할 경우에 일치합니다. 즉, 앞의 표현이 최소 한 번 이상 반복되어야 할 때 사용합니다.
예시:
a+: 'a'가 하나 이상 있는 모든 시퀀스에 일치합니다. "a", "aa", "aaa" 등이 이에 해당합니다.

 

 

 


 

^(캐럿) 의 의미:

 

용도

  •  입력 문자열의 시작을 나타내는 앵커입니다. 이 메타 문자는 패턴이 문자열의 시작 부분과 일치해야 함을 지정할 때 사용됩니다.
  • 바로 앞에 있는 요소가 하나 이상 존재할 경우에 일치합니다. 즉, 앞의 표현이 최소 한 번 이상 반복되어야 할 때 사용합니다.

 

예시

  • ^abc: "abc"로 시작하는 문자열에만 일치합니다. 예를 들어, "abcdef"는 매치되지만, "defabc"는 매치되지 않습니다.
  • a+: 'a'가 하나 이상 있는 모든 시퀀스에 일치합니다. "a", "aa", "aaa" 등이 이에 해당합니다.
^[a-z]+
이 정규 표현식은 소문자 알파벳으로 시작하고, 하나 이상의 소문자가 연속해서 나타나는 문자열에 매치됩니다.
단, 대괄호 안에서 캐럿을 사용하면 "부정 문자 클래스" 를 의미합니다.

 

 

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

 

  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" 이 매치됩니다.

 

 

package io.file.ch05;

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);
					}
				}
			} // 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

 

 


 

파일복사

 

문자기반 스트림을 활용한 파일복사 클래스 설계하기

package io.file.ch07;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class FileCopyHelper {
	
	// 파일 복사 
	public static void copyFile(String readFilePath, String writerFilePath) {
		
		try (FileReader fr = new FileReader(readFilePath);
				FileWriter fw = new FileWriter(writerFilePath)) {
			int c; 
			while( (c = fr.read()) != -1 ) {
				fw.write(c);
			}
			System.out.println("파일 복사 완료 : " + writerFilePath);
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("파일 복사 중 오류 발생");
		}
	}
	
	// 파일 복사 - 버퍼 활용 
	public static void copyFileWithBuffer(String readFilePath, String writerFilePath) {
		
		try (BufferedReader bufferedReader = new BufferedReader(new FileReader(readFilePath));
				BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(writerFilePath))) {
			// 버퍼를 활용하는 버퍼에 크기를 지정할 수 있다. 
			char[] buffer = new char[1024];
			int numCharsRead; // 읽은 문자 수 
			while( (numCharsRead = bufferedReader.read(buffer)) != -1 ) {
				bufferedWriter.write(buffer,0, numCharsRead);
				System.out.println("numCharsRead : " + numCharsRead);
			}
			System.out.println("버퍼를 사용한 파일 복사 완료 : " + writerFilePath);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("버퍼를 사용한 파일 복사 중 오류 발생");
		}
	}

	// 메인 함수 
	public static void main(String[] args) {
		FileCopyHelper.copyFile("Seoul.txt", "copySeoul.txt");
		System.out.println("--------------------------------");
		FileCopyHelper.copyFileWithBuffer("NewYork.txt", "copyNewYork.txt");
		
	} // end of main 
 
} // end of class

 

 

 

바이트 기반 스트림을 활용한 Zip 파일 만들어 보기

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFileHelper {

	// 파일을 압축하는 기능 - zip
	public static void zipFile(String fileToZip, String zipFileName) {

		// ZipOutputStream 을 사용해서 ZIP 형식으로 데이터를 압축할 수 있다.
		// FileOutputStream 을 활용해서 설정
		try (FileInputStream fis = new FileInputStream(fileToZip);
				ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName))) {

			// ZipEntry 객체 생성 - 압축 파일 내에서 개별 파일을 나타냅니다.
			ZipEntry zipEntry = new ZipEntry(fileToZip);
			zos.putNextEntry(zipEntry);

			// 파일 내용을 읽고 ZIP 파일에 쓰기 위한 버퍼 생성
			byte[] bytes = new byte[1024];
			int length;

			while ((length = fis.read(bytes)) >= 0) {
				zos.write(bytes, 0, length);
			}

			zos.closeEntry();
			System.out.println("ZIP 파일 생성 완료 : " + zipFileName);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("ZIP 파일 생성시 오류 발생");
		}
	}

	// 메인 함수
	public static void main(String[] args) {

		ZipFileHelper.zipFile("Seoul.txt", "zipSeoul.zip");

	} // end of main
}

 

 

 

 

파일 출력 스트림

파일 출력 스트림 (문자 기반)은 자바에서 텍스트 데이터를 파일에 쓰기 위해 사용되는 스트림입니다.
가장 일반적으로 사용되는 클래스는 FileWriter 입니다.
FileWriter 는 문자 데이터를 파일에 쓸 때 사용되며, 이 클래스는 내부적으로 파일 시스템과 통신하여 데이터를 문자 단위로 파일에 쓰게 해줍니다. 이는 바이트 기반 스트림인 FileOutputStream 과 대비되며, 텍스트 데이터를 처리할 때는 FileWriter 가 더 적합합니다.

 

 

FileOutputStream 

바이너리 데이터를 파일에 쓰기에 특히 적합 이미지, 비디오, 오디오 파일 쓰기,직렬화 데이터 쓰기,압축 파일 생성

 

package io.file.ch06;

import java.io.FileWriter;

public class MyFileWriter {

	public static void main(String[] args) {
		
		// 파일에다가 문자 기반 스트림을 활용해서 데이터를 써 보자. 		
		String data = "Hello, Java File I/O";
		
		try (FileWriter writer = new FileWriter("example.txt")) {
			// 파일에다가 문자열 쓰기 
			writer.write(data);
			writer.write("\n"); // 한줄 띄움 
			writer.write("추가 글을 작성할 수 있음");
			
			// 물을 내리다. 
			writer.flush();
			
			System.out.println("파일에 데이터 쓰기 성공");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

 

BufferedWriter 는 자바에서 문자 출력 스트림에 대한 버퍼링을 제공하는 클래스입니다. 버퍼링은 데이터를 임시 저장공간인 버퍼에 모아둔 후, 일정량이 모이면 출력 장치로 한 번에 전송하는 기술로, 반복적인 I/O 작업에 따른 성능 저하를 줄여줍니다. BufferedWriter 를 사용하면 데이터를 라인 단위로 쉽게 작성할 수 있으며, 출력 성능을 향상시킬 수 있습니다.

 

 

 

 

 

package io.file.ch06;

import java.io.BufferedWriter;
import java.io.FileWriter;

// 버퍼를 활용 파일출력 스트림에 사용 
public class MyFileBufferedWriter {

	public static void main(String[] args) {
		
		String filePath = "output2.txt";
		
		try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
			bw.write("첫번째 줄입니다.");
			bw.newLine();
			bw.write("두번째 줄입니다.");
			bw.newLine();
			bw.write("세번째 줄입니다.");
			// 버퍼를 비우고 데이터 쓰기 
			bw.flush();
		} catch (Exception e) {
			// TODO: handle exception
		}

	} // end of main 
} // end of class

 

 

 

파일복사 (문자기반 입/출력), ZIP파일로 압축

 

 

문자기반 스트림을 활용한 파일복사 클래스 설계하기

package io.file.ch07;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class FileCopyHelper {
	
	// 파일 복사 
	public static void copyFile(String readFilePath, String writerFilePath) {
		
		try (FileReader fr = new FileReader(readFilePath);
				FileWriter fw = new FileWriter(writerFilePath)) {
			int c; 
			while( (c = fr.read()) != -1 ) {
				fw.write(c);
			}
			System.out.println("파일 복사 완료 : " + writerFilePath);
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("파일 복사 중 오류 발생");
		}
	}
	
	// 파일 복사 - 버퍼 활용 
	public static void copyFileWithBuffer(String readFilePath, String writerFilePath) {
		
		try (BufferedReader bufferedReader = new BufferedReader(new FileReader(readFilePath));
				BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(writerFilePath))) {
			// 버퍼를 활용하는 버퍼에 크기를 지정할 수 있다. 
			char[] buffer = new char[1024];
			int numCharsRead; // 읽은 문자 수 
			while( (numCharsRead = bufferedReader.read(buffer)) != -1 ) {
				bufferedWriter.write(buffer,0, numCharsRead);
				System.out.println("numCharsRead : " + numCharsRead);
			}
			System.out.println("버퍼를 사용한 파일 복사 완료 : " + writerFilePath);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("버퍼를 사용한 파일 복사 중 오류 발생");
		}
	}

	// 메인 함수 
	public static void main(String[] args) {
		FileCopyHelper.copyFile("Seoul.txt", "copySeoul.txt");
		System.out.println("--------------------------------");
		FileCopyHelper.copyFileWithBuffer("NewYork.txt", "copyNewYork.txt");
		
	} // end of main 
 
} // end of class

 

 

바이트 기반 스트림을 활용한 Zip 파일 만들어 보기

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFileHelper {

	// 파일을 압축하는 기능 - zip
	public static void zipFile(String fileToZip, String zipFileName) {

		// ZipOutputStream 을 사용해서 ZIP 형식으로 데이터를 압축할 수 있다.
		// FileOutputStream 을 활용해서 설정
		try (FileInputStream fis = new FileInputStream(fileToZip);
				ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName))) {

			// ZipEntry 객체 생성 - 압축 파일 내에서 개별 파일을 나타냅니다.
			ZipEntry zipEntry = new ZipEntry(fileToZip);
			zos.putNextEntry(zipEntry);

			// 파일 내용을 읽고 ZIP 파일에 쓰기 위한 버퍼 생성
			byte[] bytes = new byte[1024];
			int length;

			while ((length = fis.read(bytes)) >= 0) {
				zos.write(bytes, 0, length);
			}

			zos.closeEntry();
			System.out.println("ZIP 파일 생성 완료 : " + zipFileName);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("ZIP 파일 생성시 오류 발생");
		}
	}

	// 메인 함수
	public static void main(String[] args) {

		ZipFileHelper.zipFile("Seoul.txt", "zipSeoul.zip");

	} // end of main
}

 

'Java' 카테고리의 다른 글

사용자모드 , 커널모드  (0) 2024.06.28
로그와 파일 저장  (0) 2024.06.28
Map 인터페이스  (0) 2024.05.30
Set 인터페이스  (0) 2024.05.29
Java 표준 입출력  (0) 2024.05.23