TIL / JAVA 4주차(1) / 입력과 출력 / 입출력 Stream / File 클래스

병아리코더 아카이브·2023년 9월 6일

JAVA

목록 보기
12/20
post-thumbnail

입력과 출력(JAVA I.O)

  • JAVA I.O 는 Input 과 Output 이다

  • Java 에서는 시스템 외부로부터의 data 도 다룰 수 있다.

  • 시스템 안밖으로 이동하는 data 의 흐름을 Stream 이라고 한다.
    자바는 파일이나 콘솔의 입출력을 Stream 이라는 흐름을 통해 다룬다.
    즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 한다.

대략 데이터를 마시고 뱉는 빨대 역할로 이해할 수 있다.


InputStream / OutputStream

  • Java.io package 는 크게 InputStream 과 OutputStream 으로 나뉜다

  • InputStream 은 외부에서 파일을 읽어올 때 사용하고
    OutputStream 은 파일을 외부로 내보낼 때 사용한다.

  • 자바에서 스트림 생성은 스트림 클래스 타입의 인스턴스를 생성한다는 의미다.

  • 바이트 기반과 문자 기반으로 분류가 된다.

바이트 기반 Stream

  • InputStream / OutputStream 아래 하위 클래스들은 각 특화된 분야들이 있다.
    그래서 직접 최상위 클래스를 사용하는 경우는 드물다.

  • FileInputStream( ) 생성자와 FileOutputStream( ) 생성자의 매개변수 안에는 들어올 스트림의 경로와 내보낼 스트림의 경로를 지정해줘야 한다.
    이때 문자열로 직접 지정도 가능하지만 File 객체가 담긴 변수를 저장하는 방법도 있다.

FileOutputStream( ) 는 보낼 경로에 파일을 생성해준다.
이때 FileOutputStream( 경로,true ) 를 통해 새로 파일을 추가하지 않고 기존 파일의 끝에 내용을 추가할지 지정해줄 수 있다.

문자 기반 Stream

  • char 형은 2바이트다. 그래서 자바에서는 문자 기반의 스트림을 별도로 제공하고 있다.

InputStream

  • read( ) 메서드를 이용하여 입력 스트림으로부터 다음 바이트를 읽는다.

  • read( ) 메서드는 해당 입력 스트림에서 더이상 읽어드릴 바이트가 없으면 -1을 반환한다.
    이때 byte 는 0~255 까지의 정보라 -1 이 표현이 안되서 read( ) 메서드의 반환타입은 int 형이다.

  • 한 바이트씩 받는 방식을 사용하면 안정적이나 속도가 느리다는 단점이 있다.

  • 네트워크에서 파일을 전송 시에 사용한다. ( 안그러면 깨짐 )

  • byte[ ] 배열을 매개변수로 사용시 미리 공간을 지정해놓고 특정 바이트를 읽어들인 후 배열에 저장한다.

  • 한번에 배열로 쭉 가져와서 Outstream 에 쭉 내보내기 때문에 속도가 빠르다는 장점이 있다.


OutputStream

  • write( ) 메서드를 이용하여 출력 스트림에 특정 바이트를 저장한다.

  • 이 때 byte[ ] 를 사용하면 배열 길이만큼 해당 출력 스트림에 저장한다. 그래서 하나씩 출력 스트림에 저장하는 것보다 속도가 빠르다.

출처 : https://www.tcpschool.com/java/java_io_stream



보조스트림

  • 보조 스트림은 다른 스트림과 연결되어 추가 기능을 제공해주는 스트림이다.
  • 주스트림에 보조스트림을 추가할 때는 주스트림의 변수를 보조스트림에 넣어서 탑승하여 사용한다.

여기서 InputStreamReader 은 바이트 스트림을 문자로 변환해 주는 보조 스트림이다.

  • 보조스트림에는 많은 종류가 있지만 그 중 자주 사용하는 것들 3가지를 정리하였다.

Buffered 보조스트림

  • buffer 는 전송 받은 내용들을 모아서 한꺼번에 전송할 수 있도록 해주는 임시 저장소이다.

  • buffer 보조 스트림 생성시 8192 byte(i/o) 또는 8192(r/w) 자의 저장소가 생긴다.

  • 앞서 byte[] 배열을 사용한 것도 Buffered 의 일종이다.

  • 주스트림의 read() close()는 사용이 동일하다.

