목차
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; // 직렬화 제외
'100일 챌린지 > 빅데이터기반 인공지능 융합 서비스 개발자' 카테고리의 다른 글
Day 17 - jsp로 웹페이지 만들기 vagrant로 배포하기 (0) | 2024.08.13 |
---|---|
Day 16 - Web(Tomcat 다운받기), html과 jsp (0) | 2024.08.12 |
Day 14 - 예외 처리, I/O (0) | 2024.08.08 |
Day 13 - UI 구현하기 (0) | 2024.08.07 |
Day12 - 내부 클래스, GUI (0) | 2024.08.06 |