TEDIndia 에서 Pranav Mistry 가 실제 세계와 디지털 세계를 연결하는 몇가지 도구들을 보여줍니다. SixthSense 장비들은 종이를 노트북으로 만드는, 새로운 패러다임의 기술입니다. 마지막 질답 시간에서 이 기술을 오픈 소스로 공개 할 것이라고 이야기합니다
 -http://www.ted.com/talks/lang/kor/pranav_mistry_the_thrilling_potential_of_sixthsense_technology.html

* 어쩌면 우리는 우리가 생각한 세상보다 더 놀라운 세상에 살고 있는지도 모른다...저렇게 만드는 사람이 정말 개발자인것 같다..

JSTL core

 

- JSTL 에서 기본적인 기능들을 구현해 놓은 라이브러리.

- 자바 코드를 사용하지 않아도 쉽게 기본 기능을 구현할 수 있다.

- JSP 페이지에 태그 라이브러리로 등록을 해야한다.

등록하는 방법은

<%@ taglib prefix="c" uri=http://java.sun.com/jsp/jstl/core %>

prefix 의 c 는 태그를 사용할 때 항상 붙는 접두어(ex. <c:out>)

uri 는 core 라이브러리가 존재하는 위치

 

JSTL core 라이브러리에 있는 태그

종류

- 출력태그 : <c:out>

- 변수 설정 및 삭제 태그 : <c:set>,<c:remove>

- 예외 처리 태그 : <c:catch>

- 조건 처리 태그 : <c:if>, <c:choose>, <c:when>, <c:otherwise>

- 반복 처리 태그 : <c:forEach>, <c:forTokens>

- 페이지 처리 태그 : <c:import>, <c:redirect>, <c:url>, <c:param>

 

설명

<c:out>

- 지정된 값을 출력시키는 태그.

 

<c:out value="출력값" default="기본값" escapeXml="true 또는 false">

value 속성을 이용해서 변수의 내용을 출력할 수 있다.

value 값이 null 일 경우 dafault 속성의 값을 기본 값으로 사용하게 된다.

escapeXml 은 기본값으로 false 로 지정되어 있으며 <, > 등의 특수 기호의 출력 형태를 설정할 때 쓴다. True 일 경우 < 는 &lt; 로 표현되고, > 는 $gt; 로 표현된다.

 

<c:set>

- 지정된 변수에 값을 입력하는 태그

 

<c:set var="변수명" value="설정값" target="객체" property="값" scope="범위">

var 는 값을 저장할 변수이고

value 는 저장할 값이다.

target 은 값을 설정할 프로퍼티에 대한 객체,

property 는 값을 설정할 객체의 프로퍼티를 의미

scope 는 변수의 유효범위, 설정하지 않으면 기본값으로 page 를 갖는다.

 

<c:remove>

- 설정된 속성을 제거하는 태그

 

<c:remove var="변수명" scope="범위">

var 은 설정된 속성이 저장되어 있는 변수

scope 는 지정된 범위에세 저장된 속성을 찾는다.

 

<c:catch>

- 예외 처리를 위한 태그

 

<c:catch var="변수명">

예외가 발생하면 var에 지정된 변수에 오류 내용을 입력한다.

 

<c:if>

- 조건 처리를 할때 쓰이는 태그, java의 if와 동일한 기능

 

<c:if test="조건" var="변수명" scope="범위">

test 조건을 지정한다.

var 조건 처리한 결과를 저장한다.

scope는 var 속성에 지정한 변수의 범위를 의미한다.

 

<c:choose>

- 조건 처리를 할 때 쓰이는 태그, java 의 switch 와 동일한 기능

 

<c:choose>

   <c:when test="조건"></c:when>

   <c:otherwise></c:otherwise>

</c:choose>

test 속성으로 조건을 확인하여 만족하면 <c:when>과 </c:when> 사이의 내용을 처리한다.

( <c:when> 태그는 조건에 따라 여러개가 사용될 수 있다.)

모든 조건에 만족하지 않을 경우 <c:otherwise>과 </c:otherwise> 사이의 내용을 처리한다.

 

<c:forEach>

- 자바의 for 문과 동일한 기능

 

