14. Input and Output

ÀÔÃâ·Â½ºÆ®¸² µµ½ºÃ¢¿¡¼­ ÀÔ·ÂÀ» ¹Þ°í °á°ú¸¦ Ãâ·ÂÇϰíÀÚ ÇÒ¶§´Â Ç¥ÁØÀÔ·Â(System.in), Ç¥ÁØÃâ·Â(System.out) À» »ç¿ëÇÑ´Ù. ÆÄÀÏÀ» ÀÐ°í ¾²±â À§Çؼ­´Â ÆÄÀÏÀÔÃâ·Â, ³×Æ®¿÷À» °æÀ¯ÇϰíÀÚ ÇÒ¶§´Â ³×Æ®¿÷ÀÔÃâ·ÂÀÌ ÇÊ¿äÇÏ´Ù.
ÀÚ¹Ù¿¡¼­´Â ¼øÂ÷ÀûÀÎ ÀÔÃâ·Â°ú ºñ¼øÂ÷ÀûÀÎ ÀÔÃâ·ÂÀ» Áö¿øÇÑ´Ù. ÈçÈ÷ ¼øÂ÷ÀûÀÎ ÀÔÃâ·ÂÀ» Stream À̶ó ºÎ¸£±âµµ ÇÑ´Ù. ÀÌ ¸»¶æÀº ¹æÇâÀÌ ÀÖ´Â ÇϳªÀÇ µ¥ÀÌŸÀÇ È帧À¸·Î º¸Åë 8ºñÆ®·Î ±¸¼ºµÈ µ¥ÀÌÅ͵éÀÇ È帧À» ¶æÇÑ´Ù. ½ºÆ®¸²Å¬·¡½º¿¡´Â ¹ÙÀÌÆ®½ºÆ®¸²Å¬·¡½º¿Í ¹®ÀÚ½ºÆ®¸²Å¬·¡½º°¡ ÀÖ´Ù. java.io ÆäŰÁöÀÇ ´ëºÎºÐÀº À̰͵éÀÌ¸ç ¹ÙÀÌÆ®½ºÆ®¸²Å¬·¡½º´Â InputStream , OutputStream À¸·Î ³¡³ª¸ç ¹®ÀÚ½ºÅ©Æ®¸²Å¬·¡½º´Â Reader, Writer ·Î ³¡³ª°Ô µÈ´Ù. ¿ÀÁ÷ RandomAccessFile Ŭ·¡½º¸¸ÀÌ ºñ¼øÂ÷ÀûÀÎ È帧, Áï ÀÓÀÇ·Î ÆÄÀÏÀÇ ¿øÇÏ´Â À§Ä¡¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â ¸Þ¼Òµå¸¦ Áö¿øÇÑ´Ù.

File Class ÀÌ Å¬·¡½º´Â ½ÇÁ¦·Î ·ÎÄøӽſ¡ ÆÄÀÏÀ» »ý¼ºÇÏÁö ¾Ê´Â´Ù. ´ÜÁö File °´Ã¼¸¦ »ý¼ºÇÒ »ÓÀÌ´Ù.
»ý¼ºÀÚ´Â

public File(String path)
public File(String path, String name)
public File(File dir, String name)

Áö¿øÇÏ´Â ¸Þ¼Òµå´Â isFile(), canRead(), getAbsolutePath(), getCanonicalPath(), getName(), getPath(), getParent() .. µîµîÀÌ ÀÖ´Ù. »ç¿ë¹ýÀº ÀÚ¹Ù¹®¼­¸¦ Âü°íÇÏ±æ ¹Ù¶õ´Ù.

RandomAccessFile Class ÀÌ Å¬·¡½º´Â ¿©·¯¸ð·Î À¯¿ëÇÏ´Ù. À̰ÍÀº ¼øÂ÷ÀûÀÎ È帧ÀÌ ¾Æ´Ñ ÆÄÀÏÀÇ ÀÓÀÇÀÇ À§Ä¡ºÎÅÍ ÆÄÀÏÀ» Àаųª ÀúÀåÇÒ ¼ö°¡ ÀÖ´Ù. ¹°·Ð Á÷Á¢ÀûÀ¸·Î Áö¿øÇÏ´Â ¸Þ¼Òµå´Â ¾øÁö¸¸ ´Ù¸¥ ¸Þ¼Òµå¸¦ ¾à°£¸¸ ÀÀ¿ëÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¸é ÆÄÀÏÀÇ ¾ÕºÎºÐºÎÅÍ ¿øÇÏ´Â À§Ä¡¸¦ ¾Ë¾Æ³»±â À§Çؼ­´Â seek(long pos) ¸¦ ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¸é µÇ°í, µÞºÎºÐºÎÅÍ À§Ä¡¸¦ ÆÄ¾ÇÇÒ·Á¸é ¸ÕÀú length() ¸¦ ÀÌ¿ëÇØ ±æÀ̸¦ ¾Ë¾Æ³½ÈÄ Àû´çÇÑ offset ¸¦ ÁöÁ¤ÇØ À̰ÍÀ» seek(long pos) ·Î ã¾Æ³»¸é µÈ´Ù.
»ý¼ºÀÚ´Â

