100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day 15 - 새 창 띄우기, I/O에 버퍼 달기

ksyke 2024. 8. 9. 15:20

목차

    UI 프레임에 부차적으로 달 수 있는 요소들

    새 창 띄우기

    public class Ex01  extends Frame implements ActionListener{
    
        public Ex01(){
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    dispose();
                }
            });
    
    
            setLayout(new FlowLayout());
            Button btn = new Button("Open New Window");
            btn.addActionListener(this);
            btn.setFont(new Font("", 0, 20));
            add(btn);
    
    
            java.awt.Toolkit kit = Toolkit.getDefaultToolkit();
            Dimension screen = kit.getScreenSize();
            int w, h;
            w = screen.width/2;
            h = screen.height/2;
            setBounds(w, h, 1000, 600);
            setVisible(true);
        }
    
        public static void main(String[] args) {
            Ex01 me = new Ex01();
    
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            Frame f2 = new Frame();
            f2.setBounds(300, 400, 1000, 600);
            f2.setVisible(true);
            f2.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    f2.dispose();
                }
            });
        }
    }

    종속성을 띈 새 창 띄우기

    public class Ex02 extends Frame{
    
        java.awt.Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screen = kit.getScreenSize();
        int w = screen.width/2;
        int  h = screen.height/2;
    
        public Ex02() {
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    dispose();
                }
            });
            setBounds(w, h, 1000, 600);
            setVisible(true);
        }
    
        public static void main(String[] args) {
            Ex02 me = new Ex02();
            me.newFrame();
        }
    
        public void newFrame() {
            java.awt.Dialog dia = new Dialog(this, "dialog", true);
            dia.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    dia.dispose();
                }
            });
            dia.setBounds(w, h, 500, 400);
            dia.setVisible(true);
        }
    }

    파일 다이아로그 열기

    // java.awt.Dialog dia = new Dialog(this, "dialog", true);
    // java.awt.FileDialog dia = new FileDialog(this, "dialog", 0); // 파일 디렉토리 0 : 열기, 1 : 저장
    java.awt.FileDialog dia = new FileDialog(this, "dialog", FileDialog.LOAD);
    dia.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
          dia.dispose();
      }
    });
    
    dia.setBounds(w, h, 500, 400);
    dia.setVisible(true);
    
    String dir = dia.getDirectory();
    String name = dia.getFile();
    System.out.println(dir + name);

    타이틀에 아이콘 넣기

    // ImageIcon icon = new ImageIcon("logo.jpg");
    // Image img = icon.getImage();
    Image img = Toolkit.getDefaultToolkit().createImage("logo.jpg");
    
    f.setIconImage(img);

    프레임에 메뉴 넣기

    MenuBar mb = new MenuBar();
    Menu m1 = new Menu("menu1");
    MenuItem mi1 = new MenuItem("first item");
    MenuItem mi2 = new MenuItem("second item");
    MenuItem mi3 = new MenuItem("third item");
    Menu m2 = new Menu("menu2");
    Menu mi4 = new Menu("forth item"); // 메뉴 안에 메뉴 넣기 
    MenuItem mi5 = new MenuItem("fifth item");
    MenuItem mi6 = new MenuItem("sixth item");
    
    m1.addActionListener(new ActionListener() {
    
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("메뉴 아이템 선택됨");
    
        }
    });
    
    m1.add(mi1);
    m1.add(mi2);
    m1.addSeparator();
    m1.add(mi3);
    m2.add(mi4);
    mi4.add(mi5);
    mi4.add(mi6);
    mb.add(m1);
    mb.add(m2);
    f.setMenuBar(mb);

    I/O에 Buffer 달아서 성능 높이기

    파일 쓰기

    파일 읽기

    파일 복사하기

    • buffer 사이즈를 잘 조절하지 않으면 기존의 파일보다 크기가 늘어난다.
      • os.write에 버퍼의 크기를 조절해 garbage 갖ㅅ이 들어가지 않게 한다.
    File src = new File("image01.jpg");
    File copy = new File("copy01.jpg");
    
    InputStream is = null;
    OutputStream os = null;
    
    byte[] buf = new byte[2]; // 수를 늘릴시 미분적용하여 수행시간이 줄어든다. 
    
    try {
        is = new FileInputStream(src);
        os = new FileOutputStream(copy);
    
        long before = System.currentTimeMillis();
        while(true) {
            int su = is.read(buf);
            if(su == -1) break;
            os.write(buf);
            os.write(buf, 0, su); // write의 크기 조절 
        }
        long after = System.currentTimeMillis();
        System.out.println("복사 완료: " + (after - before) + "ms"); // buffer 사용시 2배로 시간이 줄어듬 
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();  
    }finally {
           try {
               if(os != null) is.close();
               if(is != null) is.close();
           }catch(IOException e) {
               e.printStackTrace();
           }
    }
    File f = new File("test01.bin");
    
    Reader fr = null;
    char[] cbuf = new char[2];
    try {
        fr = new FileReader(f);
        while(true) {
            int su = fr.read(cbuf);
            if(su == -1) break;
            System.out.print(new String(cbuf, 0, su));
        }
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();  
    }finally {
           try {
               if(fr != null) fr.close();
           }catch(IOException e) {
               e.printStackTrace();
           }
    }

    filter Stream을 이용한 Buffer 사용

    • I/O에 필터 클래스를 사용하면 기능을 확장할 수 있다.

    파일 읽기

    File f = new File("test01.bin");
    
    InputStream is = null;
    BufferedInputStream bis = null;
    try {
        is = new FileInputStream(f);
        bis = new BufferedInputStream(is);
        while(true) {
            int su = bis.read();
            if(su == -1) break;
            System.out.println((char)su);
        }
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();  
    }finally {
           try {
               if(bis != null) bis.close(); // buffered input stream을 먼저 닫는다.
               if(is != null) is.close();
           }catch(IOException e) {
               e.printStackTrace();
           }
    }
    readLine으로 읽어들이기
    File f = new File("test03.txt");
    
    Reader fr = null;
    BufferedReader bfr = null;
    
    try {
    
        fr = new FileReader(f);
        bfr = new BufferedReader(fr);
    
        while(true) {
    //         int su = bfr.read();
    //        if(su == -1) break;
    //        System.out.print((char)su);
    
            String msg = bfr.readLine();
            if(msg == null) break;
            System.out.println(msg);
        }
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();  
    }finally {
           try {
               if(bfr != null) bfr.close();
               if(fr != null) fr.close();
           }catch(IOException e) {
               e.printStackTrace();
           }
    }

    파일 쓰기

    File f = new File("test01.bin");
    
    // String msg = "Hello World!!~:D";
    String msg = "한글작성 가능";
    byte[] msgs = msg.getBytes();
    
    OutputStream os = null;
    BufferedOutputStream bos = null;
    
    try {
        os = new FileOutputStream(f);
        bos = new BufferedOutputStream(os);
    
        for(int i = 0; i < msgs.length; i++) {
            bos.write(msgs[i]);
        }
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();  
    }finally {
           try {
               if(bos != null) bos.close();
               if(os != null) os.close();
           }catch(IOException e) {
               e.printStackTrace();
           }
    }
    readLine으로 쓰기
    File f = new File("test03_copy.txt");
    Scanner sc = new Scanner(System.in);
    
    Writer fw = null;
    BufferedWriter bfw = null;
    
    try {
    
        f.createNewFile();
        fw = new FileWriter(f);
        bfw = new BufferedWriter(fw);
    
    //    bfw.write("첫번째");
    //    bfw.write("두번쨰");
    //    bfw.write("세번째");
    
        for(int i = 0; i < 4; i++) {
    //        System.out.print(" > ");
            bfw.write(sc.nextLine());
    //        bfw.write("\r\n");
            bfw.newLine(); // 실행하고있는 운영체제에 맞춰 개행을 진행한다. 
        }
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();  
    }finally {
           try {
               if(bfw != null) bfw.close();
               if(fw != null) fw.close();
           }catch(IOException e) {
               e.printStackTrace();
           }
    }

    파일 복사하기

    File src = new File("image01.jpg");
    File copy = new File("copy02.jpg");
    
    InputStream is = null;
    OutputStream os = null;
    
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    
    // 사용자버퍼 달기
    byte[] buf = new byte[6];
    
    try {
        is = new FileInputStream(src);
        os = new FileOutputStream(copy);
        bis = new BufferedInputStream(is);
    //     bis = new BufferedInputStream(is, 2);
        bos = new BufferedOutputStream(os); // 16ms // 0ms
    //    bos = new BufferedOutputStream(os, 2); // 48ms // 21ms
    
        long before = System.currentTimeMillis();
        while(true) {
            int su = bis.read();
            if(su == -1) break;
            bos.write(su);
        }
        long after = System.currentTimeMillis();
        System.out.println(after - before + "ms");
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();  
    }finally {
           try {
               if(bis != null) bis.close();
               if(bos != null) bos.close();
               if(is != null) is.close();
               if(os != null) os.close();
           }catch(IOException e) {
               e.printStackTrace();
           }
    }
    문자열 Stream을 byte Stream으로 전환
    파일 읽기
    //public class Ex13 implements AutoCloseable{
    public class Ex13{
    
        public static void main(String[] args) {
            File f = new File("test01.bin");
    
    
            try (    // 자동으로 close 해준다. (선언이 밖에서 이루어지면 안됨)
                    InputStream is = new FileInputStream(f);
                    BufferedInputStream bis = new BufferedInputStream(is); // 성능을 높이기 위해 input stream을 끼울 수도 있다. 
                    InputStreamReader isr = new InputStreamReader(bis, "UTF-8");
    //                Ex13 me = new Ex13(); // AutoCLoseable을 상속해서 실행시킬 수 있다.
                    ){
                while(true) {
    //                int su = isr.read();
    //                if(su == -1) break;
    //                System.out.print((char)su);
    
                    String msg = bisr.readLine();
                    if(msg == null) break;
                    System.out.println(msg);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
    
        }
    //    @Override
    //    public void close() throws Exception {
    //        // TODO Auto-generated method stub
    //        
    //    }
    }
    파일 쓰기
    File f = new File("test04.txt");
    
    try(
            OutputStream os = new FileOutputStream(f);
            OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
            ){
        osw.write("hello world!");
        osw.write("한글지원 가능");
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    binary 데이터로 파일 쓰기
    File f = new File("test05.bin");
    
    try {
        f.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    try(
            OutputStream os = new FileOutputStream(f);
            DataOutputStream dos = new DataOutputStream(os);
            ){
        dos.write(65);
        int su = 1234;
        dos.writeInt(su);
        double su2 = 3.14;
        dos.writeDouble(su2);
        char su3 = '@';
        dos.writeChar(su3);
        boolean su4 = true;
        dos.writeBoolean(su4);
        String msg = "Hello ";
        dos.writeUTF(msg);
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    binary 데이터로 파일 읽기
    File f = new File("test05.bin");
    
    try(
            InputStream is = new FileInputStream(f);
            DataInputStream dis = new DataInputStream(is);
            ){
        int su = dis.read(); // 순서는 파일을 쓴 순서와 같아야 한다. 
        int su2 = dis.readInt();
        double su3 = dis.readDouble();
        char su4 = dis.readChar();
        boolean su5 = dis.readBoolean();
        String msg = dis.readUTF();
    
        System.out.println(su);
        System.out.println(su2);
        System.out.println(su3);
        System.out.println(su4);
        System.out.println(su5);
        System.out.println(msg);
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    PrintStream 이용해서 파일 쓰기

    File f = new File("test06.bin");
    
    try {
        f.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    try(
            OutputStream os = new FileOutputStream(f);
            PrintStream ps = new PrintStream(os);
            ){
        ps.write(65);
        ps.println(true);
        ps.println(1234);
        ps.println(3.14);
        ps.println("Hello World");
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    PrintWriter를 이용하여 파일 쓰기

    File f = new File("test07.bin");
    
    try {
        f.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    try(
            Writer os = new FileWriter(f);
            PrintWriter ps = new PrintWriter(os);
            ){
        ps.write(65);
        ps.println(true);
        ps.println(1234);
        ps.println(3.14);
        ps.println("Hello World");
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Reader를 이용해 읽어들이기

    File f = new File("test06.bin");
    
    String msg = null;
    try(
            Reader fr = new FileReader(f);
            BufferedReader bfr = new BufferedReader(fr);
            ){
        while((msg=bfr.readLine()) != null) {
            System.out.println(msg);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    InputStream

    PrintStream myout = System.out;
    myout.println("출력");
    
    InputStream myin = System.in;
    
    try (
            BufferedInputStream bis = new BufferedInputStream(myin);
            ){
        while(true) {
            int su = myin.read();
            if(su == -1) break;
            System.out.println(su);
        }
    //    System.out.println(myin.read());
    }catch(IOException e) {
        e.printStackTrace();
    }

    Scanner 없이 입력받기

    InputStream myin = System.in;
    
    try (
            InputStreamReader isr = new InputStreamReader(myin);
            BufferedReader br = new BufferedReader(isr);
            ){
        System.out.println(br.readLine());
    }catch(IOException e) {
        e.printStackTrace();
    }

    Scanner를 사용해 파일 읽어들이기

    File f = new File("test06.bin");
    
    InputStream is = new FileInputStream(f);
    Scanner sc = new Scanner(is);
    String msg = null;
    while(sc.hasNext()) {
        System.out.println(sc.nextLine());
    }

    Object Stream

    • I/O를 Object로 넣고 빼는 것
    public class Ex22 {
        static File f = new File("Object.bin");
    
        public static void main(String[] args) {
    
            try {
                f.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            try(
                OutputStream os = new FileOutputStream(f);
                ObjectOutputStream oos = new ObjectOutputStream(os);
                    ){
                String msg = "한글";
                oos.writeObject(msg);
                int[] arr1 = {1, 3, 5, 7, 9};
                oos.writeObject(arr1);
                List<Double> arr2 = new ArrayList<>();
                arr2.add(1.14);
                arr2.add(2.14);
                arr2.add(2.14);
                arr2.add(3.14);
                oos.writeObject(arr2);
                Set<Double> arr3 = new HashSet(arr2);
                oos.writeObject(arr3);
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
    }
    try(
            InputStream is = new FileInputStream(Ex22.f);
            ObjectInputStream ois = new ObjectInputStream(is);
            ){
        String msg = (String) ois.readObject();
        int[] arr1 = (int[]) ois.readObject();
        List<Double> arr2 = (List<Double>) ois.readObject();
        Set<Double> arr3 = (Set<Double>) ois.readObject();
    
        System.out.println(msg);
        System.out.println(Arrays.toString(arr1));
        System.out.println(arr2);
        System.out.println(arr3);
    
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    사용자가 만든 class를 Object로 쓰기

    • 쓰는쪽과 받는쪽이 동일한 class 소스를 갖고 있어야 사용할 수 있다.
    • 자원소모가 심하다는 단점이 있지만 데이터 유형을 그대로 저장할 수 있다는 장점이 있다.
    사용자정의 class
    private static final long serialVersionUID = 1L; // 수정할 시 숫자를 증가해 버전을 바꾼다.
    public class Lotto implements Serializable{
        private final int su;
    
        public Lotto(int su) {
            this.su = su;
        }
    }
    class를 파일로 쓰기
    try(
        OutputStream os = new FileOutputStream(f);
        ObjectOutputStream oos = new ObjectOutputStream(os);
            ){
        oos.writeObject(new Lotto(3));
    
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    class를 파일에서 읽기
    try(
            InputStream is = new FileInputStream(Ex22.f);
            ObjectInputStream ois = new ObjectInputStream(is);
            ){
    
        Lotto ball = (Lotto) ois.readObject();
        ball.show();
    
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    trainsient를 이용해 직렬화 정보로 저장하기
    • 직렬화는 필드 변수에면 적용된다.
    private transient String color; // 직렬화 제외