[Java] 파일 입출력

수경·2023년 8월 11일
0
post-thumbnail

파일 입출력

  • 응용프로그램 <- (데이터) -> 저장장치(*.txt)

저장장치

  • 데이터 1,0으로 저장(실제 1,0은 아니지만 1,0에 준하는 표현으로 저장함)
  • 데이터의 자료형 존재X > 모두 다 문자

인코딩, Encoding

  • 문자 코드(자바 데이터)를 부호화(1,0) 시키는 작업
  • 자바 프로그램("홍길동") > 텍스트 파일(100100100110110)

디코딩, Decoding

  • 부호화된 데이터를 문자 코드로 변환하는 작업
  • 텍스트 파일(100100100110110) > 자바 프로그램("홍길동")

인코딩/디코딩 규칙

  1. ISO-8859-1
  2. EUC-KR
  3. ANSI
  4. MS949(CP949)
  5. UTF-8
  6. UTF-16
  7. ASCII

**반드시 기억하기**

ANSI(ISO-8859-1, EUC-KR, MS949)
1. 영어(숫자, 특수문자, 서유럽 등): 1byte
2. 한글(한자, 일본어 등): 2byte

UTF-8(Unicode) > 국제 표준*
1. 영어: 1byte
2. 한글: 3byte

UTF-16(Unicode)
1. 영어: 2byte
2. 한글: 2byte

10만 글자 파일 파일 크기 비교

  • [ANSI]영어.txt : 100,000 byte
  • [ANSI]한글.txt : 200,000 byte
  • [UTF-8]영어.txt : 100,000 byte
  • [UTF-8]한글.txt : 300,000 byte
  • [UTF-16]영어.txt : 200,000 byte
  • [UTF-16]한글.txt : 200,000 byte


파일 입출력 스트림

스트림이란?

  • 데이터를 운반하는데 사용되는 연결통로이다.
  • 자바에서 입출력을 수행하려면,즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면,두
    대상을 연결하고 데이터를 전송하는 역할을 수행한다.
  • 스트림은 단방향통신만 가능하기때문에 입력스트림과 출력스트림, 2개의 스트림이 필요하다.

1. 출력(쓰기) 스트림

  • FileOutputStream : 한글자씩 저장되며, 한글은 깨진다.
  • FileWriter : 문자열을 한번에 저장 가능하다.
  • BufferedWriter : 한글자, 라인으로 저장 가능하다.
    위 순으로 발전해왔다.

1. 생성모드, Create mode > 덮어쓰기 (***더 많이 사용)

  • 기본값(생략, false)
  • FileOutputStream stream = new FileOutputStream(file, false);
    a. 파일이 존재하지 않으면 자동으로 생성한다.
    b. 파일이 존재하면 덮어쓰기를 한다.

2. 추가모드, Append mode > 이어쓰기

  • FileOutputStream stream = new FileOutputStream(file, true);
    a. 파일이 존재하지 않으면 자동으로 생성한다.
    b. 파일이 존재하면 이어쓰기를 한다.

FileOutputStream 예제코드

		try {
			
			File file = new File("C:\\class\\code\\java\\file\\list.txt");
			
			//스트림 객체 생성 == '스트림 열기' 라고 표현한다.
			FileOutputStream stream = new FileOutputStream(file);
			
			stream.write(65);	//A
			
			stream.write('홍');		//한글 깨진다.
			
			String txt = "hello~!";
			
			for (int i=0; i<txt.length(); i++) {
				char c = txt.charAt(i);
				stream.write(c);;
			}
			
			//스트림 닫기
			stream.close();
			System.out.println("종료");
			
		} catch (Exception e) {
			System.out.println("at Ex65_File.m1");
			e.printStackTrace();
		}

FileWriter 예제코드

		try {
			
			FileWriter writer = new FileWriter("C:\\class\\code\\java\\file\\member.txt");
			
			writer.write("한글");	//문자열을 한번에 저장 가능
			
			writer.close();
			System.out.println("종료");
			
		} catch (Exception e) {
			System.out.println("at Ex65_File.m3");
			e.printStackTrace();
		}

BufferedWriter 예제코드

		try {
			
			BufferedWriter bwriter = new BufferedWriter(new FileWriter("C:\\class\\code\\java\\file\\memo.txt"));
			
			bwriter.write("하나");
			bwriter.write('A');
			bwriter.write("\r\n");	//엔터
			bwriter.write("둘");
			bwriter.newLine();	//엔터
			bwriter.write("셋");
			
			bwriter.close();
			System.out.println("종료");
			
		} catch (Exception e) {
			System.out.println("at Ex65_File.m5");
			e.printStackTrace();
		}

2. 입력(읽기) 스트림

  • FileInputStream : 한글자씩 읽어온다. 한글은 깨진다.
  • FileReader : 한글자씩 읽어온다. 한글이 깨지지않는다.
  • BufferedReader : 여러글자를 읽어올 수 있다.

FileInputStream 예제코드

		try {
			
			//읽기 스트림 객체
			FileInputStream stream = new FileInputStream(Ex65_File.FILE);
			
			int code = -1;	//파일내에 읽을 글자가 없으면 -1 반환
			while((code = stream.read()) != -1) {
				System.out.print((char)code);
				
			}
			System.out.println();
			
			stream.close();
			
		} catch (Exception e) {
			System.out.println("at Ex65_File.m2");
			e.printStackTrace();
		}

FileReader 예제코드

		try {
			
			FileReader reader = new FileReader("C:\\class\\code\\java\\file\\member.txt");
			
			int code =-1;
			while((code=reader.read())!=-1) {
				System.out.print((char)code);
			}
			System.out.println();
			
			
			reader.close();
			System.out.println("종료");
			
		} catch (Exception e) {
			System.out.println("at Ex65_File.m4");
			e.printStackTrace();
		}

BufferedReader 예제코드

		try {
			
			BufferedReader breader2 = new BufferedReader(new FileReader("C:\\class\\code\\java\\file\\memo.txt"));
			
			String line = null;
			while ((line=breader2.readLine())!=null) {
				System.out.println(line);
				
			}
			
			breader2.close();
			System.out.println("종료");
			
		} catch (Exception e) {
			System.out.println("at Ex65_File.m6");
			e.printStackTrace();
		}

콘솔로 메모장 만들기

		try {
			
			Scanner scan = new Scanner(System.in);
			
			System.out.print("저장할 파일명: ");
			String fileName = scan.nextLine();
			
			BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\class\\code\\java\\file\\" + fileName + ".txt"));
			
			while (true) {

				System.out.print("입력: ");
				String line = scan.nextLine();
				
                //"exit" 입력받으면 입력 종료
				if (line.equals("exit")) {
					break;
				}
				
				writer.write(line);	//한줄을 입력받아서 한줄 쓰기(writer)
				writer.write("\r\n");
			}
			
			writer.close();
			System.out.println("파일 저장 완료");
			
		} catch (Exception e) {
			System.out.println("at Ex65_File.m7");
			e.printStackTrace();
		}
profile
웹백엔드개발자를 꿈꾸는

0개의 댓글