Archive for the ‘ Java IO&NIO ’ Category

URL 주소가 가리키는 파일 읽어서 저장

package com.test.url;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class URLSaver {
    public static void main(String[] args) {
        if(args.length != 2) {
            System.out.println("사용법 : java URLSaver URL filename");
            System.exit(1);
        }

        URL url = null;

        try {
            url = new URL(args[0]);
        } catch (MalformedURLException e) {
            System.out.println("잘못된 URL 형식입니다.");
            System.exit(1);
            e.printStackTrace();
        }

        FileOutputStream fos = null;

        try {
            URLConnection urlConnection = url.openConnection();
            InputStream in = urlConnection.getInputStream();

            fos = new FileOutputStream(args[1]);
            byte[] buffer = new byte[512];
            int readcount = 0;

            System.out.println("읽기 시작");
            while((readcount = in.read(buffer)) != -1) {
                fos.write(buffer, 0, readcount);
            }
            System.out.println("파일 저장 완료");
        } catch (IOException e) {
             e.printStackTrace();
        } finally {
            try {
                if(fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

객체 스트림

객체 스트림

객체를 아주 쉽게 전송할 수 있는 방법을 말한다. 객체가 전송된다는 의미는 객체가 내부적으로 참조하는 객체들 역시 함께 전송되는 것을 뜻한다.

객체를 전송하려면 다음과 같은 순서를 거쳐야 한다.

1. 데이터를 특정 통신 채널로 보낼 수 있는 형태로 바꾼다. 이를 마샬링(marshaling)이라고 한다.

2. 변환된 데이터를 전송하거나 쓴다.

3. 변환된 데이터를 읽어 들어 원래의 형태로 변환한다. 이를 언마샬링(unmarshaling)이라고 한다.

마샬링(marshaling)

마샬링이란 데이터를 바이트의 흐름으로 만들어 TCP와 같은 통신 채널을 통해서 전송하거나 스트림으로 써줄 수 있는 형태로 바꾸는 과정을 말한다.

전송

데이터를 발신지에서 목적지로 전달하는 과정을 말한다. 전송을 위해서 객체 스트림은 바이트 기반의 표준 스트림을 이용하게 된다.

네트워크에 대한 전송뿐만 아니라 파일에 쓰기를 할 경우에도 객체 스트림은 바이트 기반의 표준 스트림을 이용하게 된다.

언마샬링

언마샬링이란 마샬링과 반대로, 전송받은 데이터를 원래의 형태로 변환하는 과정을 뜻한다. 그리고 전달받은 데이터는 원래 형태로 변환될 수 있는 충분한 내용을 포함하고 있다.

바이트 단위 IO 클래스

바이트 스트림 클래스는 모두 추상 클래스(abstract class)인 InputStream과 OutputStream의 자식(하위)클래스다.입력과 관련된 모든 바이트 스트림은 InputStream에 있는 메소드를 포함하며, 출력과 관련된 모든 바이트 스트림은 OutputStream에 있는 메소드를 포함한다.

1. InputStream과 OutputStream

InputStream의 중요메소드

int available() throws IOException : 현재 읽을 수 있는 바이트 수를 반환한다.

void close() throws IOException : 입력 스트림을 닫는다.

int read() throws IOException : 입력 스트림에서 한 바이트를 읽어 int 값으로 반환한다. 더 이상 읽어 들여야 할 내용이 없을 경우, -1을 반환한다.

int read(byte buf[]) throws IOException : 입력 스트립에서 buf[] 크기만큼을 읽어 buf에 저장하고, 읽은 바이트 수를 반환한다. 더 이상 읽어 들여야 할 내용이 없을 경우, -1을 반환한다.

int skip(long numBytes) throws IOException : numBytes로 지정된 바이트를 무시하고, 무시된 바이트 수를 반환한다.

- InputStream은 바이트 단위로 입력받기 위한 클래스이다. 그런데 위에 보면 read() 메소드를 통햇 byte형을 반환하는 것이 아니라 int 형을 반환하는 것을 알 수 있다. 그 이유는 byte형으로 반환할 경우, 파일 끝을 나타내는 기호로 사용할 마땅한 값이 없기 때문이다. 이런 이유로 -1을 반환할 수 있는 int 형을 사용하게 된다. 따라서 read() 메소드는 정수 하위 8비트에 실제로 읽어들인 값을 채워서 반환하게 된다.

OutputStream의 중요메소드

void close() throws IOException : 출력 스트림을 닫는다.

void flush() throws IOException : 버퍼에 남은 출력 스트림을 출력한다.

void write(int i) throws IOException : 정수 i의 하위 8비트를 출력한다.

void write(byte buf[]) throws IOException) : buf 배열의 내용을 출력한다.

void write(byte buf[], int index, int size) throws IOException : buf 배열의 index 위치부터 size만큼의 바이트를 출력한다.

-InputStream과 OutputStream 은 추상 클래스이므로 객체를 생성할 수 없다.

System.in을 이용해서 키보드로부터 입력받기

System.in은 표준 입력을 받는다. 표준 입력이란 보통 키보드로부터의 입력을 말한다.

2. FileInputStream과 FileOutputStream

FileInputStream과 FileOutputStream은 각각 InputStream과 OutputStream을 상속받으며, 파일로부터 바이트 단위로 입력을 받고, 대상 파일에 바이트 단위로 출력할 수 있는 클래스다.

FileInputStream과 FileOutputStream의 생성자는 파일명이나 파일 정보가 있는 File 클래스에 대한 객체를 전달받는다. 그리고 FileInputStream의 경우 생성자에 전달한 파일명이 실제로 존재하지 않는 파일명이면, java.io.FileNotFoundException 을 발생시킨다.

3. DataInputStream과 DataOutputStream

DataInputStream과 DataOutputStream은 자바의 기본형 데이터인 int, float, double, boolean, short, byte 등의 정보를 입력하고 출력하는 데 알맞은 클래스다.

DataInputStream은 생성자에 InputStream을 받아들이며, DataOutputStream은 생성자에서 OutputStream을 받아들인다. 이는 다른 바이트 스트림을 통해서 읽어 들이거나 쓴다는 의미다. InputStream을 인자로 받아들인다는 것은 InputStream의 자식이나 자손클래스를 받아들인다는 것이다.

4.ByteArrayInputStream과 ByteArrayOutputStream

BtyeArrayInputStream은 말 그대로 바이트 배열을 차례대로 읽어 들이기 위한 클래스다. ByteArrayOutputStream은 내부적으로 저장공간이 있어서, ByteArrayOutputStream은 내부적인 저장 공간이 있어서, ByteArrayOutputStream에 있는 메소드를 이용해서 출력하게 되면, 출력되는 모든 내용들이 내부적인 저장 공간에 쌓이게 된다. 그 후에 ByteArrayOutputStream에 있는 toByteArray()를 실행하면 , 저장된 모든 내용이 바이트 배열로 반환된다.