public RandomAccessFile(String name, String mode)
public RandomAccessFile(File file, String mode)

¿©±â¿¡¼­ mode ·Î´Â 'r', 'w', 'rw' °¡ ÀÖ´Ù. ÁöÁ¤ÇÑ °Í¿¡ µû¶ó Àаí, ¾²±â ±â´ÉÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù.
Áö¿øÇÏ´Â ¸Þ¼Òµå´Â DataOutput, DateInput ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϱ⠶§¹®¿¡ ´Ù¾çÇÑ ¸Þ¼Òµå°¡ ÀÖ´Ù. ´ëÇ¥ÀûÀÎ °ÍÀ¸·Î´Â readByte(), readInt(), readChar... read(byte[] b, int off, int len), seek(long pos), readLine() À̿ܿ¡ ¿ªÀ¸·Î writeXXX °¡ ÀÖ¾î ¾²ÀÓ»õ°¡ ´Ù¾çÇÏ´Ï ²Ä²ÄÈ÷ ¸Þ¼Òµå¸¦ ÀÍÈ÷±â ¹Ù¶õ´Ù.

InputStream Class ½ºÆ®¸²±¸Á¶¸¦ ³ªÅ¸³»´Â ¿©·¯°¡Áö Ŭ·¡½ºµéÀº ¸ðµÎ InputStream À̳ª OutputStream Ŭ·¡½º¸¦ »ó¼ÓÇØ¼­ ¸¸µç´Ù. µû¶ó¼­ ÀÌ Å¬·¡½ºÀÇ ¸ðµç ¸Þ¼Òµå¸¦ Ȱ¿ëÇÏ°í ±¸ÇöÇÒ ¼ö°¡ ÀÖ´Ù. ÀÌÁ¦ ¹ÙÀÌÆ®½ºÆ®¸²Å¬·¡½º¸¦ »ìÆìº¸ÀÚ.

InputStream : 
  ¸ðµç ¹ÙÀÌÆ®½ºÆ®¸² ÀԷ Ŭ·¡½ºÀÇ ºÎ¸ð Ŭ·¡½º·Î Ãß»óŬ·¡½ºÀÌ´Ù.
  ... available(), read(), read(byte[] b), read(byte[] b, int offset, int len), close(), seek() ...
ByteArrayInputStream : 
  ¹ÙÀÌÆ®¹è¿­·ÎºÎÅÍ ÀоîµéÀ̴ Ŭ·¡½ºÀÌ´Ù.
FileInputStream :  
  ÆÄÀÏÀ» ÀоîµéÀ̴ Ŭ·¡½ºÀÌ´Ù. ¸ÕÀú ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö »ìÆìº¸´Â°Ô ¿¡·¯Ã¼Å·¿¡ À¯¿ëÇÏ´Ù.
    File f = new File("won.txt");
    if (f.isFile() && f.exists() ) {
      FileInputStream f1 = new FileInputStream("won.txt");
    .......
    }
BufferedInputStream : 
   µ¥ÀÌÅ͸¦ ÀоîµéÀ϶§ ÇÊÅÍ¿Í ¹öÆÛ¸µ È¿°ú¸¦ Á¦°øÇØÁִ Ŭ·¡½ºÀÌ´Ù.
FilterInputStream :
   FilterInputStreamA(InputStream in) ÇüÅ·Π´Ù¸¥ ÀԷ½ºÆ®¸²À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ °¡°øÇØ ³½´Ù.
