본문 바로가기

Program/JAVA

스트림 정의, 파일 다루기

22.08.23-스트림 정의, 파일 다루기

스트림


스트림이란? 데이터의 흐름

  1. 방향에 따른 분류 :
    1. 입력(Input) : 실행중인 프로그램을 기준으로 데이터가 흘러 들어가는 모습을 입력
    2. 출력(Output) : 실행중인 프로그램을 기준으로 데이터가 흘러가는 모습을 출력
    3. IO(입출력)
  2. 데이터처리 방법
    1. 바이트기반 스트림 : 1byte씩 처리하는 근본 스트림, Input(입력), Output(출력)가 들어가 있음
    2. 문자기반 스트림 : 한 문자씩 처리하는 스트림, 한글자가 최대가 2byte씩이라 2byte로 읽는다고 하지만, 정확히는 한 문자씩이다. EX)java → 4번 읽어들임, Writer(출력),Reader(입력)가 들어가 있음
    3. 버퍼처리된 스트림 : 한줄씩 처리하는 스트림(효율성이 높다.), 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