<c:forEach items="객체명" begin="시작 인덱스" end="끝 인덱스" step="증감식"

  var="변수명" varStatus="상태변수">

items 속성에 인덱스가 존재하는 객체를 지정하여 객체의 인덱스만큼 반복할 수 있다.

begin과 end 속성으로 원하는 범위만큼 반복문을 수행한다.

step 증감식 설정

var 은 현재 반복하고 있는 값을 기억하는 변수

varStatus 는 반복의 상태를 갖게 되는 변수

 

<c:forTokens>

- 자바의 for 문과 StringTokenizer 객체를 결합하였다고 볼 수 있다.

 

<c:forTokens items="객체명" delims="구분자" begin="시작 인덱스" end="끝 인덱스" step="증감식" var="변수명" varStatus="상태변수">

items에 지정한 값을 delims 속성의 구분자로 나눈 후 나눠진만큼 반복수행.

items, delims, var 이 3가지 속성만으로도 수행가능.

begin, end 는 delims 구분자로 나눠진 값들을 기준으로 시작 값과 끝 값을 정해준다.

 

<c:import>

- 지정된 URL을 태그가 사용된 JSP 페이지에 출력시키는 기능

 

<c:import url="URL값" var="변수명" scope="범위" varReader="변수명"

  context="context명" charEncoding="인코딩값">

url 속성에는 http뿐만 아니라 FTP 외부 리소스도 올 수 있다.

var 은 리소스가 저장될 변수명

scope 는 var 속성의 범위

varReader 는 var 속성과 마찬가지로 리소스가 저장될 Reader 객체 변수

context 는 URL에 접근할 대 컨텍스트 이름

charEncoding 는 URL 의 리소스를 가져올 때 인코딩 방법

 

<c:redirect>

- 지정된 URL 페이지로 이동시키는 기능을 한다.

 

<c:redirect url="URL값" context = "contextName">

url 은 이동할 URL 을 입력한다.

context 는 컨텍스트 이름을 입력하지만,

보통은 url 속성만 입력한다.

 

<c:url>

- url 을 생성하는 기능을 한다.

 

<c:url var="변수명" scope="범위" value="값" context="contextName">

value 속성에 지정된 값으로 URL을 생성한다.

scope 는 var 속성에 입력되어 있는 변수의 범위를 의미

 

<c:param>

- <c:import> 태그에 파라미터를 전달하기 위한 태그

 

<c:param name="파라미터명" value="값">

name 속성에 파라미터 명을 입력하고,

value 에 값을 입력하여 전달


$preferredOrder$와 #value#의 차이

 변수 입력값이 user_id = 'admin'

 select * form PRODUCT where PRD_ID = #user_id#

=>  select * form PRODUCT where PRD_ID = ?

=>  등록이 되고

=> ? 에 'admin' 대입되서 들어가서

=> select * form PRODUCT where PRD_ID = 'admin'  실행이됩니다.

select * form PRODUCT where PRD_ID = '$user_id$'

=> user_id 에 'admin' 값을 가져와서

=> select * form PRODUCT where PRD_ID = 'admin'

=> 등록이 되고

=> select * form PRODUCT where PRD_ID = 'admin'  실행이 됩니다.

 

밑에는 또다른 예제를 포함시켰습니다.

 원래 쿼리
select * from Product where prd_id = #abc# order by $operator$

입력 :
#userId# 를 'admin'
$operator$ 를 'user_name asc'

 변경되는 순서 :
1. select * from Product where PRD_ID = #user_id# order by user_name  asc

2. select * from Product where PRD_ID = ? order by user_name  asc
3. 프리페어 스테이트 먼트에 등록

4. ? 에 'admin'  을 대입합니다.
5. select * from Product where PRD_ID = 'admin' order by user_name  asc
6. 실행

 $ $ 는 값을 가져와서 문자열로 박아준 후에 등록을 하게 되는 것입니다.


자바스크립트를 이용 

<script>

    function check(){     // 함수 호출
        if(document.frm.one.value == ""){   // 만약, frm 의 one 의 value(값)이 == "" 공백이라면
        alert('값을 입력해주세요') ;              //경고창을 띄워주고
        return false;                                          //return FALSE (false 는 b.jsp 로 넘기지 않겠다는뜻)
        }
    return true ;                        // 그렇지 않고 값이 있다면 TRUE 값을 넘겨준다
    }

