BufferedReader/BufferedWriter는 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할을 한다. 버퍼를 이용하면 입출력의 효율이 비교할 수 없을 정도로 좋아지기 때문에 사용하는 것이 좋다.

BufferedReader의 readLine()을 사용하면 데이터를 라인단위로 읽을 수 있고 BufferedWriter는 newLine()이라는 줄바꿈 해주는 메서드를 가지고 있다.

public class BufferedReaderEx1 {
	public static void main(String[] args) {
		try {
			FileReader fr = new FileReader("src/a210727/BufferedReaderEx1.java");
			BufferedReader br = new BufferedReader(fr);
			
			String line = "";
			for(int i=1;(line = br.readLine())!=null;i++) {
				if(line.indexOf(";")!=-1)
					System.out.println(i+":"+line);
			}
			br.close();
		} catch(Exception e) {}
	}

}
1:package a210727;
3:import java.io.BufferedReader;
4:import java.io.FileReader;
9:			FileReader fr = new FileReader("src/a210727/BufferedReaderEx1.java");
10:			BufferedReader br = new BufferedReader(fr);
12:			String line = "";
13:			for(int i=1;(line = br.readLine())!=null;i++) {
14:				if(line.indexOf(";")!=-1)
15:					System.out.println(i+":"+line);
17:			br.close();

BufferedReader의 readLine()을 이용해서 파일의 라인단위로 읽은 다음 indexOf()를 이ㅛㅇㅇ해서 ':'를 포함하고 있는지 확인하여 출력하는 예제이다. 파일에서 특정 문자 또는 문자열을 포함한 라인을 쉽게 찾아낼 수 있음을 보여 준다.

 

 

 

InputStreamReader와 OutputStreamWriter

InputStreamReader/OutputStreamWriter는 이름에서 알 수 있는 것과 같이 바이트기반 스트림을 문자기반 스트림으로 연결시켜주는 역할을 한다. 그리고 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행한다.

InputStreamReader/OutputStreamWriter는 Reader/Writer의 자손이다.

 

생성자/메서드 설명
InputStreamReader(InputStream in) QS에서 사용하는 기본 인코딩의 문자로 변환하는 InputStreamReader를 생성한다
InputStreamReader(InputSteram in, String encoding) 지정된 인코딩을 사용하는 InputStreamReader를 생성한다.
String getEncoding() InputStreamReader의 인코딩을 알려 준다.

 

생성자/메서드 설명
OutputStream(OutputStream out) OS에서 사용하는 기본 인코딩의 문자로 변환하는 OutputStreamWriter를 생성한다.
OutputStreamWriter(OutputStream out, String encoding) 지정된 인코딩을 사용하는 OutputStreamWriter를 생성한다.
String getEncoding() OutputStreamWriter의 인코딩을 알려 준다.

한글윈도우에서 중국어로 작성된 파일을 읽을 때 InputStreamReader(InputStream in, String encoding)를 이용해서 인코딩이 중국어로 되어 있다는 것을 지정해주어야 파일의 내용이 깨지지 않고 올바르게 보일 것이다. 인코딩을 지정해 주지 않는다면 OS에서 사용하는 인코딩을 사용해서 파일을 해석해서 보여 주기 때문에 원래 작성된 대로 볼 수 없을것이다.

이와 마찬가지로 OutputStreamWriter를 이용해서 파일에 텍스트데이터를 저장할 때 생성자 OutputStreamWriter(OutputStream out, String encoding)를 이용해서 인코딩을 지정하지 않으면 OS에서 사용하는 인코딩으로 데이터를 저장할 것이다.

시스템 속성에서 sun.jnu.encoding의 값을 보면 OS에서 사용하는 인코딩의 종류를 알 수 있다.

문자데이터를 다루는데 사용된다는 것을 제외하고 바이트기반 스트림과 문자기반 스트림의 사용법은 거의 같다.

 

Read와 Writer

바이트기반 스트림의 조상이 InputStream/OutputStream인 것과 같이 문자기반의 스트림에서는 Reader/Writer가 그와 같은 역할을 한다. 다음은 Reader/Writer의 메서드인데 byte배열 대신 char배열을 사용한다는 것 외에는 InputStream/OutputStream의 메서드와 다르지 않다.

 

메서드 설명
abstract void close() 입력스트림을 닫음으로써 사용하고 있던 자원을 반환한다.
void mark(int readlimit) 현재위치로 표시해놓는다. 후에 reset()에 의해서 표시해 놓은 위치로 다시 돌아갈 수 있다.
boolean markSupported() mark()와 reset()을 지원하는지를 알려 준다.
int read() 입력소스로부터 하나의 문자를 읽어 온다. cahr의 범위인 0~65535범위의 정수를 반환하며, 입력스트림의 마지막 데이터에 도달하면, -1을 반환한다.
int read(char[] c); 입력소스로부터 매개변수로 주어진 배열 c의 크기만큼 읽어서 배열c에 저장한다. 읽어 온 데이터의 개수 또는 -1을 반환한다.
abstract in read(char[] c, int off, int len) 입력소스로부터 최대 len개의 문자를 읽어서, 배열 c의 저장된 위치(off)부터 읽은 만큼 저장한다. 읽어 온 데이터의 개수 또는 -1을 반환한다.
int read(CharBuffer target) 입력소스로부터 읽어서 문자버퍼(target)에 저장한다.
boolean ready() 입력소스로부터 데이터를 읽을 준비가 되어있는지 알려 준다.
void reset() 입력소스에서 위치를 마지막으로 mark()가 호출되었던 위치로 되돌린다.
long skip(long n) 현재 위치에서 주어진 문자 수(n)만큼을 건너뛴다.

 

 

 

메서드 설명
Writer append(char c) 지정된 문자를 출력소스에 출력한다.
Writer append(CharSequence c) 지정된 문자열(CharSequence)을 출력소스에 출력한다.
Writer append(CharSequence c, int start, int end) 지정된 문자열(CharSequence)의 일부를 출력소스에 출력(CharBuffer, String, String Buffer가 CharSequence를 구현)
abstract void close() 출력스트림을 닫음으로써 사용하고 있던 자원을 반환한다.
abstract void flush() 스트림 버퍼에 있는 모든 내용을 출력소스에 쓴다.(버퍼가 있는 스트림에만 해당됨)
void write(int b) 주어진 값을 출력소스에 쓴다.
void write(char[] c) 주어진 배열 c에 저장된 모든 내용을 출력소스에 쓴다.
abstract void write(char[] c, int off, int len) 주어진 배열 c에 저장된 내용 중에서 off번째부터 len길이만큼만 출력소스에 쓴다.
void write(String str) 주어진 문자열(str)을 출력소스에 쓴다.
void write(String str, int off, int len) 주어진 문자열(str)의 일부를 출력소스에 쓴다.(off번째 문자부터 len개 만큼의 문자열)

문자기반 스트림 Reader/Writer 그리고 그 자손들은 여러 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16)간의 변환을 자동적으로 처리해준다. Reader는 특정 인코딩을 일겅서 유니코드로 변환하고 Writer는 유니코드를 특저 인코딩으로 변환하여 저장한다.

 

 

 

 

