JAVA/Java IO: 19개의 글
사내에서 운영중인 웹서비스의 로그에서 아래와 같은 Exception이 다량으로 발견되는 것을 확인하였다. 혹시 서비스에 중요한 영향을 미치지 않을까하는 걱정이 앞서 예외가 발생하는 원인을 살펴보았다. java.lang.Object ㄴ java.lang.Throwable ㄴ java.lang.Exception ㄴ java.io.IOException ㄴ org.apache.catalina.connector.ClientAbortException org.apache.catalina.connector.ClientAbortException ClientAbortException은 애플리케이션에서 발생하는 것이 아닌, Tomcat 컨테이너에서 특정 상황에서 발생하는 예외였는데 특이한 부분은 HTTP Request의 H..
참조문서 : https://docs.oracle.com/javase/8/docs/api/java/io/package-frame.html io 부분에서 JDK 1.4 이전 방식을 클래식 I/O 라고 하고, 이후 방식을 NIO(Non-blocking I/O)라고 한다. 이제는 클래식 IO를 사용한다 해도 내부적으론 NIO를 활용하기 때문에 성능차이는 크게 없다. 1. java에서 I/O란? I/O를 스트림(Stream)이라고 부르기도 한다. 접두어로 in, read 가 붙으면 입력관련이고, out, write 가 붙으면 출력관련이다. 데이터를 읽고 쓰는 대상으로는 디스크, 사용자 입출력, 네트워크 등이 있다. 읽기 전용쓰기 전용 1 Byte 단위 처리 InputStream OutputStream 2 Byte..
Externalizable 인터페이스 Externalizable 인터페이스는 Serializable 인터페이스를 확장한 형태로 세부적인 필드를 직접 제어할 수 있는 트정이 있다. transient 키워드를 사용하여 특정 필드를 제외시키는 것도 가능하지만 좀 더 세부적인 작업이 필요할 때 Externalizable 인터페이스를 사용할 수 있다. [JAVA/Java IO] - [JAVA] Serializable 과 transient 1. Externalizable 인터페이스 Externalizable 인터페이스를 사용하면 객체 스트림을 통하여 객체를 읽고 쓸 때 내부의 내용을 자유롭게 조작하면서 원하는 내용을 출력할 수 있도록 도와준다. 이를 위해서 이 인터페이스는 Serializable 인터페이스를 확장하..
Serializable 과 transient (1) Serializable 데이터를 파일에 쓰거나, 네트워크를 타고 다른 곳에 전송할 때는 데이터를 바이트 단위로 분해하여 순차적으로 보내야 한다. 이것을 직렬화(Serialization)라고 한다. 기본 자료형(boolean, char, byte, short, int ,long, float, double)은 정해진 바이트의 변수이기 때문에 바이트 단위로 분해하여 전송한 후 다시 조립하는데 문제가 없다. 하지만 객체의 크기는 가변적이며, 객체를 구성하는 자료형들의 종류와 수에 따라 객체의 크기는 다양하게 바뀔 수 있다. 이런 객체를 직렬화 하기 위해서 Serializable 인터페이스를 구현하게 된다. [JAVA] 객체 직렬화 ObjectInputStrea..
serialVersionUID 이란? Warning 해결하기 객체를 파일에 쓰거나 전송하기 위해서는 직렬화를 해야 하는데 그러기 위해 객체 클래스에 Serializable 인터페이스를 implements 하게 된다. [JAVA] 객체 직렬화 ObjectInputStream / ObjectOutputStream 하지만 Serializable 인터페이스를 implements 하게 되면 노란색 Warning이 발생한다. The serializable class *** does not declare a static final serialVersionUID field of type long 저렇게 Warning이 발생하지만 동작하는데는 문제가 없다. 그래도 계속 저렇게 Warning이 떠있는데 왜 생기는 것이며 ..
객체 직렬화 ObjectInputStream / ObjectOutputStream 객체 스트림은 프로그램 메모리상에 존재하는 객체를 직접 입출력해 줄 수 있는 스트림으로 현재 상태를 보존하기 위한 영속성을 지원할 수 있다. 자바에서 객체 안에 저장되어 있는 내용을 파일로 저장하거나 네트워크를 통하여 다른 곳으로 전송하려면 객체를 바이트 형태로 일일이 분해해야 한다. 이를 위하여 객체를 직접 입출력 할 수 있도록 해주는 객체 스트림이다. 1. 객체 전송의 단계 객체를 분해하여 전송하기 위해서는 직렬화(Serialization) 되어야 한다. 객체를 전송하기 위해서는 3가지 단계를 거친다. (1) 직렬화된 객체를 바이트 단위로 분해한다. (marshalling)(2) 직렬화 되어 분해된 데이터를 순서에 따라..
I/O Char 와 Encoding 데이터는 다양한 종류가 있다. 이미지, 오디오, 비디오, 바이너리 파일 등이 있지만 가장 많이 사용하는 것은 문자이다.따라서 문자의 형태를 직접 읽고 쓰기 위한 클래스가 제공되는데 이때 인코딩(Encoding)이 사용된다. 1. ASCII 코드와 한글 자바는 영미권에서 만들어져서 영어로 입출력할 때는 문제가 없지만 제 3의 언어로 입출력을 실행하면 문제가 발생하는 경우가 많다. 이것은 각 문자의 인코딩과 관련 문제이다. (1) ASCII 코드 영어를 사용할 때는 알파벳 소문자 대문자 52개의 문자와 10진수 숫자 10개가 필요하다. 그리고 쉼표, 따옴표, 물음표 등등의 문장 부호들이 60개 정도가 지정되어 있다.따라서 영어를 사용하기 위해서는 120개 정도의 개수가 필..
I/O 입출력 클래스의 종류 JAVA의 I/O는 java.io 패키지에 클래스가 정의되어 있는 경우가 대부분이다. (최근에는 nio 등이 나왔다.) JAVA의 초기에는 입출력 클래스도 단순하였다. 단순히 바이트 단위의 입출력만 지원했지만, 현재는 계속적으로 확장되며 문자 단위의 입출력 뿐만 아니라 다양한 기능을 지원하는 클래스들이 생겨났다. 1. I/O 클래스의 이름과 의미 Stream으로 끝나는 클래스 : 바이트 단위로 입출력을 수행하는 클래스Reader / Writer로 끝나는 클래스 : 캐릭터 단위로 입출력을 수행하는 클래스File로 시작하는 클래스 : 하드디스크의 파일을 사용하는 클래스Data로 시작하는 클래스 : 자바의 원시 자료형을 출력하기 위한 클래스Buffered로 시작하는 클래스 : 시스..
문자 Stream : BufferedReader / BufferedWriter (파일 복사 예제) BufferedReader / BufferedWriter는 문자 입력 스트림으로부터 문자를 읽어 들이거나 문자 출력 스트림으로 문자를 내보낼 때 버퍼링을 함으로써 문자, 문자 배열, 문자열 라인 등을 보다 효율적으로 처리할 수 있도록 해준다. InputStreamReader / OutputStreamWriter를 사용하는 경우는 한 문자씩 읽지만 버퍼링을 하게 되면 입출력 스트림으로부터 미리 버퍼에 데이터를 갖다 놓기 때문에 보다 효율적으로 입출력할 수 있다. BufferedReader / BufferedWriter는 BufferedInputStream / BufferedOutputStream과 기능이 비슷..
문자 Stream : FileReader / FileWriter File Reader와 FileWriter는 파일에 저장된 바이트를 유니코드 문자로 변환해서 읽어 들이거나 출력할 유니코드 문자를 디폴트 문자 인코딩의 바이트로 변환해서 파일에 저장하는 데 사용되는 입출력 클랙스이다. File Reader와 FileWriter는 각각 InputStreamReader나 OutputStreamWriter의 하위 클래스로 유니코드 문자와 바이트간의 변환 기능을 포함하고 있다. [JAVA] 문자 Stream : Reader / Writer[JAVA] 문자 Stream : InputStreamReader / OutputStreamWriter * FileReader / FileWriter 의 생성자 FileReader..