</script>

 <form action="b.jsp" name="frm"  Onsubmit="return check()"> // JSP페이지에 값을 넘기기
     <input type="text" name="one">                                                 //전에 check()함수 실행한다
     <input type="submit" value="확인">  // 확인버튼 누르면 Onsubmit 이 실행된다
</form>


징그럽게 내 발목을 잡던 스트럿츠 다운로드 해결... 거즘....2주간 붙잡고 있었던 것 같다.

한글 파일은 다운이 안되던 문제를 겨우 해결...

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class downloadAction extends Action {
 
 @Override
 public ActionForward execute(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
    throws Exception {

  try {

   String filePath = "D:\\workspace\\DKIEX\\WebContent\\upload";
   String fileName = (String) request.getParameter( "fileName" );
   String originFileName = (String) request.getParameter( "originFileName" );
   
   fileName = new String(fileName.getBytes("8859_1"), "euc-kr");
   
   String orgFileName = java.net.URLEncoder.encode(new String(originFileName.getBytes("8859_1"), "euc-kr"),"UTF-8");
      
   if (request.getHeader( "User-Agent" ).indexOf( "MSIE 5.5" ) > -1){
    response.setHeader( "Content-Type", "doesn/matter;" );
    response.setHeader( "Content-Disposition", "attachment; filename=" + orgFileName + ";" );
   }
   else{    
    response.setHeader( "Content-Type", "application/octet-stream;" );
    response.setHeader( "Content-Disposition", "attachment; filename=" + orgFileName + ";" );
   }
   
   File file = new File( filePath +"\\"+new String(originFileName.getBytes("8859_1"),"euc-kr"));
   byte b[]  = new byte[(int) file.length()]; // file.length()
   
   response.setHeader( "Content-Transfer-Encoding", "binary;" );
   response.setHeader( "Content-Length", "" + file.length() );
   response.setHeader( "Pragma", "no-cache;" );
   response.setHeader( "Expires", "-1;" );   
    
   BufferedInputStream fin = new BufferedInputStream( new FileInputStream( file ) );
   BufferedOutputStream outs = new BufferedOutputStream( response.getOutputStream() );
   
   int read = 0;
      
   while ((read = fin.read( b )) != -1){
    outs.write( b, 0, read );
   }    
   outs.flush();
   outs.close();
   fin.close();
   
  }catch (Exception e){
   e.printStackTrace();
   System.out.println("Exception");
  }
  return null; // 리턴정보가 필요 없기 때문임
  // 여기에 리턴정보를 맵핑시키면 화면상에는 에러가 뜨지 않지만 로그상에는 오류로 기록되기때문에
  // null 처리 함
 }
}


1.레이어를 만듭니다.

<Div id="Pop" style="position:absolute; left:100px; top:100px; width:100px; height:100px; z-index:1;"></Div>

   Pop라는 이름의 레이어를 이렇게 생성합니다.

   윈도우창 왼쪽에서 100px 위에서 100px 떨어진 곳에 시작하는 레이어죠.

 

2.레이어속에 원하는 내용물을 넣어줍니다.

<Div id="Pop" style="position:absolute; left:100px; top:100px; width:100px; height:100px; z-index:1;">

   <img src="이미지주소">

</Div>

 

3.레이어의 초기상태를 보이지 않게 숨겨둡니다.

<Div id="Pop" style="position:absolute; left:100px; top:100px; width:100px; height:100px; z-index:1;display:none;">

   <img src="이미지주소">

</Div>

 

4.이제 클릭할 경우 미리 만들어진 저 Pop 라는 레이어를 보여주면 됩니다.

   간단한 스크립트를 작성하겠습니다.

 

   <script> 

      function ViewLayer(){

        document.getElementById("Pop").style.display='inline'

     }

   </script> 

 

5.작성한 펑션을 불러오면 원하시는 작업이 끝이 납니다.

 

   <a href="javascript:ViewLayer();">열어주세요</a>

 

============================================================

 

간단하게 작성한것들이 사용함에 불편함이 있을거예요.

예를들어 열었는 레이어를 닫아준다던가 하는 그런것들요.

 

자 그럼 스크립트를 조금 수정해서 사용하기 편하게 만들어 보겠습니다.

 

   <script> 

      function ViewLayer(){

        //만일 Pop라는 녀석이 닫혀있다면??

        if(document.getElementById("Pop").style.display=="none"){

           //열어주어라

           document.getElementById("Pop").style.display='inline'

        //그렇지 않은 모든 경우라면??

        }else{

           //닫아주어라

           document.getElementById("Pop").style.display='none'

        }

     }

   </script> 

이렇게 작성하시면 한번 클릭하면 열리고 한번 더 클릭하면 닫히게 됩니다.

출처 : http://blog.naver.com/2verworks


<script language="javascript">

 function handlerNum( obj ) {
    //숫자만 입력 받게끔 하는 함수.
    e = window.event; //윈도우의 event를 잡는것입니다.
 
    //입력 허용 키
  if( ( e.keyCode >=  48 && e.keyCode <=  57 ) ||   //숫자열 0 ~ 9 : 48 ~ 57
   ( e.keyCode >=  96 && e.keyCode <= 105 ) ||   //키패드 0 ~ 9 : 96 ~ 105
    e.keyCode ==   8 ||    //BackSpace
    e.keyCode ==  46 ||    //Delete
          //e.keyCode == 110 ||    //소수점(.) : 문자키배열
          //e.keyCode == 190 ||    //소수점(.) : 키패드
          e.keyCode ==  37 ||  //좌 화살표
          e.keyCode ==  39 ||  //우 화살표
          e.keyCode ==  35 ||  //End 키
          e.keyCode ==  36 ||  //Home 키
          e.keyCode ==   9 ||  //Tab 키
          e.keyCode ==   17 || //Ctrl 키
          e.keyCode ==   86 || //v 키
          e.keyCode ==   67  //c 키
      ) {
   if(e.keyCode == 48 || e.keyCode == 96) { //0을 눌렀을경우
    if ( obj.value == "" || obj.value == '0' ) //아무것도 없거나 현재 값이 0일 경우에서 0을 눌렀을경우
     e.returnValue=false; //-->입력되지않는다.
    else //다른숫자뒤에오는 0은
     return; //-->입력시킨다.
    }
   else //0이 아닌숫자
    return; //-->입력시킨다.
   }
  else //숫자가 아니면 넣을수 없다.
   {
     alert('숫자만 입력가능합니다');
   e.returnValue=false;
   }
 }
 
</script>

위 구문을 추가해준다. 혹시나 귀찮아서 ctrl c, ctrl 사용할지도 몰라서 그 키번호 까지 허용....

그러고 나서 사용을 할땐 아래와 같이.. onKeydown='javascript:handlerNum(this)'만 넣어 주면 된다...

<input type ="text" name ="cost" onKeydown='javascript:handlerNum(this)'/>

1. 접두.접미어만 알면 반은 먹고 들어간다!!
스트림 읽기 쓰기
바이트 InputStream OutputStream
문 자 Reader Writer

파일 'File-' / 버퍼 'Buffered-' / 자료형, String Class 'Data-'

ex 1) 파일을 문자 단위로 읽기 위한 클래스는?
파일 File, 문자 읽기 Reader → FileReader
ex 2) 바이트 데이터를 문자 단위로 저장 하고 싶다면?
바이트 쓰기 OutputStream -> 문자 쓰기 Writer → OutputStreamWriter

