JAVA 33강_입출력

YEONG EUN LEE (Chloe)·2024년 1월 8일

JAVA 기초

목록 보기
39/42

입출력

:입출력 라이브러리는 java.io 패키지에서 제공됨

스트림: 단방향으로 흐르는 데이터의 흐름을 스트림이라고 함.

바이트 스트림 : 그림, 멀티미디어, 분자 등 모든 종류의 데이터를 입축력할 때 사용
문자 스트림: 문자만 입출력할 때 사용

바이트 스트림의 최상위 클래스 : InputStream, OutputStream
하위 클래스 : ex) FileInputStream, FileOutputStream

문자 스트림 최상위 클래스 : Reader(입력), Writer(출력)
하위 클래스 : ex) FileReader, FileWriter

public class FileEx {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		String source = "죽는 날까지 하늘을 우러러 한 점 부끄러움이 없기를\n"
				+ "잎새에 이는 바람에도 나는 괴로워했다.\n "
				+ "별을 노래하는 마음으로 모든 죽어가는 것을 사랑해야지.\n"
				+"오늘 밤에도 별이 바람에 스치운다.\n";
		
		System.out.println(source.length());
		char intxt[] = new char[source.length()]; // 자동초기화 값으로 공백한칸을 가지고 있음.
		
		// getChar(복사할 객체의 시작인덱스번호(int), 복사할객체의 마지막인덱스-1(int),
		// 복사해서 붙여넣기할 객체명, 붙여넣을 객체의 시작 위치 인덱스 번호(int)
		source.getChars(0, source.length(), intxt, 0);// getChars는 원본 훼손이 일어남.
		//source.getChars(6,20,intxt, 5);
		
		FileWriter fw = new FileWriter("data1.txt"); // 출력 FileWriter 문자 전용 Stream.
		// 그냥 파일명만 적으면 프로젝트에 파일 생성함!
		// FileWriter 는 파일을 생성함.
		fw.write(intxt); // 내용을 적어줌.
//		fw.write(source);
		fw.close(); // 막아주는 역할. 막아주지 않으면 메모리 leak이 생김.
	}

}
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileEx01_01 {

	public static void main(String[] args) throws IOException {
		String path = "C:/upload/files";
		File file = new File(path);
		if(!file.isDirectory()) {file.mkdirs();} // .isDrectory를 확인할 수 있음. 
//		mkdirs를 붙여야 여러개의 폴더를 생성할 수 있음
//		if(!file.exists()) {file.mkdirs();} // exists는 파일 뿐만 아니라 폴더도 확인함.
		path = path + "/file.txt";
		
		// FileWriter(file, true); true는 뒷 줄에 추가 됨.
		// FileWriter("파일경로포함/파일명.확장자", append 이부에 대한 boolean값); true는 뒷 줄에 추가 됨.
		//디폴트는 false임. false는 덮어쓰기 됨.
		FileWriter fw = new FileWriter(path, true);
		
		fw.write("FileWriter는 한글로된"+" \n");
		fw.write("문자열을 바로 출력할 수 있다."+" \n");
//		fw.flush(); // close에 숨겨져 있는 기능
		
		fw.close();
		System.out.println("파일에 저장되었습니다.");
		
//		String path = "C:/upload/files";// String 고정형 새로 추가하면 주소가 바뀜.
//		System.out.println(path);
//		path = path + "/file.txt";
//		System.out.println(path);
	}

}
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileEx01_02 {

	public static void main(String[] args) throws IOException {
//		\r : 캐리지리턴, 그 줄의 처음으로 이동하라는 의미
//		\n : 한 줄 바꿈의 의미
//		\r\n : 개행문자, 다음 줄의 처음으로 이동하라는 의미
		String currDir = System.getProperty("user.dir");
		System.out.println(currDir);
		File file = new File(currDir + "/test.txt"); // / == \\와 같다!
		if(!file.exists()) file.createNewFile(); // .createNewFile() 파일을 생성하는 코드
		
		FileWriter fw = new FileWriter(file);
		char[] buf = {'m','e','s','s','a','g','e'};
		for (int i = 0; i < buf.length; i++) fw.write(buf[i]);
		
		fw.write("이 줄의 마지막에서 개행문자 \r\n");
		fw.close();
		
		FileReader fr = new FileReader(file);// 읽어오는것
		final int EOF = -1;
		int c;
		while((c =fr.read()) != EOF) { // .read() 유니코드로 읽어옴 // 파일의 끝이 아닐 때 라는 의미의 코드
//			System.out.println(c+", ");
			System.out.print((char)c);
		}
		fr.close();
		

	}

}
import java.io.FileReader;
import java.io.IOException;

public class FileEx02 {

