본문 바로가기

언어

flush()

버퍼에서 쓰이는 

 

flush 를 언제 해주는 지 한번 봐도록 하겠습니다.

 

조금 더러울 수 있는 예시 이지만 기억에 남으라구 한번 들어보겠습니다.

 

예를 들어서 옥돌이의 강아지가 화장실에 갔다고 합시다.

 

변기에 총 5kg의 배설물까지 담을 수 있다고 해봅시다 

 

그리고 1kg 의 배설물이 담기면 자동으로 물이 내려간다고 해봅시다.

 

그런데 만약 강아지가 4.9 kg의 배설물을 배설 했다고 해봅시다 

 

그러면 어떻게 될까요 ?

 

1kg 1kg 1kg 1kg 씩 잘 내려갔는데

0.9 kg부터는 어떻게 되는거죠 ??

그냥 화장실에서 나와야하나요 ??

 

아니죠 ~ ??

네 맞아요

 

수동으로 내려주고 나와야합니다.

 

그럴 때 사용하는것이 비워준다의 flush() 입니다 

 

 

 

다른 관점에서 또 봐보도록 하겠습니다.

 

원본 -----메인스트림 ----> JAVA 

 

원본 -----버퍼----메인스트림 -----> JAVA 

 

어떤게 더 효율적일까요 ??

 

만약 버퍼가 없이 원본에서 자바로 가야한다면 

 

1000개의 데이터를 1000번 가져와야 합니다.

 

그런데 버퍼가 있다면 

 

데이터를 10개씩 모아서 한번에 보내주는 버퍼가 있다면 

 

100번만 버퍼에서 가져오면 됩니다.

 

따라서 버퍼를 사용하는 것입니다.

 

하지만 만약 그 버퍼에 데이터가 10개 가 아니라

 

9개가전달이 되고 데이터가 종료되었다고 해봅시다

 

그러면 남은 데이터는 어떻게 해야하나요 ??

 

그때 는 수동으로 9개의 데이터를 보내주어야하죠~ ??

 

이때 사용하는 것이 Flush() 입니다.

 

그러면 이제 좀더 거시적인 관점에서 버퍼가 언제 쓰이는 지 보도록 하겠습니다.

 

-----데이터-----> 보조 입력 스트림 ----> 입력 스트림 ---> 프로그램 ----> 출력 스트림 ----> 보조 출력스트림 

 

입력 스트림은 변환해주는 역할 그리고 read하는 역할을 합니다.

보통 문자기반 , 바이트 기반, 데이터 기반으로 데이터를 처리합니다.

 

 

보조 스트림은 buffered같은 애들인데

말그대로 정말 보조하는 녀석이라서 없어도 되구욧

만약 있다고 하더라도 호출되는 순서는 먼저 입력 스트림을 호출해준다음에 보조 입력 스트림을 맨 나중에

선언해줘야합니다.

 

 

package io_stream;

import java.awt.BorderLayout;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ClientEx5 extends JFrame implements Runnable,ActionListener,ItemListener{

	private List userList;
	private JTextArea output;
	private JTextField input;
	private JLabel label;
	private BufferedReader i;
	private PrintWriter o;
	private Thread listener;
	private String host;
	private JPanel bottom;
	JScrollBar jb;
	ArrayList<String> userNames;
	
	public ClientEx5(){}
	
	public ClientEx5(String server){
		super("ä�� ���α׷�");
		host=server;
		listener= new Thread(this);
		listener.start();
		
		userList=new List();
		output=new JTextArea();
		output.setEditable(false);
		JScrollPane jp= new JScrollPane(output);
		jb=jp.getVerticalScrollBar();
		add (jp,"Center");
		
		input=new JTextField("",25);
		label=new JLabel("������̸�");
		bottom=new JPanel();
		
		
		add(userList,"East");
		add(bottom,"South");
		
		bottom.setLayout(new BorderLayout());
		bottom.add(label,"West");
		bottom.add(input,"Center");
		
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(400,300);
		setVisible(true);
		
		
		input.addActionListener(this);
		userList.addItemListener(this);
	}
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			Socket s=new Socket(host,9830);
			InputStream ins=s.getInputStream();
			OutputStream os=s.getOutputStream();
			//StringTokenizer st = new StringTokenizer(, "|");
			i=new BufferedReader(new InputStreamReader(ins));
			o=new PrintWriter(new OutputStreamWriter(os),true);
			while(true) {
				String line=i.readLine();
				
				StringTokenizer st=new StringTokenizer(line,"|");
				userNames =new ArrayList<String>();
				String msg="";
				int userNameCnt=st.countTokens();
				while(st.hasMoreElements()) {
					if(userNameCnt-- !=1) 
						userNames.add(st.nextToken());
					
					else 
						msg=st.nextToken();
					
				}
				userList.clear();
				for(String name: userNames) userList.add(name);
				
				
				
				output.append(msg+"\n");
				jb.setValue(jb.getMaximum());
				
			}
		}catch(IOException e) {}
		
		
	}
	
	int choiceUserNum=-1;
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		Object c=e.getSource();
		if(c==input) {
			if(choiceUserNum !=-1){
				o.println(choiceUserNum+"#"+input.getText());
			}
			else {
				o.println(input.getText());
			}
			label.setText("�޽���");
			input.setText("");
		}
		
	}
	
	@Override
	public void itemStateChanged(ItemEvent e) {
		// TODO Auto-generated method stub
		choiceUserNum=userList.getSelectedIndex();
	}
	
	public static void main(String[] args) {
		if(args.length >0) {
			new ClientEx5(args[0]);	
		}else {
			new ClientEx5("localhost");
		}
		
	}
	
}

 위의 예에서도 확인할 수 있죠~ 

 

i=new BufferedReader(new InputStreamReader(ins));
			o=new PrintWriter(new OutputStreamWriter(os),true);
			while(true) {
				String line=i.readLine();

참고로 bufferedreader는 한줄씩 읽어서 realine를 사용하는 것이지요~