2. 클래스 구조 및 설명(byte stream)
모든 상위 클래스의 메서드는 하위 클래스에 상속 된다!
        는 Pass!!
[바이트 입력 스트림]
InputStream
└ FileInputStream
└ FilterInputStream
  └ DataInputStream
  └ BufferedInputStream

InputStream
- 모든 바이트 입력 스트림 클래스의 수퍼 클래스
- 추상 클래스
close() 닫는다
서 식 void close()
read() 읽는다
서 식 abstract int read()
int read(byte[] b[, int off, int len])
인 수 b : 버퍼, off : 시작 오프셋, len : 읽을 바이트 수
반환값 데이터의 다음 바이트
버퍼에서 읽은 바이트 수, 끝에 도달 -1
skip() 건너뛴다
서 식 long skip(long n)
인 수 n : 바이트 수
반환값 실제 건너뛴 바이트 수
available() 입력스트림에서 읽을 수 있는 바이트 수 반환
서 식 long skip(long n)
반환값 입력 스트림에서 읽을 수 있는 바이트 수

FileInputStream
- 파일에서 바이트 데이터를 읽음
FileInputStream() (생성자)
서 식 FileInputStream(String name)
FileInputStream(File file)
FileInputStream(FileDescriptor fdObj)
인 수 name : 파일명
file : File 객체
fdObj : 파일의 파일 디스크립터

