Java 입출력(I/O)과 텍스트 편집기(Text Editor)

Copyright (c) 2014-, All Rights Reserved by Kwanghoon Choi
(아래 자바 프로그래밍 강의 교재의 내용을 자유롭게 이용하되 다른 웹 사이트 등을 통한 배포를 금합니다.)

 

1. Java 입출력

Java 언어의 입출력 방법은 다음과 같이 요약할 수 있다.

javaio

  • 바이트 스트림 (Byte Streams) 방식은 이진 데이터에 대한 입출력을 다룬다.
  • 문자 스트림 (Character Streams)은 한글이나 영문 등 문자 단위의 데이터에 대한 입출력 방식이다.
  • 버퍼 스트림 (Buffered Streams)으로 입출력을 최적화하여 운영체제의 입출력 API를 호출하는 횟수를 줄인다.
  • 스캐닝과 포맷팅 (Scanning & Formatting)으로 공백으로 구분된 정수, 실수, 문자열 등을 읽을 수 있고 출력 형식을 지정할 수 있다.
  • 데이터 스트림 (Data Streams)은 Java의 기본 타입과 문자열 타입의 데이터를 입출력하는 방법이다.
  • 객체 스트림 (Object Streams)은 (직렬화를 지원하는) 객체에 대한 입출력 방법을 제공한다.

참고 사이트

 

2. 응용

텍스트 파일을 열어 내용을 확인하거나 편집한 다음 변경된 내용을 저장할 수 있는 간단한 텍스트 편집기를 작성한다.

  • 화면 중앙에 텍스트 편집 영역이 있고, 수평과 수직에 스크롤바를 배치한다. JTextArea 클래스와 JScrollPane 클래스 사용.
  • 화면 상단에 메뉴바가 있고 <File> 메뉴와 <About> 메뉴를 놓는다. JMenuBar 클래스와 JMenu 클래스를 사용
  • 각 메뉴는 여러 메뉴 항목들을 제공한다. <File> 메뉴는 <New>, <Open>, <Save>, <Close>, <Quit> 메뉴 항목들을, <About> 메뉴는 <About Text Editor> 메뉴 항목을 가지고 있다. 메뉴 항목은 JMenuItem 클래스를 사용한다.
  • <New>을 선택하면, 텍스트 편집 영역을 공백으로 초기화한다. JTextArea.setText 메소드에 빈 문자열 "" 인자를 지정한다.
  • <Open>을 선택하면, 파일 선택 대화상자를 통해 열고자 하는 파일을 선택한 다음 그 내용을 텍스트 영역에서 보여준다. JFileChooser 클래스 사용. JTextArea.append 메소드로 파일에서 읽어드린 문자열을 차례로 추가한다.
  • <Save>을 선택하면, 현재 선택된 파일이 있으면 현재 텍스트 내용을 이전에 열었던 파일에 저장한다.
  • <Close>을 선택하면, 텍스트 편집 영역을 공백으로 초기화하고, 현재 선택된 파일을 초기화한다.
  • <Quit>을 선택하면, 프로그램을 종료한다. System 클래스의 exit 메소드 사용.
  • <About Text Editor>를 선택하면 "텍스트 편집기입니다."와 같은 간단한 문구를 표시하는 대화 상자를 띄운다.  JOptionPane 클래스 사용. https://docs.oracle.com/javase/tutorial/uiswing/components/index.html 에서 Dialog (대화상자)에 관한 링크를 찾은 다음 JOptionPane 클래스로 메시지를 표시하는 대화상자를 띄우는 방법을 찾아 사용.

[연습 문제] 아래의 코드를 참고하여 텍스트 에디터를 작성한다.

package com.example.java;

import java.awt.EventQueue;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;

import javax.swing.BoxLayout;

import javax.swing.JScrollPane;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class TextEditor {

        private JFrame frame;
        private JTextArea textArea;
        private JFileChooser fileChooser = new JFileChooser();
        private File file;

        /**
         * Launch the application.
         */
        public static void main(String[] args) {
                EventQueue.invokeLater(new Runnable() {
                        public void run() {
                                try {
                                        TextEditor window = new TextEditor();
                                        window.frame.setVisible(true);
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                        }
                });
        }

        /**
         * Create the application.
         */
        public TextEditor() {
                initialize();
        }
	
        /**
         * Initialize the contents of the frame.
         */
        private void initialize() {
                frame = new JFrame();
                frame.setBounds(100, 100, 450, 300);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
                JMenuBar menuBar = new JMenuBar();
                frame.setJMenuBar(menuBar);
		
                JMenu mnFile = new JMenu("File");
                menuBar.add(mnFile);
		
                JMenuItem mntmNew = new JMenuItem("New");
                mntmNew.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                int retval = fileChooser.showDialog(frame, "New");
                                if (retval == JFileChooser.APPROVE_OPTION) {
                                        file = fileChooser.getSelectedFile();
                                        // ... ??? ...
                                }
                        }
                });
                mnFile.add(mntmNew);
		
                JMenuItem mntmOpen = new JMenuItem("Open");
                mntmOpen.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                int retval = fileChooser.showOpenDialog(frame);
				
                                if (retval == JFileChooser.APPROVE_OPTION) {
                                        file = fileChooser.getSelectedFile();
                                        // ... 선택한 파일을 읽어
                                        // ... JTextArea에 추가
                                        // ... 검사 예외 처리하는 코드 작성
                                }
                        }
                });
                mnFile.add(mntmOpen);
		
                JMenuItem mntmSave = new JMenuItem("Save");
                mntmSave.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                if (file != null) {
					
                                        // ... JTextArea에 입력된(수정한) 내용을
                                        // ... 선택한 파일에 저장
                                        // ... 검사 예외 처리 
                                }
                        }
                });
                mnFile.add(mntmSave);
		
                JMenuItem mntmClose = new JMenuItem("Close");
                mntmClose.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                file = null;
                                // ... JTextArea를 비움
                        }
                });
                mnFile.add(mntmClose);
		
                JMenuItem mntmQuit = new JMenuItem("Quit");
                mntmQuit.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                // ... 프로그램 종료
                        }
                });
                mnFile.add(mntmQuit);
		
                JMenu mnAbout = new JMenu("About");
                menuBar.add(mnAbout);
		
                JMenuItem mntmAboutTextEditor = new JMenuItem("About Text Editor");
                mntmAboutTextEditor.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                JOptionPane.showMessageDialog(frame, "Text Editor");
                        }
                });
                mnAbout.add(mntmAboutTextEditor);
                frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.X_AXIS));
		
                JScrollPane scrollPane = new JScrollPane();
                frame.getContentPane().add(scrollPane);
		
                textArea = new JTextArea();
                scrollPane.setViewportView(textArea);
          }
}