04 입출력

프로그래밍/Java 2007. 11. 27. 13:29 Posted by galad

★ OutputStream 클래스와 InputStream 클래스
① 바이트 스트림의 입출력에 필요로 되는 다양한 메소드를 제공하는 추상 클래스(개체생성못함)
② OutputStream 클래스 : 바이트 스트림을 출력하는 기능
③ OutputStream 클래스의 주요 메소드

   void close() throws IOException      출력 스트림을 닫는다
   void flush() throws IOException      버퍼에 남아 있는 출력 스트림을      모두 출력
   void write(int i) throws IOException  정수 i의 하위 8비트를 출력
   void write(byte buffer[]) throws IOException    buffer의 내용을 출력


★ InputStream 클래스 : 바이트 스트림으로부터 데이터를 읽어 들인다
InputStream 클래스의 주요 메소드

int available()      현재 읽기 가능한 바이트의 수를 반환
void close()        입력 스트림을 닫는다
int read()            입력 스트림으로부터 한 바이트를 읽어 int
                         값으로 반환한다. 더 이상 읽을 값이 없을 경우 –1을 반환
int read(byte buffer[])     입력 스트림으로부터 buffer[] 크기만큼을 읽어 buffer 배열에

                                    저장하고 읽은 바이트 수를 반환
int read(byte buffer[], int offset, int numBytes)     입력 스트림으로부터 numBytes 만큼을

                                                                     읽어buffer[]의  offset 위치에 저장하고

                                                                      읽은 바이트 수를 반환
int skip(long numBytes)       numBytes로 지정된 바이트를 스킵(skip)하고

                                        스킵된 바이트 수를 반환