	public static void main(String[] args) throws IOException {
		
		FileReader fr = new FileReader("C:/jwork/restPrj/data1.txt"); // 입력
		// ^ 문자스트림 자료형.
		int i; // 지역변수
		while((i = fr.read())!= -1) { // 
			System.out.print((char)i);
		}
		fr.close();
	}
	

}

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileEx03 {

	public static void main(String[] args) throws IOException {
		
		FileOutputStream fos = new FileOutputStream("stream1.txt"); // 출력
		// 아스키코드로 입력됨.
		// 바이트(숫자형) 스트림 파일을 출력하기 위한 객체 fos 생성
		// fow.write("하늘입니다.") // 에러가 발생함. 문자를 직접적으로 입력하거나 출력할 수 없음
		// fow.write('A') // 에러가 발생함. 문자를 직접적으로 입력하거나 출력할 수 없음
		
		
		for(int i  = 65; i < 80; i++) {
			fos.write(i);
		} 
		fos.close();
		System.out.println("ByteStreamFile을 생성");
		
		FileWriter fw = new FileWriter("data.txt"); // 출력 --> 문자자료형으로 쓰는 것, 내가 적는 그대로 표시해줌.
		for(int i  = 65; i < 80; i++){
			fw.write(i); // 숫자값은 코드 값임.
//			String s = i + "";
//			fw.write(s);
		}
		fw.close();
		System.out.println("FileWirter을 생성");
		
		FileReader fr = new FileReader("data.txt"); // 출력 --> 문자자료형으로 쓰는 것, 내가 적는 그대로 표시해줌.
		int c;
		while((c =fr.read())!=-1) {
//			System.out.println(c); // 숫자값 그대로 출력
			System.out.println((char)c); // 아스키코드로 인식하여 거기에 해당하는 문자 반환
		}
		fr.close();
		System.out.println("FileReader로 가져옴");
		
		FileInputStream fis = new FileInputStream("Stream1.txt");
//		FileInputStream fis = new fileInputStream("data1.txt");
		// 바이트 스트림 입력을 위한 객체 fis 생성
		
		int i;
		while((i = fis.read())!= -1) {
//			System.out.println(i); // 숫자 그대로 출력
			System.out.println((char)i); // 아스키코드로 읽어서 해당하는 문자 반환
		}
		System.out.println("ByteStream을 File로부터 입력");
		fis.close();
		}

}

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class FileEx03_01 {

	public static void main(String[] args) {
		try {
			OutputStream output =  new FileOutputStream("C:/jwork/Output.txt");
			// ^ 출력
			String str  = "오늘 날씨는 아주 덥습니다.";
			byte[] by = str.getBytes(); // 위의 문자열을 바이트 코드화 시켜줌.
			// ^ by는 바이트코드를 가지고 있음.
			
			output.write(by); // write가 오버라이드 되어 있음.byte 배열로 입력하면 값은 문자열로 입력되어지게 됨.
			output.close();
			
			FileInputStream fis = new FileInputStream("C:/jwork/Output.txt"); // byte코드를 byte코드로 읽어옴.
			InputStreamReader isr = new InputStreamReader(fis); // 문자 스트림 방식으로 다시 읽어줌. 보조 스트림임.
			// 그냥 fis 상태로 읽어오면 바이트코드로 출력됨.
			int c;
			while((c = isr.read()) != -1) {
				System.out.print((char)c);
			}
			isr.close();
//			fis.close();
		
			System.out.println();
			System.out.println("작업 완료\n");
		}catch(Exception e) {
			e.getStackTrace();
		}
	}

}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class FileEx03_02 {

	public static void main(String[] args) throws IOException {
		// 파일 출력용
		FileOutputStream fos1 = new FileOutputStream("C:/jwork/out_utf8.txt");
		FileOutputStream fos2 = new FileOutputStream("C:/jwork/out_ansi.csv");
		// ANSI 계열 인코딩 유형 - ms949 : 확장완성형
		// 한글 깨짐의 보완하려면 ms949를 사용하는 것이 좋다.
		OutputStreamWriter osw1 = new OutputStreamWriter(fos1,"utf-8");
		OutputStreamWriter osw2 = new OutputStreamWriter(fos2, "ms949");
		
		int c;
		
		System.out.println("아무 내용이나 입력하세요. 꼭 엔터를 해주어야만 글이 입력합니다."
				+ "\n종료를 원하시면 ctrl+z를 눌러주세요");
		InputStreamReader isr = new InputStreamReader(System.in);//System.in --> Scanner가 속하는 곳
		// ^ 콘솔창에 입력하는 문자열을 해당위치에 저장
		while((c= isr.read())!=-1) {
			osw1.write(c);
			osw2.write(c);
		}
		System.out.println("작업 완료\n");
		
		// 닫을 때는 꼭 역순으로 닫아준다.
		isr.close();
		osw1.close();
		osw2.close();
		fos1.close();
		fos2.close();
		
		FileInputStream fis = new FileInputStream("C:/jwork/out_ansi.csv");
		isr = new InputStreamReader(fis, "ms949");
		c = 0;
		
		while((c = isr.read()) != -1) {
			System.out.print((char)c);
		}
		System.out.println();
		System.out.println("출력 끝");
		
		isr.close();
		fis.close();
	}

}

import java.io.IOException;
import java.io.PrintWriter;

public class FileEx04 {

	public static void main(String[] args) throws IOException {
		PrintWriter pw = new PrintWriter(System.out);
		// 표준 출력(모니터 출력)을 의미하는
		// System.out(PrintWriter 객체)를 이용하여
		// 객체 pw를 생성
		
		pw.print("알기쉽게 해설한 자바!");
		pw.println('A');
		pw.println(500+500);
		pw.println(400000L);
		pw.println(12.34f);
		pw.printf("%f \n", 12.34);
		pw.println(new Integer("1999"));
		pw.close();
	}

}

FileWriter =>
문자열이나 char[] 배열로 값입력시 FileReader 객체를 통해 바로 읽어 들일 수 있다.

FileWriter로 입력을 하더라도 byte코드 한개 한개 입력하여 작성하는 경우는 반드시 byte코드를 문자스트림방식으로 변환해서 읽어야만한다.

FileOutputStream => 바이트코드로 파일을 생성할 수 있다.
FileInputStream => 바이트코드로 파일을 읽어들일 수 있다. 바로 문자로 출력이 어렵기 때문에 InputStreamReader를 통해 문자스트림형식으로 변환 후 출력 가능하다.

FileOutputStream을 이용해서 파일을 작성할 때 인코딩을 설정하여 작성하는 경우 반드시 File을 읽어들일 때도 인코딩을 설정해서 읽어주어야 한다.

0개의 댓글