22.08.23-스트림 정의, 파일 다루기
스트림
스트림이란? 데이터의 흐름
- 방향에 따른 분류 :
- 입력(Input) : 실행중인 프로그램을 기준으로 데이터가 흘러 들어가는 모습을 입력
- 출력(Output) : 실행중인 프로그램을 기준으로 데이터가 흘러가는 모습을 출력
- IO(입출력)
- 데이터처리 방법
- 바이트기반 스트림 : 1byte씩 처리하는 근본 스트림, Input(입력), Output(출력)가 들어가 있음
- 문자기반 스트림 : 한 문자씩 처리하는 스트림, 한글자가 최대가 2byte씩이라 2byte로 읽는다고 하지만, 정확히는 한 문자씩이다. EX)java → 4번 읽어들임, Writer(출력),Reader(입력)가 들어가 있음
- 버퍼처리된 스트림 : 한줄씩 처리하는 스트림(효율성이 높다.), bufferd가 들어가 있음
예제: 파일 복사
코드
package javaseapp0823.io; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JProgressBar; import javax.swing.JTextField; import javax.swing.plaf.DimensionUIResource; public class FileCopy extends JFrame { JButton bt; JTextField t_ori,t_dest; JProgressBar bar; //FileInputStream fis; //바이트 기반의 파일입력 스트림 //FileOutputStream fos; //바이트 기반의 파일출력 스트림 FileReader fis; //문자 기반, 이미지와 같은 것은 안됨 FileWriter fos; //문자 기반, 이미지와 같은 것은 안됨 public FileCopy() { bt = new JButton("복사실행"); t_ori = new JTextField(30); t_dest = new JTextField(30); bar = new JProgressBar();
//스타일
bar.setPreferredSize(new DimensionUIResource(380, 55));
bar.setBackground(Color.CYAN);
//조립
setLayout(new FlowLayout());
add(bt);
add(t_ori);
add(t_dest);
add(bar);
//윈도우 창 보이기
setSize(400,200);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//이벤트 구현하기
bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
copy();
}
});
}
public void copy() {
try {
String oriPath = t_ori.getText();
String destPath = t_dest.getText();
//fis = new FileInputStream(oriPath); //파일을 대상으로 빨대를 꽂는다.
fis= new FileReader(oriPath);
//파일을 대상으로 한 출력스트림인 FileOutputStream은 생성시 빈(empty)파일을 생성해준다.
//fos = new FileOutputStream(destPath);
fos = new FileWriter(destPath);
//입력스트림으로부터 1byte 읽기
int data = -1;
while(true) {
data = fis.read();
if(data==-1)break;
System.out.println((char)data);
data++;
fos.write(data);//파일출력스트림으로 ,1byte 쓰기, 한글과 같은 경우에도 깨지지 않는다
}
JOptionPane.showMessageDialog(this, "복사완료");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(fos!=null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fis!=null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new FileCopy();
}
}
```예제: 메모장 만들기
코드(FileReader)
package javaseapp0823.io; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class Memeoapp extends JFrame{ JMenu m_file, m_edit, m_style, m_view, m_help; //자바에서는 메뉴라 부른다. JMenuItem item_open,item_save,item_exit; //메뉴의 하위메뉴를 가리켜 메뉴아이템이라고 한다. JMenuBar bar; //눈에 보이지는 않지만, 메뉴들을 감싸안는 컨테이너 JTextArea content; JScrollPane scroll; //편집기에 적용할 스크롤 JFileChooser chooser; //파일 탐색기 FileReader reader; //파일을 대상으로 한 문자기반의 스트림, 복사가 목적이 아니라 데이터의 한글이 깨지면 안됨
public Memeoapp() {
//부모의 생성자 접근
//부모의 생성자 호출은 자식의 생성자내에서 호출시 그 무엇보다 우선시 되어야한다.
super("메모장");
m_file = new JMenu("파일");
m_edit = new JMenu("편집");
m_style = new JMenu("서식");
m_view = new JMenu("보기");
m_help = new JMenu("도움말");
item_open = new JMenuItem("파일열기");
item_save = new JMenuItem("저장하기");
item_exit = new JMenuItem("종료");
bar = new JMenuBar();
content = new JTextArea();
scroll = new JScrollPane(content);
chooser = new JFileChooser("Z:/SLAcademy/javaSE_workspace/javaseapp0823/data/");//기본 경로 설정
m_file.add(item_open);
m_file.add(item_save);
m_file.addSeparator();//구분선
m_file.add(item_exit);
bar = new JMenuBar();
bar.add(m_file);
bar.add(m_edit);
bar.add(m_style);
bar.add(m_view);
bar.add(m_help);
//bar는 우리가 원하는 곳에 붙일수 있는 것이 아니라, 언제나 윈도우창 상단에 고정
this.setJMenuBar(bar);
add(scroll);
setSize(800,700);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//파일 열기 이벤트
item_open.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
openFile();
}
});
}
public void openFile() {
int result = chooser.showOpenDialog(this);
//상수는 직관성이 있는 문자를 이용하므로, 개발시 이해하기 좋다.
if(result == JFileChooser.APPROVE_OPTION) {
//user가 선택한 파일에 대한 정보를 얻어야한다.
File file = chooser.getSelectedFile();
try {
reader = new FileReader(file);//유저가 파일을 선택한 시점에 해당파일에 빨대가 꽂아짐
//wrapper 클래스란? 자바의 모든 자료형마다 1:1 대응되는 클래스를 의미하며
//주 용도는 기본자료형과 객체자료형간 형변환 지원 하건, 자료형을 이용한 다양한 처리시 활용한다.
//실수 : float(4) -Float < double(8) - Double
//정수 : byte(1)-Byte < short(2)-Short < int(4)-Integer < long(8)-Long
//문자 : char-Character
//논리 : boolean-Boolean
int data =-1;
while(true) {
data = reader.read();//한 문자 읽기
if(data==-1)break;
content.append(Character.toString((char)data));//int형 데이터를 String으로 변환
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Memeoapp();
}
}
```코드(BufferdReader)
package javaseapp0823.io; 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 javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class Memeoapp extends JFrame{ JMenu m_file, m_edit, m_style, m_view, m_help; //자바에서는 메뉴라 부른다. JMenuItem item_open,item_save,item_exit; //메뉴의 하위메뉴를 가리켜 메뉴아이템이라고 한다. JMenuBar bar; //눈에 보이지는 않지만, 메뉴들을 감싸안는 컨테이너 JTextArea content; JScrollPane scroll; //편집기에 적용할 스크롤 JFileChooser chooser; //파일 탐색기 FileReader reader; //파일을 대상으로 한 문자기반의 스트림, 복사가 목적이 아니라 데이터의 한글이 깨지면 안됨 BufferedReader buffr; public Memeoapp() { //부모의 생성자 접근 //부모의 생성자 호출은 자식의 생성자내에서 호출시 그 무엇보다 우선시 되어야한다. super("메모장"); m_file = new JMenu("파일"); m_edit = new JMenu("편집"); m_style = new JMenu("서식"); m_view = new JMenu("보기"); m_help = new JMenu("도움말"); item_open = new JMenuItem("파일열기"); item_save = new JMenuItem("저장하기"); item_exit = new JMenuItem("종료"); bar = new JMenuBar(); content = new JTextArea(); scroll = new JScrollPane(content); chooser = new JFileChooser("Z:/SLAcademy/javaSE_workspace/javaseapp0823/data/");//기본 경로 설정 m_file.add(item_open); m_file.add(item_save); m_file.addSeparator();//구분선 m_file.add(item_exit); bar = new JMenuBar(); bar.add(m_file); bar.add(m_edit); bar.add(m_style); bar.add(m_view); bar.add(m_help); //bar는 우리가 원하는 곳에 붙일수 있는 것이 아니라, 언제나 윈도우창 상단에 고정 this.setJMenuBar(bar); add(scroll); setSize(800,700); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE);
//파일 열기 이벤트
item_open.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
openFile();
}
});
}
public void openFile() {
int result = chooser.showOpenDialog(this);
//상수는 직관성이 있는 문자를 이용하므로, 개발시 이해하기 좋다.
if(result == JFileChooser.APPROVE_OPTION) {
//user가 선택한 파일에 대한 정보를 얻어야한다.
File file = chooser.getSelectedFile();
try {
reader = new FileReader(file);//유저가 파일을 선택한 시점에 해당파일에 빨대가 꽂아짐
buffr = new BufferedReader(reader);
//wrapper 클래스란? 자바의 모든 자료형마다 1:1 대응되는 클래스를 의미하며
//주 용도는 기본자료형과 객체자료형간 형변환 지원 하건, 자료형을 이용한 다양한 처리시 활용한다.
//실수 : float(4) -Float < double(8) - Double
//정수 : byte(1)-Byte < short(2)-Short < int(4)-Integer < long(8)-Long
//문자 : char-Character
//논리 : boolean-Boolean
String data =null;//객체의 빈 값은 null
while(true) {
data = buffr.readLine();//한 문자 읽기
if(data==null)break;
content.append(data+"\n");//int형 데이터를 String으로 변환
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(buffr!=null) {
try {
buffr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(reader!=null) {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
new Memeoapp();
}
}
```종합
코드
/* *지금까지 사용해왔던 대부분의 스트림은 개발자가 원하는 시점에 생성하여 사용할 수 있었지만, *키보드나, 모니터와 관련되 스트림은 개발자가 생성할 수 있는 것이 아니라, 현재 사용중인 OS가 생성한다. *따라서 키보드나 모니터에 연결된 스트림을 사용하기 위해서는 시스템으로부터 얻어와야한다. */ package javaseapp0823.io; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class KeyBoardInput { public static void main(String[] args) { InputStream is = System.in; //이미 존재하는 스트림을 얻은 것 //주의 : 여기서 얻는 입력스트립은 반드시 키보드가 아님 InputStreamReader reader = new InputStreamReader(is); BufferedReader buffr = new BufferedReader(reader); //int data = -1; String data =null; try { //data = is.read(); //data = reader.read(); data = buffr.readLine(); //모니터에 출력 // System.out.print((char)data); System.out.println(data); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
'Program > JAVA' 카테고리의 다른 글
| 채팅 구현 (0) | 2022.12.27 |
|---|---|
| JSON 해석, 이미지 다운, 엑셀 (0) | 2022.12.25 |
| 스트림 (0) | 2022.12.25 |
| 쓰레드(Thread), JSON읽기 (0) | 2022.12.25 |
| Collection FrameWork, 쓰레드 (0) | 2022.12.25 |