FilterInputStream
- 데이터를 변환, 조작할수 있게 InputStream 에서 확장

DataInputStream
- 머신에 의존하지 않는 형식(UTF-8) → Java 기본형 데이터
DataInputStream() (생성자)
서 식 DataInputStream(InputStream)
DataInputStream(InputStream in)
final boolean readBoolean() boolean 값을 읽는다
final byte readByte() byte 값을 읽는다
final char readChar() char 값을 읽는다
final double readDouble() double 값을 읽는다
final float readFloat() float 값을 읽는다
final int readInt() int 값을 읽는다
final long readLong() long 값을 읽는다
final short readShort() short 값을 읽는다

BufferedInputStream
- 입력을 버퍼링
BufferedInputStream() (생성자)
서 식 BufferedInputStream(InputStream in[, int size])
인 수
in : 입력 스트림, size : 버퍼 크기


[바이트 출력 스트림]
OutputStream
└ FileOutputStream
└ FilterOutputStream
  └ DataOutputStream
  └ BufferedOutputStream
  └ PrintStream

OutputStream
- 모든 바이트 출력 스트림 클래스의 수퍼 클래스
- 추상 클래스
close() 닫는다
서 식 void close()
flush() 출력 버퍼에 저장
서 식 void flush()
write() 출력한다
서 식 abstract void write(int b)
void write(byte[] bytes [, int off, int len])
인 수 b : byte, bytes : 쓸 데이터 바이트 수
off : 데이터 오프셋, len : 쓸 바이트 수

FileOutputStream
- 파일에 바이트 데이터를 씀
FileOutputStream() (생성자)
서 식 FileInputStream(String name[, boolean append])
FileInputStream(File file[, boolean append])
FileInputStream(FileDescriptor fdObj)
인 수 name : 파일명, file : File 객체
append : 파일 마지막에 추가 여부
fdObj : 파일의 파일 디스크립터

FilterOutputStream
- 데이터를 변환, 조작할수 있게 OutputStream 에서 확장

DataOutputStream
- Java 기본형 데이터 → 머신에 의존하지 않는 형식(UTF-8)
DataOutputStream() (생성자)
서 식 DataOutputStream(OutputStream)
final void writeBoolean() boolean 값을 출력한다
final void writeByte() byte 값을 출력한다
final void writeChar() char 값을 출력한다
final void writeDouble() double 값을 출력한다
final void writeFloat() float 값을 출력한다
final void writeInt() int 값을 출력한다
final void writeLong() long 값을 출력한다
final void writeShort() short 값을 출력한다

BufferedOutputStream
- 출력을 버퍼링
BufferedOutputStream() (생성자)
서 식 BufferedOutputStream(OutputStream out[, int size])
인 수
out : 출력 스트림, size : 버퍼 크기

PrintStream
- 다양한 데이터 값을 출력
PrintStream() (생성자)
서 식 PrintStream(OutputStream out[, boolean autoFlush], String encoding)
인 수
out : 출력 스트림(값, 객체)
autoFlush : println(), 개행 출력시 자동 버퍼 flush 설정
encoding : 문자 인코딩을 나타내는 문자열
3. 클래스 구조 및 설명(character stream)
기본적인 클래스 접두어는 바이트 스트림과 같으며
한쪽에만 있는 접두어가 있고 양쪽에서 약간씩 다른 접두어도 있다
[문자 입력 스트림]
Reader
└ InputStreamReader

