상세 컨텐츠

본문 제목

10일. Java - 파일 읽기 , 비트 연산자

수업 일지/Java

by NayC 2021. 3. 4. 09:35

본문

728x90

프로그래머 (구동을 위한 것에 특화) <-> 개발자(developer) (제품 만드는 것에 특화) 

알맹이 <-> 껍데기 (화면 만들기) 

고민 <-> 빨리 찍어내기 

ex) 데이터 분석 서비스를 만들고 싶을 때, 개발자는 '분석 라이브러리', '차트 라이브러리' 등을 찾아서 그냥 만드는.

     프로그래머는 논문도 찾아보고, 함수도 직접 만들고. 

     남의 소스 대신 직접 특제 소스를 만드는 것을 목표로 해보자~

 

비트 연산자.

지금 당장은 필요성을 못 느낄 수 있어도 공부를 더 파면 필요해질 수 있다는 게 요지.

 

입력값의 오류 = 예외의 오류

- 파일 입력 시 예외가 발생 할 수 있음 (파일이 없거나, 파일 읽을 권한이 없거나...)

 

예외 처리하는 방법은 지금 말하면 산으로 간다. 

- 지금은 그냥 빨간 줄에 exception 나오면 첫번째거 클릭하기! 

 

이건 절대경로

절대경로는 바람직하지 않다. (수정하기도 어렵고!)

 

res는 resource 줄임말로 사용한 것, 그리고 ./는 생략 가능해서 'res/img.bmp'라고 써도 됨

Q. 왜 현재위치냐 하면

- 지금 Progrm이라고 소스코드는 src 안에 있지만 -> 이게 '실행되면' (클래스 파일로?) Java Prj 파일로 가게 됨. (지금 여기 사진에서는 보이지 않는데 제일 상위 폴더) 

  -> 실행된거 기준으로! 해야해서 ./res/img.bmp가 된다. 

 

 

 

(여기에 구조 有)

en.wikipedia.org/wiki/BMP_file_format

 

BMP file format - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Windows Bitmap image file format family This article is about the file format. For the data structure/type of image, see Bitmap graphics. The BMP file format, also known as bitmap imag

en.wikipedia.org

32비트. 4바이트 

16비트 - 시그니쳐 

4바이트 - 파일 크기를 말해주고 있다는 것 

내가 읽어들이는거랑 이거랑 크기가 같아야.

4바이트로 읽으려면 어떻게 읽나?

1) 아스키 방식

2) Binary 방식

 

// 숫자가 있는 파일에서 숫자를 읽기
// 12를 읽으면 코드로? 12 그대로? -> 숫자로 읽어야
// "34522"가 아니라 34522로 들어가있다는 뜻
// 문자로 들어가있지 않기 때문에 그대로 숫자로 읽자~! (코드로 읽지 말자)

 

함수 호출될 때마다 read로. 

그걸 합쳐야겠지.

 

4번 읽은 게 file size 

 

어떻게 합쳐서 읽는담?

-> 비트 연산자 활용

 

 

 

여기 설명 놓침

 

4바이트를 읽고 -1이 반환된다

 

새롭게 만들고

int b1 = fis.read(); 

 

1. Eclipse에서 command(windows: control) 키를 누르고 read()를 클릭해서 확인해보니, byte 단위로 입력을 받으며, 더 이상 읽을 데이터가 없을 때 -1을 출력
2. 그럼 read()가 -1을 반환할 때까지 반복문으로 파일을 입력시키면 될 것 같다. 한 byte 단위로 입력하기 때문에 출력하는 시점도 byte 단위로 읽어들이는 그 순간, 순간 해주어야 한다.

출처 : youngjinmo.github.io/2020/06/java-file-io/
1. [0] [0] [1] [0] <-- 각 자리수를 공간이라고 생각하면 4개의 공간을 사용
  컴퓨터는 이 공간하나를 bit라고 정의해서 연산 (So 위에는 4bit로 표현한 것)
  컴퓨터가 사용하는 최소단위인 bit의 연산으로 컴퓨터는 대화. 지금 블로그 화면에 노출되는 모든데이터도 0,1로 표현된 bit들을 연산해 우리가 이해할 수 있는 모습으로 변환된 것
2. 일반적으로 컴퓨터는 8bit의 공간을 기준으로 사용 (1바이트)

[시프트 연산] (뾰족한 곳으로 간다고 암기하잣
1. << 연산
- ex) 3 << 2
       '이진수' 3을 왼쪽으로 두 칸 이동


2. >> 연산
- ex) 16  >> 3
      '이진수' 16을 오른쪽으로 세 칸 이동


출처 : 컴퓨터가 숫자를 표현하는 방법 (vmpo.tistory.com/106)

 

 

논리 연산자, 시프트 연산자 활용

 

ㅡㅡㅡㅡㅡ

 

많은 데이터 보내야 하니 (기본형) 32비트로 보내는건 비효율적. 비트로! (우리는 지금 file size 보내려는데 이게 4바이트니까 기본형을 32비트로 하신듯) 

