본문 바로가기
Java

입출력 스트림과 파일 입출력

by leko 2023. 7. 13.

입출력 스트림: 버퍼를 가지고 순차적으로 이루어지는 입출력

응용프로그램과 입출력 장치를 연결하는 소프트웨어 모듈

 

입력스트림: 입력장치로부터 자바프로그램으로 데이터 전달

출력스트림: 출력장치로 데이터 출력

 

입출력 스트림의 종류:

바이트 스트림 : 입출력되는 데이터를 단순 바이트로 처리, 바이트 단위의 바이너리 값을 읽고 쓰는 스트림

이미지 ,동영상 같은 바이너리 파일(=데이터의 저장과 처리를 목적으로 0과 1의 이진 형식으로 인코딩된 파일) 

InputStream : 추상클래스 OutputStream : 추상클래스
FileInputStream : 파일로부터 바이트 단위로 읽는 클래스 FileOutputStream : 파일로부터 바이트 단위로 저장하는 클래스
ByteArrayInputStream ByteArrayOutputStream
FilterInputStream 에서 BufferedInputStream 이나
DataInputStream : 자바의 기본 데이터 타입의 값을 바이너리 값 그대로 입력 
FilterOutputStream 에서 BufferedOutputStream이나
DataOutputStream :자바의 기본 데이터 타입의 값을 바이너리 값 그대로 출력

FileInputStream - 읽기 전용

생성자 - 파일넛파운드잇셉션 던짐

FileInputStream(File file)                    File 객체로 파일을 지정

FileInputStream(String filename)        파일이름으로 파일을 지정

 

메소드 - 아이오잇셉션을 던질 수 있음

int read()

int read(byte[] b)

int read(byte[] b, int offset, int length)

void close()

package FileInputOutput;

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

public class Ex09_0713 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		byte [] arr = new byte[6];
		try {
			FileInputStream fin = new FileInputStream("c:\\Temp\\rr");
			int n=0,c;
			while((c =fin.read())!=-1) {
				arr[n]= (byte) c;
				n++;
			}
			System.out.print("c:\\Temp\\rr에서 읽은 배열을 출력합니다.\n");
			for(int i =0;i<arr.length;i++) {
				System.out.print(arr[i]+" ");
			}
			System.out.println();
			
			fin.close();}
	
		
		
		
		
		catch(IOException e){
			System.out.println("읽지 못함");
		}

	}

}

 

 

 

FileOutputStream -쓰기 전용

생성자 - 파일넛파운드잇셉션을 던질 수 있음

FileOutputStream(File file)                  File 객체로 파일 지정

FileOutputStream(File file, boolean append) 파일 끝에 데이터 추가

FileOutputStream(String filename) 파일이름으로 파일 지정

FileOutputStream(String filename, boolean append) 파일 끝에 데이터 추가

 

메소드- 아이오잇셉션을 던질 수 있음

void write(int c) 한 바이트를 파일에 출력 byte타입도 가능

void write(byte[] b, int offset, int length)  인덱스 offset부터 length개의 바이트를 출력

void write(byte[] b)

void close()

package pkg7;

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

public class Ex07_0713 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		byte b[] = {7,51,3,4,-1,24};
		//바이너리 파일은 일반적인 텍스트 편집기나 메모장과 같은 소프트웨어로 직접 열면 읽을 수 없는 파일 형식입니다.
		//이는 바이너리 파일이 텍스트 대신 이진 데이터로 구성되어 있기 때문입니다.
		try {
			FileOutputStream f = new FileOutputStream("c:\\Temp\\rr"); //out파일이 생성되넹
			/* for(int i=1; i<11; i++) {
		            String data = i+" 번째 줄입니다.\r\n";
		            f.write(data.getBytes());
		        }*/
			for(int i=0;i<b.length;i++) {
				f.write(b[i]);
			}
			f.close();
		}catch(IOException e) {
			System.out.println("c:\\Temp\\test.out에 저장할 수 없었습니다. 경로명을 확인해 주세요");
			return;
		}
		System.out.println("c:\\Temp\\test.out을 저장하였습니다.");
	}

}

BufferdInputStream

생성자

BufferdInputStream(Inputstream in)

BufferdInputStream(InputStream in, int size)

 

메서드

int read()

int read(byte b[], int offset, int length)

 

