2017 - 08 - 29 (화)
참고 도서 : 자바의 정석(남궁성 저, 도우출판)
1 . I/O Stream
입출력(I/O) 이란?
I/O란 Input과 Output의 약자로 입력과 출력을 말한다. 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것이다.
스트림(Stream) 이란?
자바에서 한쪽에서 다른쪽으로 데이터를 전달하기위해 데이터를 전송할 수 있는 연결통로가 필요한데 이를 스트림이라고 부른다. 스트림은 큐(Queue) 형태와 같은 FIFO (First in First Out) 구조로 되어있다.
스트림의 종류
- ByteStream : 입출력 Data 단위가 8bit
InputStream, OutputStream
- CharStream : 입출력 Data 단위가 16bit
Reader, Writer
- NodeStream : Data Source에서 Data Destination까지의 연결을 담당하는 Stream
FileInputStream, FileOutputStream
- FilterStream : Data를 가공하거나, 기능 제공을 목적으로 하는 Stream
InputStreamReader, OutputStreamWriter
FileInputStream
public class Io1 {
public static void main(String[] args)
throws FileNotFoundException, IOException
{
FileInputStream fis = new FileInputStream("c://aaa.txt");
//aaa.txt에있는 값을 FileInputStream 객체에 넣는다.
int fisRead = fis.read();
//fisRead 에 FileInputStream 객체의 값을 읽어와 넣는다.
//read() 로 한글자 읽어온다.
System.out.println("fisRead : " + fisRead); // aaa.txt파일의 첫글자를 int형으로 출력
System.out.println("fisRead : " + (char) fisRead); //char형으로 변환하여 출력
while(fisRead != -1){ // while 문을 사용하여 다음값까지 모두 읽어온다.
System.out.print((char) fisRead);
fisRead = fis.read();
}
fis.close(); // (IO 객체 해제)꼭 닫아주어야한다.
}
}
//FileInputStream 의 경우 한글깨짐 발생한다.
InputStreamReader
public class Io2 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("c://aaa.txt");
InputStreamReader isr = new InputStreamReader(fis);
//InputStreamReader를 통해 값을 불러오면 한글깨짐이 발생하지 않는다.
int fisRead = isr.read();
while(fisRead != -1){
System.out.print((char)fisRead);
fisRead = isr.read();
}
isr.close();
fis.close(); // 반드시 I/O 객체를 헤제하자.
}
}
FileReader : FileInputStream 와 InputStreamReader를 합친버전이라할 수 있다.
public class Io3 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("c://aaa.txt");
//기존에 FileinputStream 과 InputStreamReader 를 같이 생성했어야하는데 FileReader로 한번에 비영어권 문제를 읽어온다.
int frRead = fr.read();
while(frRead != -1){
System.out.print((char)frRead);
frRead = fr.read();
}
fr.close();
}
}
FileOutputStream
public class Io4 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("c://bbb.txt");
//InputStream이 txt파일의 값을 읽어왔다면 OuputStream은 값을 집어넣는 것이다.
//FileInputStream 과 마찬가지로 한글깨짐이 발생한다.
fos.write("한글출력불가능");
fos.close();
}
}
OutputStreamWriter
public class IO5{
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("C://bbb.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
//한글 깨짐을 방지하기위해 OuputStreamWriter 객체를 활용해 한글 깨짐을 방지한다.
String str = "한글출력 가능";
osw.write(str);
osw.close();
fos.close();
}
}
FileWriter : FileOutputStream + OutputStreamWriter
public class IO6 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("D://bbb.txt");
//FileReader 와 마찬가지로 FileWriter객체 하나로 한글 깨짐없이 Write 할 수 있다.
String str = "한글출력 가능";
fw.write(str);
fw.close();
}
}
BufferedReader , BufferedWriter : 라인단위로 읽어온다.
public class Io7 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("c://aaa.txt");
BufferedReader br = new BufferedReader(fr);
System.out.println(br.readLine());
FileWriter fw = new FileWriter("c://bbb.txt");
BufferedWriter bw = new BufferedWriter(fw);
String readLine = br.readLine();
while(readLine != null){
System.out.println(readLine);
bw.write(readLine);
bw.newLine();
readLine = br.readLine();
}
//fw.flush();//Data 출력 밀어내기
br.close();
fr.close();
bw.close();
fw.close();
}
}