IO (Input & Output)
IO클래스 : Input & Output의 약자로서, 내외부의 데이터 자료를 사용해야 할 때 유용한 클래스이다.
스트림(Stream) : 입출력 장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스로,
데이터가 지나다니는 길이라고 생각하면 된다.
- 자바에서 모든 데이터는 스트림을 통해 입출력된다.
- 모든 스트림은 단방향으로만 통신이 가능하다. (입출력을 동시에 수행할 수 없다)
- 외부에서 내부로 들어오는 InputStream과, 내부에서 외부로 나가는 OutputStream이 있으며,
하나의 스트림으로 동시에 두 가지 흐름을 제어할 수는 없다. - 실제 프로그램에서 데이터의 입력은 '키보드, 파일 ,네트워크' 로부터 입력될 수 있고,
데이터의 출력은 '모니터의 화면, 파일' 로 출력될 수 있다.
예제 1.
<ByteArrayIOStream>
public class IOTest01 {
public static void main(String[] args) {
//바이트 배열을 만들고 거기 값을 읽어오기
byte[] input = { 1, 3, 5, 7, 9, 12, -1, 15, 18, 21, 90 };
byte[] output = null;
//input 통로 생성
ByteArrayInputStream bais = null;
bais = new ByteArrayInputStream(input);
//output 통로 생성
ByteArrayOutputStream baos = null;
baos = new ByteArrayOutputStream();
//읽거나 쓰는 바이트를 담을 변수
int data = 0;
//읽은 data를 검사해서 -1이면 read()중지하기
//-1은 더이상 읽을 값이 없다는 반환값
//스트림에서 하나의 바이트를 읽는 대표적 메소드read()
//read() : 읽은 바이트의 값을 정수(int)로 리턴
while (true) {
data = bais.read(); //하나하나 읽어오기
if(data == -1) {
break;
}
baos.write(data); //옮긴 결과
}
output = baos.toByteArray();
System.out.println(Arrays.toString(input));
System.out.println(Arrays.toString(output));
System.out.println("두개 비교하기");
[실행결과]
[1, 3, 5, 7, 9, 12, -1, 15, 18, 21, 90]
[1, 3, 5, 7, 9, 12, -1, 15, 18, 21, 90]
두개 비교하기
예제 2.
<ByteArrayIOStream 2>
package IO;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
//여러개 읽어오기
public class IOTest02 {
public static void main(String[] args) {
byte[] input = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
byte[] output = null;
//.read 할 때 데이터를 읽을 배열이 필요하므로 미리 선언해두어야 한다.
byte[] temp = new byte[3];
ByteArrayInputStream bais = new ByteArrayInputStream(input);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int data;
try {
//.read(배열) : 배열의 길이 반환
//만약 bais에 값이 없다면 -1 반환
while ((data = bais.read(temp)) != -1) {
System.out.println("data : " + data);
//.write(배열, 시작위치, 끝위치);
baos.write(temp, 0, data);
}
} catch (IOException e) {
e.printStackTrace();
}
output = baos.toByteArray();
System.out.println(Arrays.toString(input));
System.out.println(Arrays.toString(output));
}
}
[실행결과]
data : 3
data : 3
data : 3
data : 3
data : 1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
예제 3.
<ByteArrayIOStream 3>
package IO;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class IOTest03 {
public static void main(String[] args) {
byte[] input = {0,1,2,3,4,5,6,7,8,9,-1};
byte[] output = null;
byte[] temp = new byte[3];
ByteArrayInputStream bais = new ByteArrayInputStream(input);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//bais.available() : bais 속에 있는 값 전체의 수
//bais.read(배열) : 배열의 길이 반환.
while (bais.available() > 0) {
System.out.println(bais.available() + " 길이");
try {
int len = bais.read(temp);//temp를 통해 read한 만큼 bais의 길이는 줄어든다.
System.out.println(len + " temp속의 길이");
baos.write(temp, 0, len);//내용, 시작, 끝. (끝 index의 값은 포함되지 않음)
} catch (IOException e) {
e.printStackTrace();
}
}
output = baos.toByteArray();
System.out.println(Arrays.toString(input));
System.out.println(Arrays.toString(output));
}
}
[실행결과]
11 길이
3 temp속의 길이
8 길이
3 temp속의 길이
5 길이
3 temp속의 길이
2 길이
2 temp속의 길이
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1]
예제 4.
<FileReader>
package IO;
import java.io.BufferedReader;
import java.io.FileReader;
public class IOTest04 {
public static void main(String[] args) {
FileReader fr = null;//파일 읽어오는 변수
BufferedReader br = null;//불러온 파일을 보여주는 변수
try {
//fr = new FileReader("c:\\temp\\temp.txt"); 와 같은 표현
fr = new FileReader("c:/temp/temp.txt");
//문자열을 이어서 한 객체에 넣어두고 출력하기 위해서 스트링 버퍼를 사용
StringBuffer sb = new StringBuffer();
//.readLine() : 한 줄 읽기
//line에 br의 한 줄을 읽어서 저장
//더이상 저장할 것이 없으면 반복문 멈추기
br = new BufferedReader(fr);
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
[실행결과]
c:/temp/temp.txt CONTENT
(c:/temp/temp.txt 속의 내용)
예제 5.
<FileIOStream>
package IO;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class IOtest05 {
public static void main(String[] args) {
//파일 경로를 주고 해당 파일을 읽어오고 파일로 출력하기
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("c:\\temp\\temp.txt");
fos = new FileOutputStream("c:\\temp\\out.txt");
int data = 0;
byte[] temp = new byte[5];
while ((data = fis.read(temp)) != -1) {
fos.write(temp, 0, data);
}
System.out.println("파일 저장 완료");
while ((data = fis.read(temp)) != -1) {
char c = (char) data;
fos.write(c);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
[실행결과]
파일 저장 완료
(c:/temp/temp.txt 속의 내용을 c:/temp/out.txt 에 출력 )
예제 6.
<FileInputStream 없이 FileOutputStream에 직접 쓰기>
package IO;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOTest06 {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("c:\\temp\\fos.txt");
for (int i = 0; i < 10; i++) {
String data = i + "번째 줄 입력 \r\n";//줄바꿈
fos.write(data.getBytes());//바이트로 파일에 직접쓰기
}
System.out.println("저장완료 ");
/* FileOutStream에 값을 쓸 때는 byte로 변환합니다.
* getByte()를 이용했습니다.
* FileWriter는 String을 직접 씁니다.
*
*/
} catch (Exception e) {
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
- close( ) : 열린 파일 객체를 닫아주는 메소드
자바가 종료될 때 열린 파일의 경우 자동으로 닫아주기는 하지만 직접 닫아주는 것이 좋은데,열었던 파일을 닫지 않고 다시 사용하려고 하면 에러가 나는 경우가 있기 때문이다.
[실행결과]
저장완료
(c:/temp/fos.txt 에 (0 ~ 9번째 줄 입력 \r \n) 출력)
예제 7.
<FileWriter>
package IO;
import java.io.FileWriter;
import java.io.IOException;
public class IOTest07 {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter("c:\\temp\\fileWriter.txt");
for (int i = 0; i < 10; i++) {
String data = i + "번째 입니다. \r\n";
fw.write(data);//String이 그대로 들어갔습니다.
}
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
[실행결과]
(c:/temp/fileWriter.txt 에 (0 ~ 9번째 입니다. \r \n) 출력)
예제 8.
<FileWriter 2>
package IO;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Scanner;
public class IOTest08 {
public static void main(String[] args) {
//사용자가 -1이라고 입력하면 입력을 멈추고 입력된 내용을 저장하기
Scanner sc = new Scanner(System.in);
StringBuffer sb = new StringBuffer();
String temp = "";
while (true) {//입력대기 만들기
System.out.println("입력할 문장을 입력하세요.");
System.out.println("-1을 입력하면 종료됩니다.");
temp = sc.next();
if(temp.equals("-1")){
break;
}
sb.append(temp + "\r\n");//줄바꿈 포함해서 sb에 저장
}
try {
FileWriter fw = new FileWriter("c:\\temp\\write.txt");
fw.write(sb.toString());
fw.close();
//저장된 내용을 화면에 출력하기
FileReader fr = new FileReader("c:\\temp\\write.txt");
BufferedReader br = new BufferedReader(fr);//fr보다 조금 더 큰
//위 두 문장을 합친다면 아래와 같이
BufferedReader br2 =
new BufferedReader(
new FileReader("c:\\temp\\write.txt"));
String line = "";
while ((line = br.readLine()) != null) {//읽을것이 없으면 null
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
[실행결과]
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
1번째 문장
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
2번째_문장
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
3번째문장
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
4번째문장!
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
5..번..째..문..장..
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
-1
1번째
문장
2번째_문장
3번째문장
4번째문장!
5..번..째..문..장..
(c:/temp/write.txt 에 해당 출력값 출력)
예제 9.
<FileWriter 이어쓰기>
- FileWriter("경로",true)
package IO;
import java.io.FileWriter;
import java.io.IOException;
//FileWriter 이어쓰기
public class IOTest09 {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter("c:\\temp\\write.txt");
for (int i = 0; i < 10; i++) {
String data = i + "번째 줄을 씁니다.\r\n";
fw.write(data);
}
fw.close();
//이어쓰기
FileWriter fw2 = new FileWriter("c:\\temp\\write.txt", true);
for (int i = 10; i < 20; i++) {
String data = i + "번째 줄을 씁니다.\r\n";
fw2.write(data);
}
fw2.close();
System.out.println("이어쓰기 완료");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[실행결과]
이어쓰기 완료
(c:/temp/write.txt 에 (0 ~ 9 번째 줄을 씁니다. \r \n) 출력 후 이어서
(10 ~ 19 번째 줄을 씁니다. \r \n) 출력)
'JAVA' 카테고리의 다른 글
아파치 POI 설치방법 (0) | 2021.07.27 |
---|---|
VirtualBox 설치방법 (0) | 2021.07.27 |
내부 클래스 (Inner Class) (0) | 2021.07.27 |
이진 트리 (Binary Tree) (0) | 2021.07.26 |
예외처리 (Exception) (0) | 2021.07.26 |