본문 바로가기

국비지원

[JAVA]IOstream - 1

반응형

글의 목적 : IO스트림과 관련된 클래스를 복습하고, 잊어버렸을 때 다시금 기억날 수 있도록 하기 위해

IOstream의 기본

IO는 input ouput의 약자로, 자바에서는 데이터를 IOstream으로 사용 및 관리할 수 있다. 

자바 io패키지에는 File가 있으며, 이를 활용하여 파일과 관련된 데이터를 입출력할 수 있게된다.

File객체는 추상적인 객체로서 실제파일,  디렉토리로 존재하지않아도 자바객체로 표현할 수 있다.

File클래스의 활용

경로의 표현

자바에서 "." 온점은 현재경로를 뜻한다.

File file = new File("."); == C:\Users\fgszh\eclipse-workspace\ddaa

".."온점 두개는 현재경로의 상위경로를 뜻한다.

File file = new File(".."); == C:\Users\fgszh\eclipse-workspace

"..\\.." 온점두개 역슬래쉬두개 온점두개는 현재경로의 상위의 상위경로를 뜻한다.

File file = new File("..\\.."); == C:\Users\fgszh\

 

getCanonicalPath() 메소드를 활용하면 경로를 읽기 쉽게 표현해준다.

(상)AbsolutePath (하)CanonicalPath

역슬래쉬 두개는 최상위경로를 뜻한다.

File f3 = new File("\\");

C드라이브

 

파일 및 디렉토리의 생성

파일생성시 trycatch문이 필요하다.
파일 삭제 메소드

createNewFile메소드를 활용해 파일을 원하는 경로에 만들 수 있고, 파일이 이미 존재할 때 false값을 반환한다.

반대로 delete메소드로 삭제도 가능하다.

mkdir메소드로 디렉토리 생성

mkdir 메소드는 디렉토리를 생성시켜준다.

InputStream

자바에서는 '디스크'에서 '어플리케이션'으로 흐르는 흐름을 입출력 스트림이라고 부른다.

방향이 존재하고(단방향) 디스크에서 어플리케이션으로 흐르는 것을 입력스트림 혹은 InputStream이라고 부른다.

FileInputStream은 택배회사로 보면된다. 파일에서 읽어온 값을 하나하나 배달하여 읽어준다.

이 때 int값으로 반환하는데 활용하기위해 char형으로 형변환이 필요하다.

그리고 항상 마지막에는 스트림을 close메소드로 닫아줘야한다.

(예외가 발생하더라도 닫아줘야하기에 finally문을 활용하여 닫아줘야한다.)

package ddaa;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Main8 {
	public static void main(String[] args) {
		// 입력스트림
		File memo = new File("d:\\myfolder\\memos\\todaymemo.txt");
		// null로 초기화 후 사용
		FileInputStream fis = null;
		try {
			// FileInputStream == 택배회사
			fis = new FileInputStream(memo);
			// 파일 읽을거임
			// 모든 자료는 숫자로 저장된다. a == (char) 97
			int b;
			while ((b = fis.read()) != -1) {
				System.out.print((char) b);
			}
			
			// catch는 자식이 제일 위에 ~ 부모가 제일 밑
		} catch (FileNotFoundException e) {
			System.out.println("파일이 존재하지 않습니다.");
		} catch (IOException e) {
			System.out.println("입출력 예외가 발생했습니다.");
		} finally {
			// 인풋스트림을 닫아야함.
			// null값이 그대로 옮겨 올 수 있기에 null체크
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					System.out.println("인풋스트림을 닫는 동안 입출력예외가 발생했습니다.");
				}
			}
		}
	}
}

문자단위로 읽어주는 리더스트림 클래스도 존재한다.

문자단위로 읽어줘요

 

OutputStream

입력과 반대로 어플리케이션에서 디스크로 흐르는 것을 출력스트림, OutputStream이라고 부른다.

자바에서 생성된 문자열을 파일로 출력할 수 있게끔 도와준다.

이 때 파일에 존재하는 출력 문자열은 무시한채 새로 출력된다.

package ddaa;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main10 {
	public static void main(String[] args) {
		File file = new File("D:\\myfolder\\memos\\output.txt");
		
		FileOutputStream fos = null;
		
		try {
			fos = new FileOutputStream(file);
			// 출력시 기존내용은 무시한채 새로 출력한다.
			String line = "write practice.";
			byte[] bytes = line.getBytes();
			
			fos.write(bytes);
		} catch (IOException e) {
			System.out.println("입출력 예외 발생");
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					System.out.println("입출력 예외 발생");
				}
			}
		}
	}
}

 

 

간단한 메모장 프로그램 만들기

프로그램의 흐름을 간단히 소개하면 이렇다.

새파일버튼 : textArea의 텍스트가 모두 지워지고 새파일이 된다.

저장하기 : 출력스트림으로 보면된다. JFileChooser를 통해 사용자가 선택한 경로에 파일을 출력한다.

저장하기버튼에서 동작되는 메소드

불러오기 : 입력스트림부분이다. 똑같이 JFileChooser를 통해 경로를 통해 파일을 선택하고, 

해당 메소드를 통해 StringBuilder로 한 줄 한 줄 읽어온 텍스트를 붙인 후  스트링값을 리턴하여 textArea에 set할 수 있도록 한다.

한 줄 한 줄 텍스트를 불러와 스트링빌더로 붙이자

 

package ddaa;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Main extends JFrame {
	public Main() {
		JTextArea ta = new JTextArea();
		JScrollPane scroll = new JScrollPane(ta);
		add(scroll);

		JPanel pnlSouth = new JPanel();
		JButton btnReset = new JButton("새 파일");
		btnReset.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				ta.setText("");
			}
		});
		JButton btnOutput = new JButton("저장하기");
		btnOutput.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JFileChooser chooser = new JFileChooser();
				int option = chooser.showSaveDialog(Main.this);

				if (option == JFileChooser.APPROVE_OPTION) {
					File select = chooser.getSelectedFile();
					writeTextToFile(select, ta.getText());
				}
			}
		});
		JButton btnInput = new JButton("불러오기");
		btnInput.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JFileChooser chooser = new JFileChooser();
				int option = chooser.showOpenDialog(Main.this);

				if (option == JFileChooser.APPROVE_OPTION) {
					File select = chooser.getSelectedFile();
					String text = readTextFromFile(select);
					ta.setText(text);
				}
			}

		});
		pnlSouth.add(btnReset);
		pnlSouth.add(btnOutput);
		pnlSouth.add(btnInput);
		add(pnlSouth, "South");

		setSize(500, 500);

		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}

	private String readTextFromFile(File select) {
		StringBuilder sb = new StringBuilder();
		try {
			BufferedReader br = new BufferedReader(new FileReader(select));
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line).append("\n");
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sb.toString();
	}

	private void writeTextToFile(File dest, String text) {
		try (PrintWriter pw = new PrintWriter(dest);) {
			pw.print(text);
			pw.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new Main();
	}
}
반응형