입출력 I/O
1. 스트림
- 데이터를 운반하는데 사용되는 연결통로이다.
- 단방향 통신만 가능(하나의 스트림으로 입출력 동시에 처리 불가)
- 입력스트림(InputStream)과 출력스트림(OutputStream) 필요함
2. 바이트기반 스트림 (1byte)
: InputStream, OutputStream
- byte단위 입력을 위한 클래스의 상위클래스인 InputStream
- 키보드를 입력한 문자를 읽어서 리턴
- 1byte단위로 읽기 때문에 한글을 입력하면 깨짐(한글 - 2byte)
package io;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
public class InputStreamTest {
public static void main(String[] args) {
InputStream myin = System.in;
PrintStream myout = System.out;
myout.println("안녕");
try {
while(true) {
int data = myin.read();
// if(data==13) {
// break;
// }
myout.print((char)data);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
3. 보조 스트림 (Buffered)
- 데이터를 입출력할 수 있는 기능은 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.
- 스트림을 먼저 생성한 후 이를 이용해 보조스트림을 생성해야 한다.
- 모든 보조스트림 역시 InputStream, OutputStream의 자손들이므로 입출력방법이 같다.
4. 문자기반 스트림 (2byte)
: Reader, Writer
1) FileReader, FileWriter 이용해서 파일 복사하기
package io;
// FileReader로 읽기
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) throws Exception {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("src/io/FileReaderTest.java");
fw = new FileWriter("src/data/output2.txt");
int data = 0;
int count = 0;
long start = System.nanoTime();
while ((data = fr.read()) != -1) {
//fw.write(data);
//System.out.print((char)data); // output2에 어떤 결과가 출력되는지 알기 위해 썼음. 안 써도 됨
count++;
}
long end = System.nanoTime();
System.out.println("실행횟수 => "+count);
System.out.println("실행시간 => "+(end-start));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fr != null) {
fr.close();
}
if (fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2) BufferedReader 이용해서 작업하기
package io;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileCopyBuffer {
public static void main(String[] args) throws Exception {
BufferedReader fr = null;
FileWriter fw = null;
try {
fr = new BufferedReader(new FileReader("src/io/FileReaderTest.java"));
fw = new FileWriter("src/data/output2.txt");
int data = 0;
int count = 0;
long start = System.nanoTime();
while (true) {
String line = fr.readLine();
if(line==null) {
break;
}
//fw.write(line);
//System.out.println(line);
count++;
}
long end = System.nanoTime();
System.out.println("실행횟수 => "+count);
System.out.println("실행시간 => "+(end-start));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fr != null) {
fr.close();
}
if (fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4-1. FileReader
- 예외처리 해주기
- 파일열기 -> 파일엑세스 -> 파일닫기
package io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
public static void main(String[] args) {
// 파일경로를 주지 않고 파일명만 입력하면 기본위치에서 찾는다.
// 기본위치 => 프로젝트 폴더
FileReader fis = null;
try {
//OS와 통신해서 원하는 파일이 있는지 확인
//1. 파일을 open
fis = new FileReader("src/data/test.txt");
//종료조건 : 파일의 끝인 경우에 반복문 종료
int count = 0;
//2. 파일엑세스
while(true) {
int data = fis.read();
if(data==-1) { //end of file
break; //반복문 빠져나오기
}
System.out.print((char)data);
count++;
}
System.out.println("실행횟수 : "+count);
}catch(FileNotFoundException e){
e.printStackTrace();
System.out.println("파일을 찾을 수 없습니다.");
}catch(IOException e) {
e.printStackTrace();
System.out.println("읽기오류");
}finally {
//3. 파일닫기
try {
if(fis!=null)
fis.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
4-2. FileWriter
- 파일열기 -> 파일엑세스 -> 파일닫기
package io;
import java.io.FileWriter;
public class FileWriterTest {
public static void main(String[] args) throws Exception{
// 파일출력의 기본은 덮어쓰기이다.
//1. 파일열기
FileWriter fw = new FileWriter("src/data/output.txt", true);
//2. 파일엑세스
fw.write(97); //a문자를 파일에 쓰기
fw.write("안녕\n");
fw.write("hello");
//3. 파일닫기
fw.close();
}
}
5. 문자기반의 보조스트림
- InputStreamReader, OutputStreamReader
- 바이트기반 스트림을 문자기반 스트림으로 연결시켜주는 역할
- 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행한다.
package io;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class BufferedReaderTest {
public static void main(String[] args) {
BufferedReader br = null;
InputStream in = null;
InputStreamReader isr = null;
try {
// 키보드입력을 BufferedReader로 읽기
in = System.in;
isr = new InputStreamReader(in);
br = new BufferedReader(isr);
String line = br.readLine();
System.out.println(line);
br = new BufferedReader(new InputStreamReader(System.in));
System.out.println(br.readLine());
// 파일입력을 BufferedReader로 읽기
br = new BufferedReader(new FileReader("src/data/output.txt"));
System.out.println(br.readLine());
}catch(IOException e) {
e.printStackTrace();
}
}
}
* 내부에서 버퍼(보조스트림)를 이용해서 데이터를 저장하고 읽을 수 있도록 관리
* 키보드 입력은 InputStream이고, BufferedReader는 Reader만 받을 수 있기 때문에 InputStreamReader가 BufferedReader로 이어주는 역할을 함
* 예외처리 해주기
6. Scanner => BufferedReader로 변경하기
1) Scanner로 배열 입력받기
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scan.nextInt();
}
2) BufferedReader로 배열 입력받기
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(System.in));
try {
int one = Integer.parseInt(br.readLine());
String n = br.readLine();
String[] myarr = n.split(" ");
int[] arr = new int[myarr.length];
for (int i = 0; i < myarr.length; i++) {
arr[i] = Integer.parseInt(myarr[i]);
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(br != null) {
br.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
* 예외처리 하기
* split메소드 이용해서 공백(" "), 콤마(,) 이용해서 자르기
* int타입 변수에 대입할 때는 Integer.parseInt이용하기
** BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
생성할 때 "new" 꼭 작성하기!!!!!!!!!!
'JAVA' 카테고리의 다른 글
2022-10-28 정렬 알고리즘 - 버블 정렬, 단순 삽입 정렬, API, greedy 알고리즘 (0) | 2022.10.29 |
---|---|
2022-10-27 컬렉션 프레임웍 - ArrayList, HashSet, HashMap (0) | 2022.10.29 |
2022-10-24 *배열로 스택클래스 구현하기 (0) | 2022.10.24 |
2022-10-24 Arrays클래스, Stack / Queue, 검색 알고리즘 - 선형검색, 이진검색, 정렬 알고리즘 - 단순 선택 정렬 (0) | 2022.10.24 |
2022-10-21 컬렉션 프레임웍 ArrayList / Vector, 스택과 큐 (0) | 2022.10.23 |
댓글