:입출력 라이브러리는 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을 읽어들일 때도 인코딩을 설정해서 읽어주어야 한다.