DataInputStream DataOutputStream

DataInputStream DataOutputStream은 자바의 Primitive 데이터를 입력하고 출력하는데 알맞는 클래스이다.  DataInputStream는 생성자에 InputStream을 받아들이며, DataOutputStream은 생성자에서 OutputStream을 받아들인다. 이는 다른 바이트스트림을 통해서 읽어들이거나 쓴다는 의미다.

 

** InputStream, OutputStream을 받아들인다는 것은InputStreamOutputStream의 각각의 하위 클래스드을 받아 들일수 있다는 것을 의미한다.

 

  

 

DataOutputStream을 이용한 데이터 파일로 데이터 출력

 

package ch4;

 

import java.io.DataOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

 

public class DataOutputStreamTest {

 

       public static void main(String[] args) {

              FileOutputStream fis = null;

              DataOutputStream dis = null;

              try {

                     fis = new FileOutputStream("data.bin");

                     dis = new DataOutputStream(fis);

                     dis.writeBoolean(true);

                     dis.writeByte((byte) 5);

                     dis.writeInt(100);

                     dis.writeDouble(200.5);

                     dis.writeUTF("hello world");

                     System.out.println("저장했습니다.");

              } catch (Exception ex) {

                     System.out.println(ex);

              } finally {

                     try {

                           fis.close();

                     } catch (IOException e) {

                     }

                     try {

                           dis.close();

                     } catch (IOException e) {

                     }

              }

       }

}

 

 

 

DataInputStream을 이용한 데이터 파일로부터 데이터 출력(읽기)

 

package ch4;

 

import java.io.DataInputStream;

import java.io.FileInputStream;

import java.io.IOException;

 

public class DataInputStreamTest {

 

       public static void main(String[] args) {

              FileInputStream fis = null;

              DataInputStream dis = null;

              try {

                     fis = new FileInputStream("data.bin");

                     dis = new DataInputStream(fis);

                     boolean b = dis.readBoolean();

                     byte b2 = dis.readByte();

                     int i = dis.readInt();

                     double d = dis.readDouble();

                     String s = dis.readUTF();

                     System.out.println("boolean :" + b);

                     System.out.println("byte :" + b2);

                     System.out.println("int :" + i);

                     System.out.println("double :" + d);

                     System.out.println("String :" + s);

              } catch (Exception ex) {

                     System.out.println(ex);

              } finally {

                     try {

                           fis.close();

                     } catch (IOException e) {

                     }

                     try {

                           dis.close();

                     } catch (IOException e) {

                     }

              }

       }

}

 

Posted by Steven J.S Min
,

파일의 내용을 읽어서 출력하는 예제 코드와 비슷하다. 다만 화면으로 출력(System.out.write() = PrintStream.write())하지 않고 FileOutputStream으로 출력하는 부분만 다르다. write()메소드도 모두 OutputStream으로부터 확장된 write메소드를 사용하기 때문에 동일하다.

 

  

package ch4;

 

import java.io.*;

 

public class FileStreamCopy {

 

       public static void main(String[] args) {

              if(args.length != 2){

                     System.out.println("사용법 : java FileStreamCopy 파일1 파일2");

                     System.exit(0);

              } // if end

                          

              FileInputStream fis = null;

              FileOutputStream fos = null;

              try{

                     fis = new FileInputStream(args[0]);

                     fos = new FileOutputStream(args[1]);

                     byte[] buffer = new byte[512];

                     int readcount = 0;

                     while((readcount = fis.read(buffer)) != -1){

                           fos.write(buffer,0,readcount);

                     }

                     System.out.println("파일복사가 완료되었습니다.");

                    

              }catch(Exception ex){

                     System.out.println(ex);

              }finally{

                     try {

                           fis.close();

                     } catch (IOException ex) {}

                     try {

                           fos.close();

                     } catch (IOException ex) {}

              }

       } // main

}

 

 

 

 

 

 

 

Posted by Steven J.S Min
,

자바에서 입출력을 진행하게 되면 내부적으로는 OS에게 부탁해서 물리적 장치인 하드디스크로부터 읽어오게된다. 이때 자바에서 1바이트를 읽어오라고 명령을 내리더라도 인접한 256바이트나 512바이트를 읽어오기때문에 읽어오는 단위는 운영체제의 읽기/쓰기 단위 또는 디스크의 섹터당 구성되어지는 바이트에 따라서 실제로 읽어들이는 다를 수 있다.

 

따라서 1000바이트의 파일을 1바이트씩 읽어오라고 실행하면 내부적으로 512바이트씩 1000번 읽어 온다는 의미가 된다.(이는 파일의 크기가 크거나 많을때 많이 성능 차이를 보일수 있다.) 그러므로 1바이트씩이 아니라 512바이트씩 읽어오게되면 2번만 디스크를 읽어 들이면 되기때문에 상당히 효율적으로 프로그램이 동작하게 되는것이다.

 

 

package ch4;

 

import java.io.FileInputStream;

import java.io.IOException;

 

public class FileView2 {

 

       public static void main(String[] args) {

              if (args.length != 1) {

                     System.out.println("사용법 : java FileView 파일명");

                     System.exit(0);

              } // if end

 

              FileInputStream fis = null;

              try {

                     fis = new FileInputStream(args[0]);

                     int readcount = 0;

                     byte[] buffer = new byte[512];

                     while ((readcount = fis.read(buffer)) != -1) {

                           System.out.write(buffer, 0, readcount);

                     }

              } catch (Exception ex) {

                     System.out.println(ex);

              } finally {

                     try {

                           fis.close();

                     } catch (IOException e) {

                     }

              }

       } // main

}

 

 

 

          int readcount = 0;

       byte[] buffer = new byte[512];

       while ((readcount = fis.read(buffer)) != -1) {

              System.out.write(buffer, 0, readcount);

       }

 

public int read(byte[] b) throws IOException

  APIb의 배열의 길이 바이트만큼 Input Stream으로 부터 읽어서 배열바이트 b에 저장하고 읽은 바이트수를 반환한다. 만일 읽을내용이 없는 경우 -1을 반환한다.

 

PrintStreamSystem.out write(buffer, 0, readcount)메소드는 다음의 API로 명시되어있다.

public void write(byte[] buf, int off, int len)  

buf의 바이트 배열로부터‘off’ offset으로부터 ‘len’바이트를 출력한다.

                  

 

 

 

 

Posted by Steven J.S Min
,

1.     try문에서 사용할 IO클래스를(보통 try문 선언 바로이전에서) 선언한다. 보통 null값을 할당한다.

2.     try블록  안에서 IO클래스 객체를 생성한다.

3.     finally블록 안에서 IO클래스의 close()메소드를 호출하여 자원 사용을 명시적으로 반납한다.

 

Posted by Steven J.S Min
,