Data 보조스트림

  • 스트림은 기본 자료형 타입의 데이터를 전송할 수 없다. 그래서 나온 것이 Data 보조 스트림이다.

  • 자료형 별 메서드가 존재한다.

  • 자료 사용시 메서드 순서대로 읽어가야 한다.
  • writeUTF( ) 를 사용하여 사용자로부터 입력받은 데이터를 .dot 파일로 전송한다.
  • 그리고 다시 그 .dot 파일을 readUTF( ) 로 읽어온다.
    이때 앞서 말했듯이 보낸 순서대로 전부 읽어야 한다.
    그래서 필요 없는 정보까지도 꼭 읽어야 하는 단점이 존재한다.
  • 여기서는 회원가입에 writeUTF( ) 를 이용하여 파일을 생성했고 로그인에 readUTF( ) 를 이용하여 파일 안의 데이터와 입력받은 값이 동일하면 로그인이 되도록 하였다.
  • 회원가입시에는 아이디의 중복여부를 파일이 존재하는지로 체크하였고,
    로그인시에는 존재하는 아이디일 시에만 비밀번호가 동일한지 여부를 확인하도록 작동을 하게 하여 아이디와 비밀번호의 일치여부를 체크하였다.

Object 보조스트림

  • Data 로 모든 타입의 데이터를 보낼 수는 없다
  • 그래서 최상위 객체인 Object 를 다룰 수 있는 보조 스트림이 필요하다.
  • Object 보조 스트림에는 객체 , 배열 , 컬렉션 등 다양한 데이터 형태가 들어갈 수 있다.
  • Class 객체의 경우에는 직렬화 ( serialize ) 를 하지 않으면 전달 되지 않는다.


File

  • 파일 및 디렉터리( 폴더 ) 에 관한 작업을 할 수 있는 클래스이다.
    ( 스트림을 통해서는 파일의 제거 및 폴더에 관한 작업을 수행할 수 없다. )

  • File file = new File(저장할 경로); 를 이용하여 객체를 생성한다.

File 클래스의 메서드

  • mkdir( ) : 지정된 경로에 폴더 하나를 생성하고 true/false 를 반환한다.

  • mkdirs( ) : 폴더를 여러개 생성시 사용한다. 상/하위 폴더까지 만들 때 쓰인다.

  • exists( ) : 지정한 경로에 해당 파일이 존재하는지 true/false

  • createNewFile( ) : 지정한 경로에 파일을 생성한다.

  • listFiles() : 지정한 경로 안에 있는 여러개 파일을 File[ ] 배열로 저장한다.

  • 이러한 File[ ] 배열 안의 파일 정보들을 꺼내 사용하기 위해 HashMap 과 그 HashMap 을 담을 ArrayList 컬렉션을 사용한다.

  • 향상된 for 문을 통해 File을 하나씩 꺼내고 메서드를 이용해 정보를 얻어 생성한 HashMap 객체에 그 정보들을 담고(put) 객체를 ArrayList 에 저장한다.

  • 이때 HashMap 객체를 매번 생성하는 이유는 하나의 HashMap 객체를 사용하면 마지막 파일의 정보로만 덮어쓰여지기 때문이다.

  • isDirectory( ) : 지정된 경로에 폴더가 존재하는지 true/false

  • getName( ) : 지정한 경로의 파일 또는 디렉토리 이름

  • length( ) : 지정한 경로의 파일의 크기(byte)

  • isHidden( ) : 파일이 숨겨져있는지 true/false

  • 이렇게 만들어진 ArrayList 를 result.jsp 페이지에 전송하고
    JSTL 의 태그를 이용하여 폴더의 이동 및 파일의 정보를 출력할 수 있도록 만들었다.


etc

ip로 다른 컴퓨터에서 접속하는 방법

참고 :
https://4sii.tistory.com/3
http://webprogramming.co.kr/admins_blog/1397

Java API 소스 보는 방법

  • src.zip 파일

0개의 댓글