FileReader와 FileWriter

FileReader/FileWriter는 파일로부터 텍스트데이터를 읽고, 파일에 쓰는데 사용된다. 사용방법은 FileInputStream/FileOutputStream과 같다.

 

 

 

PipedReader와 PipedWriter

PipedReader/PipedWriter는 쓰레드 간에 데이터를 주고받을 때 사용된다. 다른 스트림과는 달리 입력과 출력스트림을 하나의 스트림으로 연결(connect)해서 데이터를 주고받는다는 특징이 있다.

 스트림을 생성한 다음에 어느 한쪽 쓰레드에서 connect()를 호출해서 입력스트림과 출력스트림을 연결한다. 입출력을 마친 후에넌 어느 한쪽 스트림만 닫아도 나머지 스트림은 자동으로 닫힌다. 이 점을 제외하고는 일반 입출력방법과 다르지 않다.

 

쓰레드를 시작하기 전에 PipedReader와 PipedWriter를 연결해야한다는 것에 유의 하자. 

 

 

StringReader와 StringWriter

StringReader/StringWriter는 CharArrayReader/CharArrayWriter와 같이 입출력 대상이 메모리인 스트림이다. StringWriter에 출력되는 데이터는 내부의 StringBuffer에 저장되며 StringWriter 다음과 같은 메서드를 이용해서 저장된 데이터를 얻을 수 있다.

StringBuffer getBuffer() StringWriter에 출력한 데이터가 저장된	StringBuffer를 반환한다.
String toString()	StringWriter에 출력된(StringBuffer에 저장된) 문자열을 반환한다.

 

ASP

ASP는 비주얼 베이직을 기본으로 개발된 VBScript ( JavaScript에 대항하여 마이크로소프트사가 비주얼 베이직 언어를 기초로 만든 스크립트 언어이다 ) 를 HTML 문서에 직접 코딩하여 동적인 웹 페이지를 구현하는 기술이다. 

ASP는 HTML 페이지에 VBScript 의 소스를 내장한 프로그램이며, ASP 파일은 일반 텍스트 파일로 확장자는 asp이다.

 

현재의 시간을 출력하는 간단한 ASP 프로그램으로 태그 <% .... %> 사이에 있는 부분이 VBScript 소스이다.

<%@ language="VBScript" %>
<html>
<head>
<title>ASP 예제 프로그램</title>
</head>
<body>
	지금 시각은 <%= now() %> 입니다.
</body>
</html>

 

PHP

PHP는 하이퍼텍스트 전처리기<PHP: Hypertext Preprocessor>를 의미하며, 다양하게 쓰이는 오픈 소스 일반 프로그래밍 언어의 일종이다. PHP의 원래 목적은 웹 개발에서 동적 웹 페이지를 빠르게 개발하기 위해 설계되었다.

웹 개발의 PHP를 구현하기 위해 HTML 소스 문서 안에 PHP로 작성된 코드를 넣어 구현하며, PHP 처리 기능이 있는 웹 서버에서 해당 코드를 인식하여 작성자가 원하는 웹 페이지를 생성하는 방식으로 동적 웹 페이지가 제작된다.