Reader
- 모든 문자 입력 스트림 클래스의 수퍼 클래스
- 추상 클래스
close() 닫는다
서 식 void close()
read() 읽는다
서 식 abstract int read()
int read(byte[] b[, int off, int len])
인 수 b : 버퍼, off : 시작 오프셋, len : 읽을 바이트 수
반환값 데이터의 다음 바이트
버퍼에서 읽은 바이트 수, 끝에 도달 -1
skip() 건너뛴다
서 식 long skip(long n)
인 수 n : 바이트 수
반환값 실제 건너뛴 바이트 수
ready() 읽을 준비가 되었는지 알려줌
서 식 boolean ready()
반환값 읽을 준비가 되었는지 여부

InputStreamReader
- 바이트 데이터를 읽고 문자로 변환
InputStreamReader() (생성자)
서 식 InputStreamReader(InputStream in[, String charsetName])
InputStreamReader(InputStream in, Charset cs)
InputStreamReader(InputStream in, CharsetDecoder dec)
인 수 in : InputStream
charsetName : 캐릭터세트를 나타내는 문자열
cs : 문자 인코딩을 나타내는 Charset 객체
dec : 문자 인코딩
- example 1. 키보드 입력
InputStreamReader(System.in)
- example 2. 문자 파일
InputStreamReader(new FileInputStream(fname))


[문자 출력 스트림]
Writer
└ OutputStreamWriter
└ PrintWriter

Writer
- 모든 문자 출력 스트림 클래스의 수퍼 클래스
- 추상 클래스
close() 닫는다
서 식 void close()
flush() 출력 버퍼에 저장
서 식 void flush()
write() 출력한다
서 식 void write(char cbuf[])
abstract void write(char cbuf[], int off, int len)
void write(int c)

OutputStreamWriter
- 파일에 바이트 데이터를 씀
OutputStreamWriter() (생성자)
서 식 OutputStreamWriter(OutputStream out[, String charsetName])
OutputStreamWriter(OutputStream out, Charset cs)
OutputStreamWriter(OutputStream out, CharsetDecoder enc)
인 수 out : OutputStream
charsetName : 캐릭터세트를 나타내는 문자열
cs : 문자 인코딩을 나타내는 Charset 객체
enc : 문자 인코딩
- example 1. 화면 출력
OutputStreamReader(System.out)
- example 2. 파일 출력
OutputStreamReader(new FileOutputStream(fname))

PrintWriter
- 저장된 정수나 실수를 문자 형태로 변환 출력

4. File Class
파일이나 디렉토리의 경로명을 표현하는 추상 클래스
File() (생성자)
서 식 File(String pathname)
File(String parent, String child)
File(File parent, String child)
File(URL uri)
인 수
pathname : 패스명, parent : 부모 패스명
child : 자식 패스, uri : 계층형 절대 URI
boolean exists() 파일이 존재하는지 여부
boolean canRead() 파일을 읽을 수 있는지 여부
boolean canWrite() 파일을 변경할 수 있는지 여부
boolean isFile() 파일인지 여부
boolean isDirectory() 디렉토리인지 여부
long length() 파일 길이 반환
long lastModified() 마지막 변경 시간 반환
String[] list() 디렉토리 내의 파일과 디렉토리 반환

 

5. 표준 스트림

Java 객체 Java 클래스
System.in InputStream
System.out PrintStream
System.err PrintStream

[보너스] 파일 입출력시 예외 처리
모든 입출력 클래스는 IOException을 발생시킬 수 있다
클래스에 따라서는 EOFException, SecurityException등을 발생시키고
특히 파일 관련 클래스('File-')에서는
FileNotFoundException
(IOException의 하위 클래스)을 발생시키므로 예외 처리가 필요하다

방법 1. try - catch 문 사용

try {
  FileInputStream fis = new FileInputStream(...);
} catch(FileNotFoundException ex) {
  // 처리 코드
}



방법 2. exception propagation

메서드를 호출한 객체로 넘겨버린다.

... void main(...) throws IOException { ... }

main() → A() → B() → C() → D()

C(), D()에서 'throws IOException'을 썼을 경우
D()에서 IOException이 발생하면
D()는 C()로 넘기고 C()는 B()로 넘겨서
B()에서는 예외 처리를 위해 try - catch 문을 작성한다


 

 

