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
- 성균관대학교 소프트웨어학과 타메르 교수님 <자바 프로그래밍 실습>
'프로그래밍 언어 > Java' 카테고리의 다른 글
Week14) Java Programming Lab : Socket Programming (0) | 2021.05.28 |
---|---|
Week12) Java Programming Lab : Generic Collections (0) | 2021.05.12 |
Week10) Java Programming Lab : Multithreading (0) | 2021.04.30 |
Week9) Java Programming Lab : Exception Handling (0) | 2021.04.19 |
Week8) Java Programming Lab : More on Grapical User Interface (GUI) (0) | 2021.04.12 |