BufferdOutputStream

생성자

BufferedOutputStream(OutputStream out)

BufferdOutputStream(OutputStream out, int size)

 

메서드

void write(int b)

void write(byte[] b, int offset, int length)

void flush()                //버퍼에 남아있는데이터를 연결된 스트림에 보냄

 

 

객체 직렬화 : 객체를 파일에 저장하기위해서 객체를 일련의 바이트들로 표현

저장할 객체는 Serializable인터페이스를 구현한 클래스이어야 함

Serializble 인터페이스는 tagging 인터페이스임

메소드를 포함하지않음

단지 직렬화를 할 플래스임을 나타낼 뿐

 

 

ObjectInputStream ( InputStream in )

지정한 InputStream으로부터 객체를 읽어옴

readObject()

직렬화된 객체를 파일에서 읽어와 deserialize함

객체를 생성하여 리턴

 

ObjectOutputStream( OutputStream in )

지정한 OutputStream에 객체를 저장

writeObject() 객체를 직렬화하여 파일에 저장

문자 스트림 : 문자만 입출력하는 스트림

텍스트 파일(= 문자열로 이루어진 파일)

 

추상클래스 문자스트림을 다루는 모든 클래스의 슈퍼클래스

Reader Writer
InputStreamReader: 바이트를 읽어 문자로 인코딩
<- FileReader
OutputStreamWriter : 문자를 바이트로 디코딩하여 출력
<-FileWriter
BufferdReader <- LineNumberReader BufferedWriter
StringReader StringWriter

InputStreamReader

생성자

바이트 입력스트림으로부터 바이트 데이터를 받음

InputStreamReader(InputStream in) 입력을 제공할 바이트스트림 지정

InputStreamReader(InputStream in, Charset cs) 문자집합지정 

InputStreamReader(InputStream in, String charsetName) 문자집합 이름으로 지정

 

메소드 - IOException 던짐

int read() 한문자를 읽어 정수형으로 리턴 

int read(byte[] b, int offset, int length)

Boolean ready() // 읽을 데이터 있으면 true리턴

FileReader - 읽기전용

생성자 -파일넛파운드잇셉션 던짐

FileReader(File file)

FileReader(String filename)

 

 

메소드 -아이오잇셉션 던짐

int read() : 한 문자를 읽어 정수형으로 리턴 , -1 EOF

int read(char[] cbuf, int offset, int length) : 최대 length만큼 문자를 읽어 cbuf의 offset부터 저장 , 읽은 문자수 리턴 , -1 EOF

void close()

package pkg7;

import java.io.FileReader;
import java.io.IOException;

public class Ex04_0713 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileReader fin = null;
		try {
			int c;
			fin = new FileReader("c:\\windows\\system.ini");
			while((c = fin.read())!= -1) { // fin.read()가 끝이 아닐때까지 c에 넣고 c를 출력
				System.out.print((char)c); //반환형이 int이나 char로 형변환 해서 출력함
			}
		}catch(IOException e) {
			System.out.println("입출력오류");
		}
	}

}

FileWriter - 쓰기 전용

생성자

파일을 쓰기 전용으로 오픈

아이오잇셉션 던질 수 있음

FileWriter(File file) File 객체로 파일 지정

FileWriter(File file, boolean append) 파일 끝에 데이터 추가

FileWriter(String filename) 파일이름으로 파일 지정

FileWriter(String filename, boolean append) 파일 끝에 데이터 추가

 

메소드

void write(int c) 한 문자를 파일에 출력 char타입도 가능

void write(char[] cbuf, int offset, int length)

void write(String str, int offset, int length) 인덱스 offset부터 length개의 문자를 출력

void close()

 

package pkg7;

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

public class Ex06_0713 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		//FileWriter f = null; //이거 안씀 근데 문제는 아님
		try{
			FileWriter f = new FileWriter("C:\\Temp\\yuncoding.txt");
		while(true) {
			String input = sc.nextLine();
			if(input.length() == 0) {
				break;
			}
			f.write(input, 0, input.length());
			f.write("\r\n",0,2);
			
		}
		f.close();//이게 문제임 이거 안씀
		}catch(IOException e) {
			System.out.println("입출력오류");
		}
		
	}
	}
package pkg7;