PushbackInputStream( : 
   ½ºÆ®¸²À¸·ÎºÎÅÍ ÀÏÁ¤Å©±âÀÇ µ¥ÀÌÅ͸¦ ÀоîµéÀÎ ÈÄ Ãë¼ÒÇÒ ¼ö Àִ Ŭ·¡½ºÀÌ´Ù.
ObjectInputStream : 
   °´Ã¼¸¦ ÀоîµéÀÏ ¼ö Àִ Ŭ·¡½ºÀÌ´Ù.
PipedInputStream : 
   PipedOutputStream °ú ¦À» ÀÌ·ï »ç¿ëµÈ´Ù.
SequenceInputStream : 
   ¿©·¯ ÀԷ½ºÆ®¸²À» ÇϳªÀÇ ¿¬°áµÈ ÀԷ½ºÆ®¸²À¸·Î °£ÁÖÇÏ°Ô ÇØÁִ Ŭ·¡½ºÀÌ´Ù.
DataInputStream : 
   »ý¼ºÀÚ°¡ DataInputStream(InputStream in) À¸·Î ÀԷ½ºÆ®¸²À¸·ÎºÎÅÍ ÀÚ¹ÙÀ¯ÇüÀ» ÀоîµéÀ̴ Ŭ·¡½ºÀÌ´Ù.
OutputStream Ŭ·¡½º´Â À§¿¡ ±â¼úÇÑ ÀԷ½ºÆ®¸²°ú ¿ªÇÒÀÌ Á¤¹Ý´ëÀÌ´Ù. ±×¸®°í ¸íεµ ´ÜÁö µÞºÎºÐÀ» OutputStream À¸·Î ¹Ù²ãÁֱ⸸ ÇÏ¸é µÈ´Ù. °¡·É FileInputStream Àº FileOutputStream ÀÌ µÇ´Â °ÍÀÌ´Ù. ±×¸®°í, ÇѰ¡Áö Ãß°¡µÇ´Â °ÍÀÌ PrintStream À¸·Î ´Ù¾çÇÑ µ¥ÀÌŸ À¯ÇüÀ» °£´ÜÇÏ°Ô Ãâ·ÂÇÏ´Â ÆíÀÇÀûÀÎ Ãâ·Â½ºÆ®¸²ÀÌ´Ù. Åë»ó »ç¿ëÇÏ´Â System.out ¿©±â¿¡ ¼ÓÇÑ´Ù.
±×·³ ¿¹¸¦ µé¾î ¼³¸íÇØ º¸°Ú´Ù.
ÆÄÀÏÀÔÃâ·Â½ºÆ®¸² Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© ÀÌÁøÆÄÀÏÀ» º¹»çÇØ ³»´Â ¿¹Á¦ÀÌ´Ù.
¿©±â¼­´Â ¹öÆÛ¸µÀ» ¼öÇàÇÑ´Ù. ¹öÆÛ¸µÀº ÆÄÀÏÀ» ÀÐ°í ¾²´Âµ¥ À־ È¿À²ÀûÀÌ´Ù. Áï ¹öÆÛ¿¡ Àӽ÷ΠÀúÀåÇß´Ù°¡ ÇѲ¨¹ø¿¡ ÀÐ°í ¾²´Â ±â´ÉÀ» ¼öÇàÇϱ⠶§¹®¿¡ ¸Å¹ø ÀÐ°í ¾²´Â ÀÛ¾÷À» ¼öÇàÇÒ Çʿ䰡 ¾ø´Ù. À§¿¡¼­ ¾ð±ÞÇÑ Å¬·¡½ºÁß¿¡¼­ FilterInput(Output)Stream À» »ó¼ÓÇÑ BufferedInputStream, DataInputStream, PrintStream µîÀÌ´Ù.
  FileInputStream fi = new FileInputStream("start.txt"); 
  FileOutputStream fo = new FileOutputStream("end.txt"); 
  BufferedInputStream in = new BufferedInputStream(fi);
  BufferedOutputStream out = new BufferedOutputStream(fo); 
  byte buffer[] =   
  new byte[1024];  try {
  int nRead =  
  
   0;  //ÆÄÀÏÀÇ ³¡Àº
  -1 ÀÌ´Ù.
    while ((nRead = 
        
     in.read(buffer,0,  1024) > = 0) { 
     //µ¥ÀÌŸ¸¦ 1byte ¸¸Å­ start.txt ·ÎºÎÅÍ buffer·Î ÀоîµéÀδÙ.
      out.write(buffer, 0, nRead); 
     //buffer ¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ end.txt ·Î 1byte ¾¿ ½á ³ª°£´Ù.
  }
  catch(IOException e) {
    System.out.println(e);
  }
  finally {
    fi.close(); in.close(); fo.close(); out.close();
    //¸®¼Ò½º ÇØÁö
  }

´ëÃæ ÀÌÇØ°¡ °¡¸®¶ó »ý°¢ÇÑ´Ù. ÀԷ½ºÆ®¸²À» ¸¸µé¾î ÁöÁ¤ÇÑ ÆÄÀϷκÎÅÍ read() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© buffer ¿¡ ÀоîµéÀÎ ÈÄ »ý¼ºµÈ Ãâ·Â½ºÆ®¸²¿¡ write() ·Î Ãâ·ÂÀ» ÇÏ°Ô ÇÏ´Â ¿¹Á¦ÀÌ´Ù. read() ´Â ÀоîµéÀÎ ¹ÙÀÌÆ® ¼ö¸¦ ¹ÝȯÇÏ´Â ¸Þ¼ÒµåÀÌ´Ù. ÇѰ¡Áö À¯³äÇÒ °ÍÀº ¹Ýµå½Ã close() ¸¦ ½á¼­ ½Ã½ºÅÛÀÇ ¸®¼Ò½º¸¦ ÇØÁöÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ¸¸¾à ¹öÆÛ¸µÀ» »ç¿ëÇÑ´Ù¸é ¾ÈÂÊ¿¡ ÀÖ´Â °ÍºÎÅÍ ÇØÁöÇÏ´Â °ÍÀÌ Á¤¼®ÀÌ´Ù. ±×¸®°í ÀÔÃâ·Â °úÁ¤¿¡ »ý±â´Â ¿¹¿Ü󸮸¦ ÇØÁÖ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇϹǷΠtry {} ¹®¿¡¼­ ó¸®ÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.

¹®ÀÚ½ºÆ®¸² ÀÚ¹Ù¿¡¼­´Â ¹®ÀÚ¸¦ 16ºñÆ®ÀÇ À¯´ÏÄÚµå·Î Ç¥ÇöÇϱ⠶§¹®¿¡ ¹ÙÀÌÆ®´ÜÀ§¸¦ ÅëÇØ ÀÔÃâ·ÂµÈ ½ºÆ®¸²À¸·Î ÀÚ¹ÙÀÇ ¹®ÀÚ¿­À» Ç¥ÇöÇÏ·Á¸é ¹®ÀÚÀÎÄÚµù¿¡ µû¶ó ¹®ÀÚ¿­À» ¹ÙÀÌÆ®¹è¿­·Î º¯È¯ÇØ¾ß Çϰí, ´Ù½Ã ¿ø·¡ÀÇ ¹®ÀÚ¿­·Î º¯È¯ÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ »ý±ä´Ù.
ÀÌ·± ¹ø°Å·Î¿òÀ» ÇØ¼ÒÇϱâ À§ÇØ À¯´ÏÄڵ幮ÀÚ¸¦ ÀÐ°í »ç¿ëÇÏ´Â ¹®ÀÚÀÔÃâ·Â ½ºÆ®¸²Å¬·¡½º¸¦ Á¦°øÇÑ´Ù.
»ç¿ë¿¹´Â ¹®ÀÚÀÔÃâ·Â½ºÆ®¸²Å¬·¡½º¿Í À¯»çÇÏ°í ¸íεµ ´ÜÁö µÞºÎºÐÀÇ InputStream À» Reader ·Î ¹Ù²ãÁֱ⸸ ÇÏ¸é µÈ´Ù.


´ÙÀ½¿¡ ³ª¿­Çϴ Ŭ·¡½º¸¦ ¹ÙÀÌÆ®ÀÔÃâ·Â½ºÆ®¸²°ú Àß ºñ±³Çϸ鼭 ¾î¶² °Í°ú »óÀÀÇÏ´Â °ÍÀÎÁö »ìÆìº¸±æ ¹Ù¶õ´Ù.
Reader, CharArrayReader, FileReader, FilterReader, BufferedReader, PushbackReader, PipedReader, LineNumberReader, InputStreamReader, Writer, CharArrayWriter, FileWriter, FilterWriter, BufferedWriter, PrintWriter, PipedWriter, StringWriter, OutPutStreamWriter°¡ ÀÖ´Ù.


¿©±â¼­ ƯÈ÷ Áß¿äÇÑ Å¬·¡½º´Â Input(Output)StreamWriter(Reader) ÀÌ´Ù.
ÀÌ Å¬·¡½º´Â ¹ÙÀÌÆ®ÀÔÃâ·Â½ºÆ®¸²°ú ¹®ÀÚÀÔÃâ·Â½ºÆ®¸²À» »óÈ£º¯È¯ÇØÁØ´Ù.


InputStreamReader ´Â ¹ÙÀÌÆ®ÀԷ½ºÆ®¸²À¸·ÎºÎÅÍ ¹ÙÀÌÆ® µ¥ÀÌÅ͸¦ Àоîµé¿© ÁöÁ¤ÇÑ ÀÎÄÚµù¿¡ µû¶ó ¹®ÀÚ·Î º¯È¯ÇØÁØ´Ù. °¡·É FileInputStream in = new FileInputStream(file); InputStreamReader won = new InputStreamReader(in, "KSC5601") À̶ó¸é in À¸·ÎºÎÅÍ ¹ÙÀÌÆ®¸¦ Àоîµé¿© KSC5601 ÀÎÄÚµùÀ¸·Î ¹®ÀÚµéÀ» º¯È¯ÇÏ°Ô µÈ´Ù. ¹Ý´ë·Î OutputStreamWriter(out, "8859_1") ´Â 8859_1 ÀÎÄÚµùÀ¸·Î ¹®ÀÚ¸¦ º¯È¯½ÃÄÑ Ãâ·Â½ÃŰ°Ô µÈ´Ù.


±×¸®°í ÇѰ¡Áö ´õ PrintWriter ´Â »ý¼ºÀÚ°¡ PrintWriter(OutputStream out, boolean autoflush) °¡ Á¸ÀçÇÑ´Ù.
±×·¡¼­ PrintStream ÀÌ println() ÈÄ flush() ¸¦ ¹Ýµå½Ã È£ÃâÇØÁà¾ß ÇÒ Çʿ伺ÀÌ Àִµ¥ ¹ÝÇØ À̰ÍÀº ÀÚµ¿À¸·Î ¼öÇàÀ» ÇØÁֱ⠶§¹®¿¡ ´ÜÁö »ý¼ºÀںκп¡ true ·Î ÁöÁ¤¸¸ ÇØÁÖ¸é ÀÚµ¿À¸·Î ÀÌ ±â´ÉÀÌ ¼öÇàµÇ±â¿¡ println() ÈÄ flush() ¸¦ ¼öÇàÇÒ Çʿ䰡 ¾ø´Ù´Â °ÍÀ» ¸í½ÉÇÏ±æ ¹Ù¶õ´Ù.
±×·³ ¸¶Áö¸·À¸·Î ¿¹¸¦ µé¾îº¸ÀÚ. À§ÀÇ ¿¹Á¦¶û ¶È°°Àº ±â´ÉÀ» ¼öÇàÇÏ´Â ¿¹Á¦ÀÌ´Ù.
Áï ÇÑÂÊ ÆÄÀÏ¿¡¼­ ´Ù¸¥ ÆÄÀÏ·Î Ä«ÇÇÇÏ´Â ¿¹Á¦ÀÌ´Ù.

  FileReader fi = new FileReader("start.txt"); 
  FileWriter fo = new FileWriter("end.txt"); 
  BufferedReader in = new BufferedReader(fi);
  PrintWriter out = new PrintWriter(fo);
  
  try {
    String nRead = 0; //´Ù¸¥ ºÎºÐÀÌ´Ù. ¹®ÀÚ·Î ÀоîµéÀ̱⠶§¹®¿¡.
    while ((nRead = in.readLine() {  //ÇÑÁÙ¾¿ ÀоîµéÀδÙ.
      out.println(line);  
  }
  catch(IOException e) {
    System.out.println(e);
  }
  finally {
    fi.close(); in.close(); fo.close(); out.close();
  }

À̷νá SCJP ¿ä¾àÀÌ ³¡³µ´Ù. ¹ÌÁøÇÑ ºÎºÐÀº ¿©·¯ºÐ¿¡°Ô ¸Ã±ä´Ù. ƯÈ÷ I/O ºÎºÐÀº ±× Á߿伺¿¡µµ ºÒ±¸, È¿À²ÀûÀ¸·Î Á¤¸®Çؼ­ ¼³¸íÀ» ¸øÇß´Ù. ¸Þ¼­µå ÇϳªÇϳª ¿¹Á¦ÄÚµå ÇϳªÇϳª »ìÆìº¸¸é¼­ ÀÍÇô³ª°¡±æ ¹Ù¶õ´Ù. ÀÌÁ¦ °Ü¿ì °ÉÀ½¸¶¸¦ °È´Â °Å¶ó »ý°¢Çϰí, JAVA ÀÇ ´õ ±íÀº Çâ³»¸¦ ´À²¼À¸¸é ÇÏ´Â ¹Ù¶÷ÀÌ´Ù.