프로그래밍/Java 공부

Java_IO(파일 입출력)

개발계발게발 2021. 6. 22. 17:29
반응형

IO(파일 입출력)

프로그램에서는 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번하게 일어난다.
데이터는 사용자로부터 키보드를 통해 입력될 수있고, 파일 또는 네트워크로부터 입력될 수 있다.
데이터는 반대로 보니터로 출력될 수 있고 파일로 출력되어 저장될 수 있다.
 
자바에서 데이터는 스트림(stream)을 통해 입출력되므로 스트림의 특성을 잘 살펴야한다.
스트림은 단방향으로 연속적으로 흘러가는 것을 말한다.
물이 높은 곳에서 낮은 곳으로 흐르듯, 데이터는 출발지에서 나와 도착지로 들어간다는 개념이다.
 
프로그램이 데이터를 입력받을 때는 입력스트림
데이터를 내보낼 때는 출력스트림이라고 한다.

 

 

바이트 배열을 만들고 값 읽어오기

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;

public class IOTest01 {
	public static void main(String[] args) {
		
		//바이트 배열을 만들고 거기 값을 읽어오기
		byte[] input = {1,3,5,7,9,-1,12,15,18,21,90};
		byte[] output = null;
		
		//인풋 통로 생성
		ByteArrayInputStream bais = null;
		bais = new ByteArrayInputStream(input);
		
		//아웃풋 통로
		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));  //[1, 3, 5, 7, 9, -1, 12, 15, 18, 21, 90]
		System.out.println(Arrays.toString(output)); //[1, 3, 5, 7, 9, -1, 12, 15, 18, 21, 90]		
	}
}

 

write(배열, 시작위치, 끝위치);

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;
		
		//데이터를 읽을 배열
		byte[] temp = new byte[3];
		
		ByteArrayInputStream bais = new ByteArrayInputStream(input);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		int data;
		
		try {
			while((data = bais.read(temp)) != -1) {
				//data = bais.read(temp);
				System.out.println("data : " +  data);
				baos.write(temp, 0, data);
				//write(배열, 시작위치, 끝위치);
//				for (int i = 0; i < data; i++) {
//					System.out.println(temp[i]);
//				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		output = baos.toByteArray();
		
		System.out.println(Arrays.toString(input));
		System.out.println(Arrays.toString(output));		
	}
}

 

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();
		
		while(bais.available() > 0) {
			System.out.println(bais.available() + " 길이");
			try {
				int len = bais.read(temp);
				System.out.println(len + " temp속의 길이");
				baos.write(temp, 0, len);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		output = baos.toByteArray();
		System.out.println(Arrays.toString(input));
		System.out.println(Arrays.toString(output));		
	}
}

 

file 읽어오기

import java.io.BufferedReader;
import java.io.FileReader;

public class IOTest04 {
	public static void main(String[] args) {
		//FileReader
		FileReader fr = null;	//파일 읽어오는 변수
		BufferedReader br = null;	//불러온 파일을 보여주는 변수
		
		try {
			fr = new FileReader("c:/temp/test.txt");
			String line = null;
			//문자열을 이어서 한 객체에 넣어두고 출력하기 위해서 스트링 버퍼 사용
			StringBuffer sb = new StringBuffer();
			//라인에다가 br.의 한 줄을 읽어서 저장
			//더이상 저장할 것이 없으면 반복문 중지
			br = new BufferedReader(fr);
			
			while((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

파일 읽고 쓰기

파일 경로를 주고 해당 파일을 읽어오고 파일로 출력하기

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

public class IOTest05 {
	public static void main(String[] args) {

		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
			fis = new FileInputStream("c:/temp/test2.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(Arrays.toString(temp));
//				for (int i = 0; i < temp.length; i++) {
//					System.out.print((char) temp[i]);					
//				}
			}
//			//byte[5]배열을 생성하고 파일을 읽고
//			//temp값을 그대로 out.txt에 저장
			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();
			}
		}		
	}
}

 

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();
					/*
					 * close
					 * 열린 파일 객체를 닫아주는 메소드
					 * 자바가 종료될 때 열린 파일의 경우 자동으로 닫아준다.
					 * 하지만 직접 닫아 주느것이 좋다.
					 * 열었던 파일을 닫지 않고 다시 사용하려고하면 에러가 나는 경우가 있다.
					 */
					
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}

}

 

파일 쓰기

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);				
			}
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

-1이 입력되면 입력을 멈추고
입력된 내용을 저장하기

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class IOTest08 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StringBuffer sb = new StringBuffer();
		String temp = "";

		while (true) {
			System.out.println("입력할 문장을 입력하세요. -1을 입력하면 종료");
			temp = sc.next();
			if (temp.equals("-1")) {
				break;
			}
			sb.append(temp + "\r\n");
		}		
		try {
			FileWriter fw = new FileWriter("c:/temp/w.txt");
			fw.write(sb.toString());
			fw.close();
			// 저장된 내용을 화면에 출력하기
			FileReader fr = new FileReader("c:/temp/w.txt");
			BufferedReader br = new BufferedReader(fr);//fr보다 조금 더큰			
//			BufferedReader br2 =
//					new BufferedReader(new FileReader("c:/temp/write.txt"));
			String line = "";
			while((line = br.readLine()) != null) {
				System.out.println(line);			}
			
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}

 

파일 이어쓰기

FileWriter fw = new FileWriter("c:/temp/write.txt") - 덮어쓰기
FileWriter fw = new FileWriter("c:/temp/write.txt", true) - 이어쓰기
import java.io.FileWriter;
import java.io.IOException;

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();			
			//이어쓰기
			System.out.println("이어쓰기");
			FileWriter fw2 = new FileWriter("c:/temp/write.txt",true);
			for (int i = 0; i < 10; i++) {
				String data = i + "번째 줄\r\n";
				fw2.write(data);
			}
			fw2.close();		
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
}
반응형