import java.io.FileWriter;
import java.io.IOException;
//C:\Users\LEE YUN JIN\OneDrive - ewhain.net\문서\3-1 여름계절자프실\Test에 
//wow 텍스트 파일이 아주 잘 성립됨
public class Ex08_0713 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			FileWriter f = new FileWriter("wow.txt");
			for(int i = 0;i<15;i++) {
				f.write('0'+ i); //10진수에서 48부터 63까지 출력 
				
			}
			f.close();
		}catch(IOException e){
			System.out.println("IO eeerrrooorr");
		}

	}

}

 

  

BufferedReader

생성자 

BufferdReader(Reader in)

BufferdReader(Reader in, int size)

메서드

int read()

int read(char[] cbuf, int offset, int length)

String readLline()

Boolean ready()

 

BufferedWriter(Writer out)

BufferedWriter(Writer out, int size)

메서드

void write(int c)

void write(char[] cbuf , int offset, int length)

void newline();

void flush()

 

 

 

 

 

 

 

 

 

 

Formatter 클래스 - 쓰기 전용

java.util패키지

Formatter 클래스가 파일을 생성하는 기능을 가지고 있기에 파일이 존재하지 않아도 프로그램은 정상적으로 실행되고 파일이 생성되어 데이터가 작성된다

 

생성자: 쓰기 전용으로 오픈, 기존 파일의 내용은 모두 삭제 , 만약 오픈에 실패하면 파일낫파운드잇셉션 던짐

Formatter(String filename)

Formatter(File file)

 

매소드

format("%d",i)

close()

package pkg7;

import java.io.FileNotFoundException;
import java.util.Formatter;
//내가 numbers.txt를 생성하지않아도 전체코드를 실행한다면
//C:\Users\LEE YUN JIN\OneDrive - ewhain.net\문서\3-1 여름계절자프실\Test에
// numbers.txt가 생성된다!


public class Ex02_0713 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			Formatter output = new Formatter("numbers.txt");
			for(int i=0;i<10;i++) {
				output.format("%d\n", i);
			}
			char[]a= {'a','b','c'};
			for(int i=0;i<3;i++) {
				output.format("%c\n", a[i]);
			}
			
			output.close();
		}catch(FileNotFoundException e) {//파일넛파운드잇셉션
			System.err.println("cannot open");
			System.exit(1);
		}
		

	}

}

 

Scanner 클래스 - 읽기 전

java.util패키지 , 다양한 타입의 생성자를 입력받을 수 있음

생성자 

Scanner(String source) 문자열

Scanner(File file) 파일을 읽기전용으로 오픈하여 입력받음

Scanner(InputStream input)  이미 오픈된 파일로부터 입력받음

메소드

nextInt() nextDouble()

next():한단어를 입력받음

nextLine() 라인끝까지를 하나의 String으로 입력받음

hasNext(): 읽어올 데이터있으면 true , 없으면 false 리턴

package pkg7;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Ex03_0713 {
//읽기전용 코드이다~!
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String n;
		try {
			Scanner input = new Scanner(new File("numbers.txt"));
			while(input.hasNext()) {
				n = input.nextLine();
				System.out.println(n);
			}
			input.close();
		}catch(FileNotFoundException e){
			System.err.print("cannot open");
			System.exit(1);
		}
	}

}

//유니코드(Unicode)는 전 세계의 모든 문자와 기호에 대해 고유한 숫자 코드를 할당한 국제 표준

알파벳 대문자 'A'의 유니코드는 U+0041이고, 한글 '가'의 유니코드는 U+AC00입니다.

이러한 코드 포인트는 문자를 컴퓨터에서 저장하고 표현하는 데 사용됩니다.

 

 

File 클래스 파일의 경로명을 다루는 클래스 java.io.File파일과 디렉토리 경로명의 추상적인 표현

 

파일관리기능파일이름 변경 삭제 디렉토리 생성 파일크기 조회 등 파일 관리File 객체는 파일 읽고 쓰기 기능 없음

 

 파일 입출력은 파일 입출력 스트림 이용

'Java' 카테고리의 다른 글

Stream  (0) 2023.07.31
예외 Exception  (0) 2023.07.13
12장 Collection FrameWork Generics  (0) 2023.07.10
object oriented programming 개념 정리  (0) 2023.07.08
11장 Collection FrameWork  (0) 2023.07.06