/******************************************************************************
*   파일      : InputOutputStreamTest.java
*   용도      : InputOutputStreamTest를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;


public class InputOutputStreamTest
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String args[]) throws IOException
    {
        System.out.println("아무 글이나 입력하시고 Enter를 쳐주세요");
        System.out.println(" 's'를 입력하면 프로그램이 종료됩니다.");
       
        int ch;
       
        // InputStream은 추상 클래스여서 new로 instance 생성 불가
        InputStream in = System.in;          // 표준 입력 - 키보드
        OutputStream out = System.out;   // 표준 출력 - 모니터
       
        // read()는 '한 문자씩' 입력 받으나, 키보드 버퍼에 저장되어있는 것을

        // while문을 돌면서 차례로 입력받는다.
        while((ch = in.read()) != -1)
        {
            if(ch == 's' || ch == 'S')
                break;
           
            // write()는 일단 화면 버퍼에 출력하고, 화면 버퍼가 어느 정도 차거나

            // 화면에 출력해도 괜찮을 때 출력한다.
            // 따라서 'aaaaas'와 같이 입력해도 'aaaaa'는 화면 버퍼에 있는 상태에서

            // 's'를 만나서 프로그램이 종료되므로
            // 화면에는 아무것도 나오지 않는다.
            out.write(ch);
           
            // 한글은 깨진다. print() 메소드 자체가 한글을 처리하기 위해 가공하므로,
            // 한글 문자 정보의 일부분인 ch가 가공되어 제대로 출력되지 않는다.
            //System.out.print((char)ch);
           
            //System.out.println("Char: "+(char)ch+", Available: "+in.available());
        }
    }
}



/******************************************************************************
*   파일      : FileInputOutputStreamTest.java
*   용도      : FileInputOutputStream을 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;


public class FileInputOutputStreamTest
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String[] args)
    {
        /*if(args.length < 2)
        {
            System.out.println("원본 파일과 복사될 파일의 이름을 입력하십시요!");
            System.exit(-1);
        }*/
       
        BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
        String ori = null;
        String copy = null;
       
        System.out.print("원본 파일의 이름을 입력하세요 >> ");
       
        try
        {
            ori = brIn.readLine();
        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
       
        System.out.print("복사될 파일의 이름을 입력하세요 >> ");
       
        try
        {
            copy = brIn.readLine();
        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
       
        int i, len=0;
       
        InputStream in=null;
        OutputStream out=null;
       
        //System.out.println("원본파일 : "+args[0]);
        //System.out.println("목표파일 : "+args[1]);
        System.out.println("원본파일 : " + ori);
        System.out.println("목표파일 : " + copy);       
       
        try
        {
            //in = new FileInputStream(new File(args[0]));
            //out = new FileOutputStream(args[1], true);
            in = new FileInputStream(new File(ori));
           
            // 두번째 true 옵션은 같은 이름의 파일이 있으면 그 파일의 끝에 붙여넣는다.
            out = new FileOutputStream(copy, true);
        }
        catch(FileNotFoundException e)
        {
            System.out.println(e);
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
       
        byte buffer[] = new byte[256];
       
        try
        {
            //while((i=in.read()) != -1)    // 이건 1바이트씩 읽어들이는 것
            while((i=in.read(buffer)) != -1)    // 이건 256 바이트씩?
            {
                out.write(buffer,0,i);
                //System.out.write(buffer,0,i); // 화면에 출력한다.
                len += i;
            }
           
            in.close();
            out.close();
           
            System.out.println(len + " bytes are copied...Successfully!");
        }
        catch(IOException e1)
        {
            System.out.println(e1);
        }
    }
}




/******************************************************************************
*   파일      : FakeXCopy.java
*   용도      : FakeXCopy
*   작성자   : 성홍제
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;


public class FakeXCopy
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String[] args)
    {
//        BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
        File f = null;
        String ori = null;
        String dest = null;
/*       
        System.out.print("원본 파일의 이름을 입력하세요 >> ");
       
        try
        {
            ori = brIn.readLine();
        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
       
        System.out.print("복사될 파일의 이름을 입력하세요 >> ");
       
        try
        {
            dest = brIn.readLine();
        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
*/       
        ori = "d:\\Test\\";
        dest = "d:\\Test_Test\\";
       
        System.out.println("원본파일 : " + ori);
        System.out.println("목표파일 : " + dest);
       
        f = new File(ori);
       
        if(!f.exists())
        {
            System.out.println("디렉토리가 존재하지 않습니다.");
            System.exit(0);
        }
   
        if(f.isDirectory())
        {
            // 현재 디렉토리의 디렉토리, 파일 리스트
            File[] fileList = f.listFiles();
           
            for(int j = 0; j < fileList.length; j++)
            {
                if(fileList[j].isDirectory())
                {
                    // 디렉토리 체크
                    checkDir(fileList[j], dest);
                }
                else
                {
                    // 파일 복사
                    copyFile(fileList[j], dest);
                }
            }
           
            //checkDir(f, dest);    // 기본 디렉토리까지 복사한다.
        }
    }
   
    public static void copyFile(File file, String str)
    {
        int i, len=0;
        InputStream in=null;
        OutputStream out=null;
       
        // 파일 복사
        try
        { 
            in = new FileInputStream(file);
           
            // 두번째 false 옵션은 같은 이름의 파일이 있으면 덮어쓴다.
            out = new FileOutputStream(str + file.getName(), false);
        }
        catch(FileNotFoundException e)
        {
            System.out.println(e);
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
       
        byte buffer[] = new byte[4096];
       
        try
        {
            //while((i=in.read()) != -1)    // 이건 1바이트씩 읽어들이는 것
            while((i=in.read(buffer)) != -1)    // 이건 4096 바이트씩
            {
                out.write(buffer,0,i);
                //System.out.write(buffer,0,i); // 화면에 출력한다.
                len += i;
            }
           
            System.out.println(len + " bytes are copied...Successfully!");
        }
        catch(IOException e1)
        {
            System.out.println(e1);
        }
        finally
        {
            try
            {
                in.close();
                out.close();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }           
        }
    }
   
    /*************************************************
    * Purpose       : 재귀호출로 디렉토리를 체크한다.
    * Return         : void
    * Parameter    : File file - 체크할 디렉토리, String str - 현재 경로
    *************************************************/
    public static void checkDir(File file, String str)
    {
        // 재귀호출로 현재 디렉토리가 계속 갱신된다. !!!!!
       
        // 목표 디렉토리로 변경
        file.renameTo(new File(str + file.getName() + "\\"));
       
        // 디렉토리 생성
        if(file.mkdirs())
        {
            //System.out.println("디렉토리 생성 성공");
        }
       
        // 디렉토리니까 다시 체크
        File[] fileList = file.listFiles();
       
        for(int j = 0; j < fileList.length; j++)
        {
            if(fileList[j].isDirectory())
            {
                // 디렉토리 체크
                checkDir(fileList[j], str);
            }
            else
            {
                // 파일 복사
                copyFile(fileList[j], str);
            }
        }
    }
}




/******************************************************************************
*   파일      : CopyDir.java
*   용도      : CopyDir - 강사님이 작성한 것
*   작성자   : 김종식
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;

public class CopyDir
{
    /// Fields
    /// Constructor
    /// Method
    public static void copyDirectory(File source , File target) throws IOException
    {
        //디렉토리인 경우
        if (source.isDirectory())
        {
            //복사될 Directory가 없으면 만듭니다.
            if (!target.exists())
            {
                target.mkdir();
            }
           
            String[] children = source.list();
           
            for (int i=0; i<children.length; i++)
            {
                copyDirectory(new File(source, children[i]),new File(target, children[i]));
            }
        }
        else
        {
         //파일인 경우
            InputStream in = new FileInputStream(source);
            OutputStream out = new FileOutputStream(target);
           
            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
           
            while ((len = in.read(buf)) > 0)
            {
                out.write(buf, 0, len);
            }
           
            in.close();
            out.close();
        }
    }
   
    /// Main Method       
    public static void main(String[] args) throws IOException
    {
        if ( args.length < 2)
        {
            System.out.println("복사할 원본과 대상을 지정하세요.");
            System.exit(-1);
        }
       
        File source = new File(args[0]);
        File target = new File(args[1]);
       
        copyDirectory(source , target);
    }   
}

'프로그래밍 > Java' 카테고리의 다른 글

04 ObjectOutputStream / ObjectInputStream 클래스  (0) 2007.11.27
05 3일째...  (0) 2007.11.27
03 임시파일  (0) 2007.11.27
02 파일 클래스  (0) 2007.11.27
01 입출력 개요  (0) 2007.11.27