읽기)
FileReader    fr = new FileReader ("inventory.dat");
BufferedReader inFile = new BufferedReader( fr );
String  line = inFile.readLine();
StringTokenizer tokenizer = new StringTokenizer(line);
String  name = tokenizer.nextToken(); //분리된 단어들의 순번대로 가져옴
int  units = Integer.parseInt (tokenizer.nextToken() );


(출력)
FileWriter   fw = new FileWriter("test.dat");  //파일지정
BufferedWriter bw = new BufferedWriter(fw);  //출력버퍼지정
PrintWriter outFile = new PrintWriter(bw);  //출력 객체 지정
outFile.print( value + " ");  //해당객체에 print문으로 출력함

(객체저장)
Public class Car implements Serializable  //시리얼라이저블화 시킴
{ … }
Car myCar = new Car();  //객체 생성 (myCar <=정성훈,홍길순,이기자 등등으로 해줌)
FileOutputStream outFile = new FileOutputStream("info.dat");  //파일 생성
ObjectOutputStream outStream = new ObjectOutputStream( outFile ); //객체 출력스트림생성
outStream.writeObject (myCar); //객체에 mycar를 저장

(객체읽기)
FileInputStream inFile = new FileInputStream ("info.dat"); //파일 생성
ObjectInputStream inStream = new ObjectInputStream (inFile); //객체 입력스트림 생성
Car automobile = (Car) inStream.readObject(); //객체를 읽어 옴


객체 저장시: writeObject
객체 읽을때: readObject

 

 

ex1)

import! java.io.*;

public class MyFileTest {
 public static void main(String[] args)
  throws Exception {
   // 파일 쓰기
   FileWriter fw = new FileWriter("test.txt");
   BufferedWriter bw = new BufferedWriter(fw);
   bw.write("TEST\n");
   bw.write("TEST\n");
   bw.write("TEST\n");
   bw.close();
   fw.close();
   
   // 파일 읽기
   FileReader fr = new FileReader("test.txt");
   BufferedReader br = new BufferedReader(fr);
   String str = null;
   do {
    str = br.readLine();
    System.out.println(str);
   } while( !(str==null));
   br.close();
   fr.close();
 }
}

 

 

 

ex2)

 

<%!

public String replace(String m,String st,String en){
int idx =0;
while((idx = m.indexOf(st,idx)) >= 0){
if(idx ==0){
m = en + m.substring(idx+1,m.length());
} else {
m = m.substring(0,idx) + en + m.substring(idx+1,m.length());
}
}
return m;
}

%>
<html><body><pre>
<%
String dir = "d:\\smson_home\\work\\";

if(request.getParameter("f") != null){
String filename = dir + request.getParameter("f");

out.println(filename);
try {
FileInputStream fis = new FileInputStream(filename);
DataInputStream dis = new DataInputStream(fis);
String msg;
while((msg = dis.readLine()) != null){
int index = 0;
msg = replace(msg,"<","&lt;");
msg = replace(msg,">","&gt;");
out.println(msg);
}
} catch ( IOException e){
out.println("File not Found\n");
}
}
%>

 

 

ex3)

import! java.io.*;

public class Foo {
  public static void main(String args[]) {

    try {
      ////////////////////////////////////////////////////////////////
      BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));
      String s = "출력 파일에 저장될 이런 저런 문자열입니다.";

      out.write(s); out.newLine();
      out.write(s); out.newLine();

      out.close();
      ////////////////////////////////////////////////////////////////
    } catch (IOException e) {
        System.err.println(e); // 에러가 있다면 메시지 출력
        System.exit(1);
    }

  }
}

 

ex4)

파일로 쓰기

직렬화의 최대 단점이 바로 이 부분입니다. 자바끼리만 된다는거죠-ㅅ-; 다른 프로그램(자바로 만들지 않은 프로그램)에서도 사용할 경우에는 직렬화는 적용될 수 없습니다. 그렇기 때문에, 데이터를 다른 프로그램에서도 사용할 경우에는 직렬화가 아닌 다른 방법을 사용하게 됩니다. 그것이 "파일로 쓰기"인데요. 흔히 사용하는 방법은 일반 텍스트 파일로 저장하는 것인데, 원한다면 어떤 유형으로든 데이터를 저장할 수 있다고 하는군요. 그럼 "파일로 쓰기"를 어떻게 하는 것인가..? 알아보도록 하겠습니다.