문법은 C, Java, Perl 과 비슷하며 배우기 쉽다. 현재 PHP는 웹 개발자가 동적을 생성되는 웹 페이지를 개발하는 분야에 가장 많이 활용되며, PHP는 명령 줄 인터페이스 방식의 자체 인터프리터를 제공하여 이를 통해 범용 프로그래밍 언어로도 사용될 수 있으며 그래픽 애플리케이션 등 다양한 분야에 사용되고 있다.

 

 

PHP의 장점

PHP의 장점은 초보에게는 매우 쉽고, 전문가에는 많은 고급 기능을 제공한다는 점이다. PHP를 활용하면 매우 쉽게 간단한 스크립트로 웹을 구축할 수 있다. 확장자가 .php인 다음 소스는 웹 브라우저에 "안녕, 나는 PHP 스크립트야!"를 출력하는 PHP 코드로 HTML 태그 내부에서 태그 <%php ... %> 사이에 PHP 코드가 삽입되는 것을 알 수 있다.

 

 

자바스크립트와 구분되는 점

웹 개발에서 PHP가 클라이언트 측 자바스크립트와 구별되는 점은 PHP 소스 코드는 서버에서 실행하여, HTML 을 생성하여 전송된다는 점이다. 서버는 확장자 .php를 인식해 PHP 실행 처리를 하며, 클라이언트는 스크립트 실행 결과만을 받게 된다. 그러므로 클라이언트 측은 PHP 소스 코드를 전혀 볼 수 없다.

 

 

ASP.NET의 정의

ASP.NET은 동적 웹 사이트(웹 응용 프로그램)을 만들기 위한 마이크로소프트의 웹 개발 기술이다. 다른 웹 개발기술인 ASP, PHP, JSP는 웹 스크립트 언어(Web Script Language)라고도 부른다. 하지만, ASP.NET은 웹 스크립트 언어라고 부르지 않는다. 웹 개발 기술이라고 하는 것이 가장 정확하다. 이유는 차후에 설명한다.

 

ASP.NET 버전은 다음과 같이 변화되었다.
ASP.NET 1.0(2000년) → ASP.NET 1.1(2003년) → ASP.NET 2.0 (2005년)

 

ASP.NET은 .NET Framework에서만 동작한다. ASP.NET 1.X는 .NET Framework 1.1에서 ASP.NET 2.0은 .NET Framework 2.0에서 동작한다. 그리고 .NET Framework의 포괄적인 개념은 .NET이다. 따라서 다음과 같은 포함관계가 성립한다.

.NET > .NET Framework > ASP.NET

물론 윈도우 응용프로그램이라면 다음과 같은 포함관계도 성립한다.

.NET > .NET Framework > Windows Programming based C#

 

웹기술은 로그인의 처리에서 처럼, 웹서버에서 내부 사용되는 로직을 개발하고 동작되게 해주는 프로그래밍언어를 뜻한다. ASP.NET, JSP, PHP, ASP, Perl 등을 모두 웹 기술이라고 할 수 있다. 또한 웹 스크립트 언어라고도 부를 수 있다. ASP, JSP, PHP, Perl 등은 그 이름 자체를 스크립트 언어라도고 지칭할 수 있다. 하지만 ASP.NET 은 언어라고 할 수 없는 것이 ASP.NET을 구현할 수 있는 언어가 C#, VB, J#, C++ 등으로 나뉘어지기 때문에 ASP.NET은 웹 개발 기술이라고만 부른다.

 

출처 : 티스토리

https://ts2ree.tistory.com/21

 

ASP, PHP, JSP 가 무엇인지 모르겠는 사람들을 위해

ASP ASP는 비주얼 베이직을 기본으로 개발된 VBScript ( JavaScript에 대항하여 마이크로소프트사가 비주얼 베이직 언어를 기초로 만든 스크립트 언어이다 ) 를 HTML 문서에 직접 코딩하여 동적인 웹 페

ts2ree.tistory.com

https://7day.tistory.com/38

 

ASP.NET 이란?

ASP.NET의 정의 ASP.NET은 동적 웹 사이트(웹 응용 프로그램)을 만들기 위한 마이크로소프트의 웹 개발 기술이다. 다른 웹 개발기술인 ASP, PHP, JSP는 웹 스크립트 언어(Web Script Language)라고도 부른다.

7day.tistory.com

 

'JAVA준비 > 배경지식' 카테고리의 다른 글

엑셀파일을 txt로 여는법+(XML, JSON, CSV)  (0) 2021.07.28
트리구조(레드-블랙 트리)  (0) 2021.07.26
파일 할당 테이블fat  (0) 2021.07.23
MVC모델-뷰-컨트롤러  (0) 2021.07.15
트래픽 사이트)스탯카운터  (0) 2021.07.08

 

저장을 CSV파일로 저장을하면txt파일로 불러올때 깨지지 않는다(xlsx로하면 이상한 글자가 출력된다.)

 

 

  XML JSON CSV