pos는 정수가 아니라 short형

x, y 값은 8비트면 충분 (200 미만이라면)

x, y 값을 short로 한 번에 표현 (position 나타내는 pos에 담아서)

x = 7 

pos = (7<<8); 

7을 옮겨서 8을 담아야 한다.

short pos니까 16비트에 담는 것

cf) x, y를 따로 int (정수형)에 담아 이동시키면 64비트나 필요하니까. 

   같이 묶어서. 

cf) 상자 하나가 1비트

 

비트 합칠 때 미는 작업이 반드시 필요! 

 

pos 에 들어가기 전에 shift 되서, 

ex) pos = 5;      5가 되입된다는 뜻  (16비트 통째로 써서) 

     pos =(7<<8); 다음에 pos = 5 쓰면 앞에게 날라감. (앞에거 shift 해서 힘들게 움직였는데ㅜ 그냥 5로만 담기는거)

 

pos와 5를 합쳐서 -> pos에 담는 것

앞에거를 유지하면서, 또 5를 담는 방법

 

2개의 바이트를 -> 합치는 작업을 하는 것 

 

체크처럼 만들고 싶은데 어떻게 해야하나!

- 지금 저렇게 해서 나오는 건 [] [] [] [b1] 해서 계속 덮어 씌어지는 형태임

Q. 체크로 나오게 만들기 위해서는? 

- 각각을 -> 하나의 정수로 합치기 

 

JEJ님
정리

1바이트 = 8비트 -> 32비트


Q. Big endion?
    Little Endian?

    이걸 들어본 적이 있나요~ 

-> 비트가 기본 단위가 아니다. (예전부터 8비트가 기본. 즉 1바이트가 기본)

 

컵퓨터는 [] [] [] [] 를 한 번에 옮기는게 아니라, '바이트' 단위로 옮긴다.

 

Big endion 방식 쓰면 [0] [0] [0] [32] 

Little endian 방식은 [32] [0] [0] [0] 

 

고성능 HW CPU는 big 쓰고, 저가형이 small 쓴다 (인텔이 대표적)

-> 우리가 인텔 쓰니 거꾸로 읽어야 함. 

 

ㅡㅡㅡㅡㅡㅡ

 

 

b1 자체가! 32비트

이걸 맨 뒤에다가 넣어야 함

 

8비트가 1바이트인데, 이걸 3번 민다는 것. 3번 가라. 그래서 24비트. 

fileSize = b4 <<24;    |    // [b4] [] [] [] 

             b3 <<16;    |    // [b4] [b3] [] []

             b2 <<8;     |    //  [b4] b3] [b2] [b1]

             b1;

이렇게 똑같이 나오는건 운이 좋은거라고 한당 :) !!!

음수로 나오는 사람도 있고, 다른 숫자가 나오는 사람도 있다. 

 

ㅡㅡㅡㅡㅡ

 

합칠 때 [] [] [] [] 들어갈 자리가 비어져 있어야 함. 

이렇게

-> 방청소를 먼저 해주자

 

// 0~9ABCDEF
// 16진수 -> 4비트 
// 8비트는 2개로 표현 가능 한 것. 0xff (0b11111111 간소화)  cf) 개인의견 : f는 false로 1111인 듯
// 0x0f 는 0b00001111
// 0x07은00000111 (마지막 0111이 7인 것)
// 0x000000은? (이건 24비트를 이용해서 만든 숫자) 

 

추가 my 해석) 

0x -> 16진수. 4비트니까 4개씩 있는거지. 0f는 그래서 8글자고

0x000000ff는 32비트. ff 8비트는 마지막 칸만큼은 청소대신 남겨준 의미. 

 

fileSize는 '4바이트'니까 

8비트씩(1바트) 4개겠지. 

 

 

 

비우기 위해서는 [] [] [] [b4] 뒤에는 b4 8비트는 유지하면서 앞에 24비트를 지우는 방식 -> & 연산자 사용

 

의도적으로 만들어서 & 시킨 것! (0이 다 이겨버리니까)

 

ㅡㅡㅡㅡㅡ

read를 버리고, 

4바이트를 읽어야 함 (File Size)

 

운 없이도 청소를 하면 이렇게 나온다는게 요지~

 

 

cf) 하나씩 출력해본거

맨 위가 보통 1로 시작하면 오류가 많다고 한당 (청소 없이도 숫자가 그대로 나오기 힘들다고 한다.)

 

 

 

 

 

// 다음 시간은 '제어구조' 

  "제어구조는 아예 숙달할 정도로 해야합니다." (안보고 제어문을 잘 쓸 수 있도록) 

 

 

 

 

728x90
반응형

'수업 일지 > Java' 카테고리의 다른 글

추상화 정리 (java)  (0) 2021.04.08
객체지향 정리 (java)  (0) 2021.04.07
따옴표 정리  (0) 2021.03.12
숙지를 위한 연습 문제들 (java)  (0) 2021.03.11
변수 정리  (0) 2021.03.08

관련글 더보기