본문 바로가기

프로그래밍 언어/Java

Week11) Java Programming Lab : File I/O

Java-Lecture11.pdf
0.70MB


Streams


  • 데이터가 프로그램과 입출력 디바이스 또는 파일 사이를 흐를 수 있게 하는 객체 
  • input stream : 프로그램으로 들어가는 데이터
  • output stream : 프로그램에서 나오는 데이터 

 

2. Files Types


2.1 Text Files

  • ASCII files
  • 에디터로 읽고 쓰기가 가능한 파일
  • 사람이 읽을 수 있도록 설계된 파일

2.2 Binary Files

  • 프로그램이 읽을 수 있도록 설계된 파일
  • 일련의 이진수로 구성된 파일
  • 텍스트 파일보다 효율적인 처리가 가능 

3. Text files Processing


3.1 Write / Appending

PrintWriter class

  • 스트림 클래스
  • 텍스트 파일에 쓰기 위한 클래스 
  • print, println 메소드를 가지고 있음
  • System.out 메소드와 비슷하지만 스크린이 아닌 텍스트 파일에 output을 전달함
import java.io.PrintWriter;
import java.io.FileOutputStream;
import java.io.FileNotFountException;

PrintWriter outputStreamName;
outputStreamName = new PrintWriter (new FileOutputStream(FileName, true/false));
// 첫번째 파라미터 : 파일 이름 
// 두번째 파라미터 : true 면 append, false 

 

  • FileOutputStream : 파일 이름 문자열  -> 파라미터로 전달해야 함 (FileName)

3.2 Read

Scanner class

  • import java.util.Scanner;
  • Scanner x = new Scanner(fileObject);
  • String s = new String();
  • while(x.hasNext()){ s =  s + "" + x.ne xtLine(); }

BufferReader class

  • 텍스트 파일에서 읽을 수 있게 하는 스트림 클래스 
  • read, readline 메소드를 가지고 있음 
  • realine 한 다음에 Integer.parseInt, Double.parseDouble 등을 사용해서 문자열을 숫자로 바꿀 수 있음 
FileWriter fw = new FileWriter("file.txt");
BufferWriter bw new BufferWriter(fw);
bw.writeData(content_;
bw.flush();
bw.close();

FileReader fr = new FileReader("File.txt");
BufferReader br = new BufferReader(fr);
String sCurrentLine;
while ((sCurrentLine += br.readLine()) != null) {
	System.out.println(sCurrentLine);
}
br.close();

3.3 Path Names

  • 파일 경로는 운영체제에 따라 다르게 설정됨 
  • 윈도우 : C:\dataFiles\goodData\data.txt
  • BufferReader 사용해서 저장할때는 \ -> \\로 해야 함
  • BufferReader (new FileReader ("C:\\dataFiles\\goodData\\data.txt"));

4. Binary files Processing


  • ObjectOutputStream으로 바이너리 파일 쓰기 
  • writeDouble/Char/Boolean/UTF 로 파일 쓰기 가능 
ObjectOutputStream outputStreamName= new ObjectOutputStream(new FileOutputStream(FileName));

 

  • ObjectInputStream으로 바이너리 파일 읽기 
  • readInt,/Double/Char/Boolean/UTF로 읽기 가능 
ObjectOutputStream inputStreamName= new ObjectInputStream(new FileOutputStream(FileName));

 

  • Serializable 

5. Example :  GUI 메모장 만들기  


Using JFrame, awt, swing 
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;


import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;
import java.awt.event.ActionEvent;

public class Notepad extends JFrame {

	private JPanel contentPane;
	private JMenuBar menuBar;
	private JMenu mnNewMenu;
	private JMenuItem mntmNewMenuItem;
	private JMenuItem mntmNewMenuItem_1;
	private JMenuItem mntmNewMenuItem_2;
	private JScrollPane scrollPane;
	private JTextArea textArea;
	private JMenuItem mntmNewMenuItem_3;
	private JMenuItem mntmNewMenuItem_4;

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

	/**
	 * Create the frame.
	 */
	public Notepad() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 675, 449);
		
		menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		mnNewMenu = new JMenu("File");
		menuBar.add(mnNewMenu);
		
		mntmNewMenuItem = new JMenuItem("Write Txt");
		mntmNewMenuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			// write to the file 
			
			try {
				//FileOutputStream fileStream = new FileOutputStream("swData\\file.txt",true);
				PrintWriter writer = new PrintWriter(new FileOutputStream("swData\\file.txt",true));
				writer.println(textArea.getText());
				textArea.setText("");
				writer.close();
				//fileStream.close();
			// FileOutputStream 에러 처리 
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
			
			}
		});
		mnNewMenu.add(mntmNewMenuItem);
		
		mntmNewMenuItem_1 = new JMenuItem("Read Txt");
		mntmNewMenuItem_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			try {
            	// 파일 위치는 파일이름 앞에 경로 추가 
				//FileInputStream inputFile = new FileInputStream("swData\\file.txt");
				Scanner reader = new Scanner(new FileInputStream("swData\\file.txt"));
				String totalFileContents = "";
				while (reader.hasNext()) {
					totalFileContents += reader.nextLine()+"\n"; 
					
				}
				textArea.setText(totalFileContents);
				
			// 에러 처리 : write할 파일 발견하지 못한 에러 처리 
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
			
			}
		});
		mnNewMenu.add(mntmNewMenuItem_1);
		
		mntmNewMenuItem_3 = new JMenuItem("Write Object");
		mntmNewMenuItem_3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			// Write to binary file a student object
				Student s1 = new Student ("Tam", "123456789",24);
				try {
					FileOutputStream fileStream = new FileOutputStream("swData//file.data",true);
					ObjectOutputStream BinaryWriter = new ObjectOutputStream(fileStream);
					BinaryWriter.writeObject(s1);
					BinaryWriter.flush(); // write whatever inside the stream into the file
				
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			
			
			}
		});
		mnNewMenu.add(mntmNewMenuItem_3);
		
		mntmNewMenuItem_4 = new JMenuItem("Read Object");
		mntmNewMenuItem_4.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			try {
				FileInputStream fileReader = new FileInputStream ("swData//file.data");
				ObjectInputStream BinaryReader = new ObjectInputStream(fileReader);
				String s="";
				while(true) {
                // down casting data type 필수!
				Student rs = (Student) BinaryReader.readObject();
				
				 textArea.append(rs.getName() +"\n"+rs.getSSN()+"\n"+rs.getAge());
				 
				}
				
				 
				
			} catch (IOException | ClassNotFoundException e1) {
				// TODO Auto-generated catch block
				System.out.println("End of the file");
			}
			
			
			}
		});
		mnNewMenu.add(mntmNewMenuItem_4);
		
		mntmNewMenuItem_2 = new JMenuItem("Exit");
		mnNewMenu.add(mntmNewMenuItem_2);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		textArea = new JTextArea();
        // textArea를 넣은 Panel을 scrollable하게 
		scrollPane = new JScrollPane(textArea);
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		
		//contentPane.add(textArea, BorderLayout.NORTH);
	}

}

 

  • Student class
import java.io.Serializable;

public class Student implements Serializable {
	private String Name;
	private String SSN;
	private int age;
	public Student(String name, String sSN, int age) {
		super();
		Name = name;
		SSN = sSN;
		this.age = age;
	}
	public String getName() {
		return Name;
	}
	public void setName(String name) {
		Name = name;
	}
	public String getSSN() {
		return SSN;
	}
	public void setSSN(String sSN) {
		SSN = sSN;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}

 

References


  • 성균관대학교 소프트웨어학과 타메르 교수님 <자바 프로그래밍 실습>