장점 3가지 포멧 중 가장 직관적
메타 정보를 제공해서 정보 표현 이상의 효과를 가져올 수 있다.
모양과 규칙 자체가 단순해서 타언어에서도 구현하기 쉽다. 용량이 가장 작다
csv는 변하지 않는 많은양의 데이터를 제공할때 주로 이용이 가능하다.
단점 실제 전송하는 정보보다 메타 데이터의 크기가 더 커질 수 있다. 콤마가 두락되거나 중괄호가 잘못 닫히는 등 문법 오류에 취약하다 데이터가 많아지면 어떤 데이터가 항목을 나타내는지 가시화가 어렵다.
주요사용처 단순 게임 옵션, 직접 데이터 수정이 잦은 부분에 사용 서버 통신 REST API르 사용할 때 가장 많이 사용 간단한 테이블 작성 또는 읽는 속도가 중요한 부분에서 사용

'JAVA준비 > 배경지식' 카테고리의 다른 글

php jsp asp asp.net(c#)  (0) 2021.07.28
트리구조(레드-블랙 트리)  (0) 2021.07.26
파일 할당 테이블fat  (0) 2021.07.23
MVC모델-뷰-컨트롤러  (0) 2021.07.15
트래픽 사이트)스탯카운터  (0) 2021.07.08

https://www.oracle.com/tools/downloads/sqldev-downloads.html

sqldeveloper

이화면에서 Windows 64-bit with JDK 8 included옆의 download로 받으면 되고

 

 

https://www.oracle.com/database/technologies/xe-prior-releases.html

 

OracleXE112 x 64를 받아서 진행했다.

 

FilterInputStream/FilterOutputStream은 InputStream/OutputStream의 자손이면서 모든 보조스트림의 조상이다. 보조스트림은 자체적으로 입출력을 수행할 수 없기 때문에 기반스트림을 필요로 한다.

protected FilterInputStream(InputStream in)
public	filterOutputStream(OutputStream out)

FilterInputStream/FilterOutputStream의 모든 메서드는 단순히 기반스트림의 메서드를 그대로 호출할 뿐이다. FilterInputStream/FilterOutputStream자체로는 아무런 일도 하지 않음을 의미한다. FilterInputStream/FilterOutputStream은 상속을 통해 원하는 작업을 수행하도록 읽고 쓰는 메서드를 오버라이딩해야한다. 생성자 FilterInputStream(InputStream in)는 접근 제어자가 protected이기 때문에 Filter InputStream의 인스턴스를 생성해서 사용할 수 없고 상속을 통해서 오버라이딩되어야 한다. FilterInputStream/FilterOutputStream을 상속받아서 기반스트림에 보조기능을 추가한 보조스트림 클래스는 다음과 같다.

FilterInputStream의 자손	BufferedInputStream, DataInputStream, PushbackInputStream 등
FilterOutputStream의 자손	BufferedOutputStream, DataOutputStream, PrintStream 등

 

 

 

BufferedInputStream과 BufferedOutputStream

BufferedInputStream/BufferedOutputStream은 스트림의 입출력 효율을 높이기 위해 버퍼를 사용하는 보조스트림이다.

한 바이트씩 입출력하는 것 보다는 버퍼(바이트배열)를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르기 때문에 대부분의 입출력 작업에 사용된다.

 

생성자 설명
BufferedInputStream(InputStream in, int size) 주어진 InputStream인스턴스를 입력소스(input source)로하며 지정된 크기(byte단위)의 버퍼를 갖는 BufferedInputStream인스턴스를 생성한다.
BufferedInputStream(InputStream in) 주어진 InputStream인스턴스를 입력소스(input source)로 하며 버퍼의 크기를 지정해주지 않으므로 기본적으로 8192byte 크기의 버퍼를 가젝 된다.

bufferedInputStream의 버퍼크기는 입력소스로부터 한 번에 가져올 수 있는 데이터의 크기로 지정하면 좋다.

프로그램에서 입력소스로부터 데이터를 읽기 위해 처음으로 read메서드를 호출하면, BufferedInputStream은 입력소스로 부터 버퍼 크기만큼의 데이터를 읽어다 자신의 내부 버퍼에 저장한다. 이제 프로그램에서는 BufferedInputStream의 버퍼에 저장된 데이터를 읽으면 되는 것이다. 외부의 입력소스로 부터 읽는 것보다 내부의 버퍼로 부터 읽는 것이 훨씬 빠르기 때문에 그만큼 작업 효율이 높아진다.

 

 

메서드/생성자 설명
BufferedOutputStream(OuputStream out,int size) 주어진 OutputStream인스턴스를 출력소스(outputsource)로하며 지정된 크기(단위byte)의 버퍼를 갖는 BufferedOutputStream인스턴스를 생성한다.
BufferedOutputStream(OutputStream out) 주어진 OutputStream인스턴스를 출력소스(output ource)로하며 버퍼의 크기를 지정해주지 않으므로 기본적으로 8192 byte 크기의 버퍼를 갖게 된다.
flush() 버퍼의 모든 내용을 출력소스에 출력한 다음, 버퍼를 비운다.
close() flush()를 호출해서 버퍼의 모든 내용을 출력소스에 출력하고, bufferedOutputStream인스턴스가 사용하던 모든 자원을 반환한다.