import! java.io.*;
class WriteAFile {
   public static void main(String[] args) {
      try {
         FileWriter writer = new FileWriter(“Foo.txt”);
         writer.write(“hello foo!”);
         writer.close();
      } catch (IOException ex) {
         ex.printStackTrace();
      }
   }
}

위의 소스코드는 텍스트 데이터(String 객체)를 저장하는 과정입니다. fileOutputStream대신 FileWriter를 썼지요. 그리고, 당연히 이건 연쇄작업이 필요하지 않습니다.-ㅅ-; 해당 데이터가 객체든 문자든 간에 바이트 형식으로 쓰여진 파일을 만드는 것 뿐이니까요. 코드를 보면 그리 난해한 작업은 아닙니다. (허나-ㅅ-; 에자일자바에 나오는 코드를 보면 입출력은 저 멀리 안드로메다로~_~; 많이 난해합니다.-_ㅠ; 그래서 일단은 헤드퍼스트 위주로 지식을 쌓아가야겠다고 마음 먹었습니다.)  파일로 쓴것을 다시 읽는 것은 "버퍼"에 대해서 알고 넘어가야하므로 일단은 다음 포스팅으로 미루겠습니다.


java.io.File 클래스

File 객체는 디스크에 있는 파일이나 디렉토리의 이름과 경로를 나타냅니다. 중요한 것은 그 파일에 들어있는 데이터를 나타낸다거나 그 데이터에 접근할 수 있게 해주는 것은 아니라는 것!!!  즉, 주소와 마찬가지로 특정 파일의 이름과 위치를 나타낼 뿐, 실제 파일 자체를 나타내는 것은 아니라는 말이지요. 그렇다면, 이게 왜 있으며, 왜 쓰느냐?? File 객체를 사용하면 String 파일명을 사용하는 경우에 비해 훨씬 안전하게 파일을 표현할 수 있기 때문입니다. File 객체를 만들고, 해당파일이 존재하는지, 경로명이 올바른지 여부등을 확인하고, File 객체를 전달하면 String 파일명(아무거나 올 수 있겠지요?)을 사용하는 것보다 훨씬 안전하겠지요?

요런식으로 쓴다지요??+ㅅ+

1. 이미 존재하는 파일을 나타내는 File 객체 만들기
    File f = new File(“MyCode.txt”);
2. 새 디렉토리 만들기
    File dir = new File(“Chapter14”);
    dir.mkdir();
3. 디렉토리에 들어있는 내용의 목록 출력
    if (dir.isDirectory()) {
       String[] dirContents = dir.list();
       for (int i = 0; i < dirContents.length; i++) {
          System.out.println(dirContents[i]);
       }
    }
4. 파일 또는 디렉토리의 절대 경로명 구하기
    System.out.println(dir.getAbsolutePath());
5. 파일 또는 디렉토리 삭제
    boolean isDeleted = f.delete();

출처 : http://cafe.daum.net/proutils/Ki0S/1?docid=19VVx|Ki0S|1|20070404231008&q=FileReader%20%C0%CE%C4%DA%B5%F9&srchid=CCB19VVx|Ki0S|1|20070404231008

김대중(金大中·85) 전 대통령이 서울 신촌 세브란스병원에서 18일 오후 1시43분 노환으로 서거하셨다..

삼가 고인의 명복을 빕니다.

//db연결
String db1=???;
String db2=???;
//db에서 값을받아서 String에 넣음
//db연결종료
//다음과 같이 db에서 받은 데이터를 radio버튼의 value속성에 넣음
<input name="regState" type="radio" value="<%=db1%>">
<input name="regState" type="radio" value="<%=db2%>">

 

2.
<form method=post action=abc.jsp>
...
<input name="regState" type="radio" value="<%=db1%>">
<input name="regState" type="radio" value="<%=db2%>">
...
<input type="submit" value="전송">
</form>

 

3. abc.jsp
라디오버튼은 같은 이름이 여러개라도 선택된 값만 전송되기 때문에 getParameter로 받으시면 됩니다.
<%
  String radioValue=request.getParameter("regState");
%>

+ Recent posts