2018년 10월 9일 화요일

Java DataInputStream, DataOutputStream사용

지금까지 Java의 FileInputStream과 FileOutputStream을 사용해서 파일의 내용을 읽고 쓰기 작업을 진행했다.

지금까지 배운것을(FileInputStream과 FileOutputStream내용) 간단히 요약하자면, 파일의 내용을 읽올때 == 스트림을 통해서 파일의 내용에 있는 문자들을 전부 바이트로 읽어들였다. 그래서 컴퓨터는 이를 해석하여, 우리가 읽을 수 있는 문자로 표현했다.
그리고 이 바이트를 읽어 들이는 방법은 여러가지가 있는데, 우리는 한 바이트씩읽기(read)와 텍스트의 한줄씩 읽기(BufferedInputStream 사용)를 통해서 속도의 차이도 비교했었다.

하지만 텍스트파일의 내용을 조금 더 간편하게 읽어오거나 쓰기가 가능하다.
바로 이번에 소개할 DataInputStream / DataOutputStream이다.

스트림에 바이트 단위로 파일의 내용을 읽어들었다면, 이번에는 자바의 기본 자료형에 맞게 파일의 내용을 집어넣어보자.

이를 통해서 우리는 간편하게 스트림에 바이트로 작성하거나 읽어들일 필요가 없이
자바에서 지원하는 기본 자료형의 크기에 맞게 텍스트들을 넣을 수 있게 된 것이다.

역시 우리는 실습을 통해 살펴보는게 빠르다.

1. DataOutputStream을 통해서 새로운파일 생성 → DataInputStream을 통해서 생성한 파일 읽기

  1. package org.java.project1.subproject;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.DataInputStream;
  5.  
  6. import java.io.DataOutputStream;
  7. import java.io.FileInputStream;
  8. import java.io.FileOutputStream;
  9. import java.io.IOException;
  10.  
  11. interface DataStream{
  12.     public void dataWrite(DataOutputStream out) throws IOException;
  13.     public void dataRead(DataInputStream in) throws IOException;
  14. }
  15. class DataInputStreamExam implements DataStream{
  16.     public static String FileName;
  17.     public int[] arrInt = {123};
  18.     public String[] arrStr = {"one하나""two둘""three셋"};
  19.     public Double[] arrDouble = {1.02.03.0};
  20.    
  21.     @Override
  22.     public void dataWrite(DataOutputStream out) throws IOException{
  23.         for(int i = 0; i< arrInt.length; i++) {
  24.             out.writeInt(this.arrInt[i]);
  25.             out.writeDouble(this.arrDouble[i]);
  26.             out.writeUTF(this.arrStr[i]);
  27.         }
  28.     }
  29.    
  30.     @Override
  31.     public void dataRead(DataInputStream in) throws IOException{
  32.         String fileContent = "";
  33.         for(int i = 0; i < arrInt.length; i++) {
  34.             fileContent += in.readInt();
  35.             fileContent += in.readDouble();
  36.             fileContent += in.readUTF();
  37.         }
  38.         System.out.println(DataInputStreamExam.FileName + "의 내용 : " + fileContent);
  39.     }
  40.     public void fileRead(DataInputStreamExam obj) throws IOException{
  41.        
  42.     }
  43.     public void fileWrite(DataInputStreamExam obj) throws IOException {
  44.        
  45.     }
  46.    
  47. }
  48. class DataInputStreamExamInfo extends DataInputStreamExam{
  49.    
  50.     public DataInputStreamExamInfo(String FileName) {
  51.         DataInputStreamExam.FileName = FileName;
  52.        
  53.     }
  54.     @Override
  55.     public void fileRead(DataInputStreamExam obj) throws IOException{
  56.         obj.dataRead(new DataInputStream(new BufferedInputStream(new FileInputStream(DataInputStreamExam.FileName))));
  57.     }
  58.     @Override
  59.     public void fileWrite(DataInputStreamExam obj) throws IOException{
  60.         obj.dataWrite(new DataOutputStream(new FileOutputStream(DataInputStreamExam.FileName)));
  61.     }
  62.    
  63. }
  64.  
  65. public class Exam{
  66.     public static void main(String[] args) throws IOException {
  67.         DataInputStreamExam in = new DataInputStreamExamInfo("dataStream.txt");
  68.         in.fileWrite(in);
  69.         in.fileRead(in);
  70.     }
  71. }

▶실행결과
dataStream.txt의 내용 : 11.0one하나22.0two둘33.0three셋



이로써 자바의 기본형으로 바이트로 읽기가 쓰기작업 없이 자동으로 데이터형을 맞춰주어서 편리하게 사용가능했다. 파일의 내용을 한번 살펴볼까?


▶실행파일결과











왜 파일이깨지는가.. 잘못된거같다.. 라고 생각할 수 있으나 당연한것이다.
텍스트의 내용을 바이트단위로 처리해줄때 어떠한 인코딩 형태로 해주었는지에 따라 값이 다르게 나오고 또한 텍스트 파일의 크기도 달라지게 되있다.

그래서 다음시간에는 인코딩형태에따라 파일크기 및 데이터들이 어떻게 저장되는지 살펴보겠다. OutputWriter / InputReader에 대해서 살펴보도록하자.




댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...