BufferedOutputStream 역시 버퍼를 이용해서 출력소스와 작업을 하게 되는데, 입력소스로부터 데이터를 읽을 때와 반대로, 프로그램에서 write메서드를 이용한 출력이 BufferedOutputStream의 버퍼에 저장된다, 버퍼가 가득 차면, 그 때 버퍼의 모든내용을 출력소스에 출력한다. 그리고는 버퍼를 비우고 다시 프로그램으로부터의 출력을 저장할 준비를 한다.

버퍼가 가득 찼을 때문 출력소스에 출력을 하기 때문에, 마지막 출력부분이 출력소스에 쓰이지 못하고 BufferedOutputStream의 버퍼에 남아있는 채로 프로그램이 종료될 수 있다는 점을 주의해야한다.

따라서 프로그램에서 모든 출력작업을 마친 후 BufferedOutputStream에 close()나 flush()를 호출해서 마지막에 버퍼에 있는 모든 내용이 출력소스에 출력되도록 해야 ㅎ나다.

BufferedOutputStream의 close()는 flush()를 호출하여 버퍼의 내용을 출력스트림에 쓰도록 한 후, BufferedOutputSream인스턴스의 참조변수에 null을 지정함으로써 사용하던 자원들이 반환되게 한다.

 

 

public class BufferedOutputStreamEx1 {
	public static void main(String[] args) {
		try {
			FileOutputStream fos = new FileOutputStream("123.txt");
			BufferedOutputStream bos = new BufferedOutputStream(fos, 5);
			for (int i = '1'; i <= '9'; i++) {
				bos.write(i);
			}

			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

이 예제에서 fos.close()를 호출해서 스트림을 닫아주기는 했지만, 이렇게 해서는 BufferedOutputStream의 버퍼에 있는 내용이 출력되지 않는다. bos.close();와 같이 해서 BufferedOutputStream의 close()를 호출해야 주어진 버퍼에 남아있떤 모든 내용이 출력된다.

 

 

 

3.5 PrintStream

PrintStream은 데이터를 기반스트림에 다양한 형태로 출력할 수 있는 print, println, printf와 같은 메서드를 오버로딩하여 제공한다.

 PrintStream은 데이터를 적절한 문자로 출력하는 것이기 때문에 문자기반 스트림의 역할을 수행한다. 그래서 JDK1.1에서 부터 PrintStream보다 향상된 기능의 문자기반 스트림인 PrintWriter가 추가되었으나 그 동안 매우 빈번히 사용되던 System.out이  PrintStream이다 보니 둘 다 사용할 수밖에 없게 되었다.

PrintStream과 PrintWriter는 거의 같은 기능을 가지고 있지만 PrintWriter가 PrintStream에 비해 다양한 언어의 문자를 처리하는데 적합하기 때문에 가능하면 PrintWriter를 사용하는것이 좋다.

PrintStream은 System클래스의 static멤버인 out과 err, 즉 System.out, System.err이 PrintStream이다.

 

생성자/메서드 설명
PrinStream(File file)
PrinStream(File file, String scn)
PrinStream(OutputStream out)
PrinStream(OutputStream out, boolean autoFlush)
PrinStream(OutputStream out, boolean autoFlush, String encoding)
PrinStream(String fileName)
PrinStream(String fileName, String scn)
지정된 출력스트림을 기반으로 하는 PrintStream인 스턴스를 생성한다. autoFlush의 값을 true로 하면 println메서드가 호출되거나 개행문자가 출력될 때 자동으로 flush된다. 기본값은 false이다.
boolean checkError() 스트림을 flush하고 에러가 발생했는지를 알려 준다.
void print
void print
void print
void print
void print
void print
void print
void print
void print
void println
void println
void println
void println
void println
void println
void println
void println
void println
인자로 주어진 값을 출력소스에 문자로 출력한다.
println메서드는 출력 후 줄바꿈을 하고, print메서드는 줄을 바꾸지 않는다.
void println 줄바꿈 문자(line separator)를 출력함으로써 줄을 바꾼다.
PrintStream printf 정형화된(formatted)출력을 가능하게 한다.
protected void setError() 작업 중에 오류가 발생했음을 알린다.
(setError()를 호출한 후에, checkError()를 호출하면 true를 반환한다.)

print()나 println()을 이용해서 출력하는 중에 PrintStream의 기반스트림에서 IOException이 발생하면 checkError()를 통해서 인지할 수 있다. println()이나 print()는 예외를 던지지않고 내부에서 처리하도록 정의하였는데, 그 이유는 println()과 같은 메서드가 매우 자주 사용되는 것이기 때문이다./

만일 println()이 예외를 던지도록 정의되었다면 println()을 사용하는 모든 곳에 try-catch문을 사용해야 할 것이다.

 

public class PrintStream extends FileOutputStream implements Appendable, Closeable {
	...
	private boolean trouble = false;
	public void print(int i) {
		write(String.valueOf(i));
	}
	private void write(String s) {
		try {
			...
		} catch (IOExcepton x) {
			trouble = true;
		}
}
	...
	public boolean checkError() {
		if(out != null) flush();
		return trouble;
	}
}

i+와 String.valueOf(i)는 같은 결과를 얻집만, String.valueOf(i)가 더 성능이 좋다.

 

printf()는 JDK.15부터 추가된 것으로, C언어와 같이 편리한 형식화된 출력을 지원하게 되었다. printf()에 사용될 수 있는 옵션은 꽤나 다양한데 그에 대한 자세한 내용은 JAVAAPI문서에서 Formatter클래스를 참고하면 된다.

 

format 설명 결과(int i=65)
%d 10진수(decimal integer) 65
%o 8진수(ocrtal integer) 101
%x 16진수(hexadecimal integer) 41
%c 문자 A
%s 문자열 65
%5d 5자리 숫자. 빈자리는 공백으로 채운다    65
%-5d 5자리 숫자. 빈자리는 공백으로 채운다(왼쪽 정렬) 65
%05d 5자리 숫자. 빈자리는 0으로 채운다. 00065

 

 

format 설명 결과(String str = "ABC")
%s 문자열(string) ABC
%5s 5자리 문자열. 빈자리는 공백으로 채운다.   ABC
%-5s 5자리 문자열. 빈자리는 공백으로 채운다.(왼쪽 정렬) ABC

 

 

format 설명 결과(float f = 1234.56789f)
%e 지수형태표현(exponent) 1.234568e+03
%f 10진수(decimal float) 1234.56789
%3.1f 출력될 자리수를 최소 3자리(소수점포함). 소수점 이하 1자리(2번째 자리에서 반올림) 1234.6
%8.1f 소수점이상 최소 6자리. 소수점 이하 1자리.
출력될 자리수를 최소 8자리(소수점포함)를 확보한다. 빈자리는 공백으로 채워진다.(오른쪽 정렬)
  1234.6
%08.1f 소수점이상 최소 6자리, 소수점 이하 1자리.
출력될 자리수를 최소 8자리(소수점포함)를 확보한다. 빈자리는 0으로 채워진다.
001234.6
%-8.1f 소수점이상 최소 6자리, 소수점 이하 1자리
출력될 자리수를 최소 8자리(소수점포함)를 확보한다. 빈자리는 공백으로 채워진다.(왼쪽 정렬)
1234.6
1234.6

 

format 설명
\t 탭(tab)
%n 줄바꿈 문자(new line)
%% %

 

 

format 설명 결과
%tR
%tH:%tM
시분(24시간) 21:05
21:05
%tT
%tH:%tM:%tS
시분초(24시간) 21:05:33
21:05:33
%tD
%tm/%td/%ty
월일년 11/16/15
11/16/15
%tF
%tY-%tm-%td
년월일 2015-11-16
2015-11-16

날짜와 시간에 사용될 수 있는 옵션

InputStream과 OutpurStream

앞서 얘기한 바와 같이 InputStream과 OutpurStream은 모든 바이트기반의 스트림의 조상이며 다음과 같은 메서드가 선언되어 있다.

메서드명 설명
int available() 스트림으로부터 읽어 올 수 있는 데이터의 크기를 반환한다.
void close() 스트림을 닫음으로써 사용하고 있던 자원을 반환한다.
void mark(int readlmit) 현재위치를 표시해 놓는다. 후에 reset( )에 의해서 표시해 놓은 위치로 다시 돌아갈 수 있다. readlimit은 되돌아갈 수 있는 byte의 수이다.
boolean markSupported( ) mark( )와 reset( )을 지원하는지를 알려준다. mark( )와 reset( )기능을 지원하는 것은 선택적이므로, mark( )와 reset( )을 사용하기 전에 markSupported( )를 호출해서 지원여부를 확인해야 한다.
abstract int read() 1 byte를 읽어 온다(0~255사이의 값), 더 이상 읽어 올 데이터가 없으면 -1을 반환한다. abstract메서드라서 InputStream의 자손들은 자신의 상황에 알맞게 구현해야한다.
int read(byte[ ] b) 배열 b의 크기만큼 읽어서 배열을 채우고 읽어 온 데이터의 수를 반환한다. 반환하는 값은 항상 배열의 크기보다 작거나 같다.
int read(byte[ ] b,
int off, int len
최대 len개의 byte를 읽어서, 배열 b의 지정된 위치(off)부터 저장한다. 실제로 읽어 올 수 있는 데이터가 len개보다 적을 수 있다.
void reset( ) 스트림에서의 위치를 마지막으로 mark( )이 호출되었던 위치로 되돌린다.
long skip(long n) 스트림에서 주어진 길이(n만큼을 건너뛴다.

 

 

메서드명 설명
void close( ) 입력소스를 닫음으로써 사용하고 있던 자원을 반환한다.
void flush( ) 스트림의 버퍼에 있는 모든 내용을 출력소스에 쓴다.
abstract void write(int b) 주어진 값을 출력소스에 쓴다
void write(byte[ ] b) 주어진 배열 b에 저장된 모든 내용을 출력소스에 쓴다
void write(byte[ ] b,
int off, int len)
주어진 배열 b에 저장된 내용 중에서 off번째부터 len개 만큼만을 읽어서 출력소스에 쓴다.

스트림의 종류에 따라서 mark( )와 reset( )을 사용하여 이미 읽은 데이터를 되돌려서 다시 읽을 수 있다.

markSupported( )를 통해서 사용가능여부를 알 수 있다.

flush( )는 버퍼가 있는 출력스트림의 경우에만 의미가 있으며 OutputStream에 정의된 flush( )는 아무런 일도 하지 않는다. flus( )는 수시로 사용해주어 부담을 덜어주는게 좋다.

또한 스트림을 사용해서 모든 작업을 마치고 난 후에는 close()를 호출해서 반드시 닫아주어야 한다. 그러나 ByteArrayStream과 같이 메모리를 사용하는 스트림과 System.in, System.out과 같은 표준 입출력 스트림은 닫아 주지 않아도 된다.

스트림의 종류가 달라도 읽고 쓰는 방법은 동일하다.

 

 

ByteArrayInputStream과 ByteArrayOutStream

ByteArrayInputStream/ByteArrayOutStream은 메모리, 즉 바이트배열에 데이터를 입출력 하는데 사용되는 스트림이다. 다른 곳에 입출력하기 전에 데이터를 임시로 바이트배열에 담아서 변환 등의 작업을 하는데 사용된다.

class IOEx1 {
	public static void main(String[] args) {
		byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		byte[] outSrc = null;
		
		ByteArrayInputStream input = null;
		ByteArrayOutputStream output = null;
		
		input = new ByteArrayInputStream(inSrc);
		output = new ByteArrayOutputStream();
		
		int data = 0;
		
		while((data = input.read())!=-1) {
			output.write(data);
		}
		
		outSrc = output.toByteArray();
		
		System.out.println("Input Source :"+ Arrays.toString(inSrc));
		System.out.println("Output Source :"+ Arrays.toString(outSrc));
	}
}

여기서 while안의 식이 !=-1인데 이것은 input.read로 읽은값을 data에 저장해서 data가 -1이되면 종료되는 식이다.

 

public class IOEx4 {
	public static void main(String[] args) {
		byte[] inSrc = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		byte[] outSrc = null;
		byte[] temp = new byte[4];

		ByteArrayInputStream input = null;
		ByteArrayOutputStream output = null;

		input = new ByteArrayInputStream(inSrc);
		output = new ByteArrayOutputStream();

		try {
			while (input.available() > 0) {
				int len = input.read(temp);
				output.write(temp, 0, len);
			}
		} catch (Exception e) {}
		
		outSrc = output.toByteArray();

		System.out.println("Input Source	:" + Arrays.toString(inSrc));
		System.out.println("temp		:" + Arrays.toString(temp));
		System.out.println("Output Source   :" + Arrays.toString(outSrc));
	}
}
Input Source	:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
temp		:[8, 9, 6, 7]
Output Source   :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

 

FileInputStream과 FileOutpurStream

 

생성자 설명
FileInputStream(String name) 지정된 파일이름(name)을 가진 실제 파일과 연결된 FileInputStream을 생성한다.
FileInputStream(File file) 파일의 이름이 String이 아닌 File인스턴스로 지정해주어야 하는 점을 제외하고 FileInputStream(String name)와 같다.
FileInputStream(FileDescriptor fdObj) 파일 디스크립터(fdObj)로 FileInputStream을 생성한다.
FileOutputStream(String name) 지정된 파일이름(name)을 가진 실제 파일과의 연결된 FileOutputStream을 생성한다.
FileOutputStream(String name, boolean append) 지정된 파일이름(name)을 가진 실제 파일과 연결된 FileOutputStream을 생성한다. 두번째 인자인 append를 true로하면, 출력 시 기존의 파일내용의 마지막에 덧붙인다. false면 기존의 파일내용을 덮어쓰게 된다.
FileOutputStream(File file) 파일의 이름을 String이 아닌 File인스턴스로 지정해주어야 하는점을 제외하고 FileOutputStream(String name)과 같다.
FileOutputStream(File file, bollean append) 파일 이름을 String이 아닌 File인스턴스로 지정해주어야 하는 점을 제외하고 FileOutputStream(String name, boolean append)과 같다.
FileOutputstream(FileDescriptor fdObj) 파일 디스크립터(fdObj)로 FileOutputStream을 생성한다.

 

I/O란  Input과 Output의 약자로 입력과 출력, 간단히 줄여서 입출력이라고 한다. 입출력은 컴퓨터 내부 또는 외부의 장치와 프로그램 간의 데이터를 주고받는 것을 말한다.

 

스트림(stream)

자바에서 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(stream)이라고 정의했다.

스트림이란 데이터를 운반하는데 사용되는 연결통로이다.

스트림은 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.

 

스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고받는다.

큐(queue)와 같은 FIFO(First In First Out) 구조로 되어 있다고 생각하면 이해하기 쉽다.

 

 

바이트 기반 스트림 - InputStream, OutputStream

스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 다음과 같은 입출력 스트림이 있다.

입력스트림 출력스트림 입출력 대상의 종류
FileInputStream FileOutputStream 파일
ByteArrayInputStream ByteArrayOutputStream 메모리(byte배열)
PipedInputStream PipedOutputStream 프로세서(프로세스간의 통신)
AudioInputStream AudioOutputStream 오디오장치

자바에서는 java.io패키지를 통해서 많은 종류의 입출력관련 클래스들을 제공하고 있으며, 입출력을 처리할 수 있는 표준화된 방법을 제공함으로써 입출력의 대상이 달라져도 동일한 방법으로 입출력이 가능하기 때문에 프로그래밍을 하기에 편리하다.

 

InputStream OutputStream
abstract int read() abstract void write(int b)
int read(byte[ ] b) void write(byte[ ] b)
int read (byte[ ] b, int off, int len) void write(byte[ ] b, int off, int len)

read()의 반환타입이 byte가 아니라 int인 이유는 read()의 반환 값의 범위가 0~255와 -1이기 때문이다.

 

InputStream의 read()와 OutputStream의 write(int b)는 입출력의 대상에 따라 읽고 쓰는 방법이 다를 것이기 때문에 상황에 알맞게 구현하라는 의미에서 추상 메서드로 정의되어 있다.

 

 

 

보조 스트림

스트림의 기능을 보완하기 위한 보조스트림이 제공된다. 보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 데이터를 입출력할 수 있는 기능은 없지만, 스트림의 기능을 향상하거나 새로운 기능을 추가할 수 있다. 그래서 보조 스트림만으로는 입출력을 처리할 수 없고, 스트림을 먼저 생성한 다음에 이를 이용해서 보조 스트림을 생성해야 한다.

 

// 먼저 기반스트림을 생성한다.
FileInputStream fis = new FileInputStream("test.txt");
// 기반스트림을 이용해서 보조스트림을 생성한다.
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read();

코드 상으로는 보조스트림인 BufferedInputStream이 입력 기능을 수행하는 것처럼 보이지만, 실제 입력 기능은 BufferedInputStream과 연결된 FileInputStream이 수행하고, 보조 스트림인 BufferedInputStream은 버퍼만을 제공한다.

버퍼를 사용한 입출력이 빠르기 때문에 버퍼를 이용한 보조스트림을 사용한다.

 

문자 기반 출력 설명
FilterInputStream FilterOutputStream 필터를 이용한 입출력 처리
BufferedInputStream BufferedOutputStream 버퍼를 이용한 입출력 성능향상
DataInputStream DataOutputStream int, flaoat와 같은 기본형 단위(primitive type)로 데이터를 처리하는 기능
SequenceInputStream 없음 두 개의 스트림을 하나로 연결
LineNumberInputStream 없음 읽어 온 데이터 라인의 번호를 카운트(JDK1.1부터LineNumberReader로 대체)
ObjectInputStream ObjectOutputStream 데이터를 객체단위로 읽고 쓰는데 사용
주로 파일을 이용하며 직렬화와 관련있음
없음 PrintOutputStream 버퍼를 이용하며, 추가적인 print관련 기능
(print, printf, println메서드)
pushbackInputStream 없음 버퍼를 이용해서 읽어 온 데이터를 다시 되돌리는 기능(unread, push back to buffer)

 

 

 

스트림 - Reader, Writer

문자 데이터를 입출력할 때는 바이트 기반 스트림 대신 문자 기반 스트림을 사용하자.

InputStream > Reader
OutputStream > Writer

 

바이트기반 스트림 문자기반 스트림
FileInputStream
FileOutputStream
FileReader
FileWriter
ByteArrayInputStream
ByteArrayOutputStream
CharArrayReader
CharArrayWriter
PipedInputStream
PipedOutputStream
PipedReader
PipedWriter
StringBufferInputStream(deprecated)
StringBufferOutputStream(deprecated)
StringReader
StringWriter

StringBufferInputStream, StringBufferOutputStream은 StringReader와 StringWriter로 대체되어 더 이상 사용되지 않는다.

 

문자기반 스트림의 이름은 바이트 기반 스트림의 이름에서 InputStream은 Reader로 OutputStream은 Writer로만 바꾸면 된다. 단, ByteArrayInputStream에 대응하는 문자 기반 스트림은 char배열을 사용하는 CharArrayReader이다.

Reader와 Writer에서도 역시 추상메서드가 아닌 메서드들은 추상 메서드를 이용해서 작성되었으며, 프로그래밍적인 관점에서 볼 때 read()를 추상 메서드로 하는 것보다 int read(char [] cbuf, int off, int len)를 추상 메서드로 하는 것이 더 바람직하다.

 

InputStream Reader
abstract int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
int read()
int read(char[] cbuf)
abstract int read(char[] chuf, int off, int len)

 

OutputStream Writer
abstract void write(int b)
void write(byte[] b
void write(byte[] b, int off, int len)
void write(int c)
void write(char[] cbuf)
abstract void write(char[] cbuf, int off, int len)
void write(String str)
void write(String str, int off, int len)

 

 

바이트기반 보조스트림 문자기반 보조스트림
BufferedInterStream
BufferedOutputStream
BufferedReader
BufferedWriter
FilterInputStream
FilterOutputStream
FilterReader
FilterWriter
LineNumberInputStream(deprecated) LineNumberReader
PrintStream PrintWriter
PushbackInputStream PushbackReader

 

+ Recent posts