JAVA/IOStream

Properties

DesignatedRoom 2021. 1. 11. 18:46

 

우선 간단하게 입/출력 스트림에 대해 알아보자.

자바 프로젝트를 하나 만드는데 이름은 Stream이라고 하자.

그리고 src폴더에 stream 패키지를 하나 생성한다.

stream 패키지에 StreamTest.java파일을 하나 생성한다.

 

입력 스트림에 대해 알아보자.

StreamTest.java

package stream;

/*
	Out의 방향은 Java Application에서 Console 방향이다.
	System.out.flush(); 문장이 없으면 콘솔 화면 창에 아무것도 출력되지 않는다.
*/
public class StreamTest {
	public static void main(String[] args) {
		System.out.write(97);	//	버퍼에 97값(아스키 코드 값)이 담긴다. 
		System.out.flush();		//	버퍼 밖으로 밀어내는 역할을 한다.
	}
}

실행결과는 다음과 같다.

위의 소스에서 System.out.flush(); 문장을 주석처리하고 실행하면 아래와 같다.

즉, 출력되는 결과는 없다.

 

 

그리고 현재의 프로젝트의 바로 하위에 파일을 하나 만드는데, data.txt 라고 이름을 짓는다.

아래와 같이 파일명을 data.txt라고 적는다.

 

data.txt 의 내용

abcdef

 

StreamTest.java

더보기
package stream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class StreamTest 
{
	public static void main(String[] args) 
	{
			//	InputStream(입력 스트림)		
			try { 
				InputStream in = new FileInputStream( new File("data.txt") );	
				byte r;	//	스트림은 byte 형태로 받아야 한다.
				
				try {
					//	while 루프를 통해 r이 -1이 아닐 때까지 읽어들인다.
					while ( ( r = (byte) in.read() ) != -1 )
						System.out.print( (char)r );
				} 
				catch (IOException e) {	e.printStackTrace();	}
			} 
			catch (FileNotFoundException e) {e.printStackTrace();}
	}
}

프로그램 실행결과

 

 

 

 

그리고, 프로젝트 폴더의 바로 하위에 html파일을 하나 만드는데, index.html이라고 하자.

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	test
</body>
</html>

 

StreamTest.java

더보기
package stream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class StreamTest 
{
	public static void main(String[] args) 
	{
			//	InputStream(입력 스트림)		
			try { 
				InputStream in = new FileInputStream( new File("index.html") );
				byte r;	//	스트림은 byte 형태로 받아야 한다.
				
				try {
					//	while 루프를 통해 r이 -1이 아닐 때까지 읽어들인다.
					while ( ( r = (byte) in.read() ) != -1 )
						System.out.print( (char)r );
				} 
				catch (IOException e) {	e.printStackTrace();	}
			} 
			catch (FileNotFoundException e) {e.printStackTrace();}
	}
}

 

실행결과는 아래와 같다.

 

 

 

 

 

 

출력 스트림에 대해 알아보자.

내용을 파일에 써보자.

프로젝트의 하위에 data1.txt파일을 하나 만들자. 내용은 없다.

StreamTest.java

더보기
package stream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class StreamTest 
{
	public static void main(String[] args) 
	{
		//	OutputStream(출력 스트림)은 java 기준으로 out -> console(화면), file		
		byte[] data = new byte[] { '1','2','3','4' };
		
		try {
			//	data1.txt로 데이터를 내보낼 것이다.
			OutputStream out = new FileOutputStream( new File("data1.txt") );
			
			for ( byte d : data )
			{
				try { out.write(d);}
				catch (IOException e) {e.printStackTrace();}
			}
		} 
		catch (FileNotFoundException e) {e.printStackTrace();}
	}
}

 

실행하고나서, data1.txt파일로 이동해서 내용을 보자.

 

 

이번에는 src폴더 바로 하위에 파일을 하나 생성하는데 이름은 config.properties라고 짓는다.

위에서는 프로젝트의 바로 하위에 파일을 생성했으나, 여기서는 src폴더의 바로 하위에 만들어야 한다.

config.properties 파일에 쓴 내용은 아래에서 해석해보자.

config.properties

index=spring.web.mvc.index.jsp
insert=insert.jsp
delete=delete.jsp
update=update.jsp

 

config.properties 파일에서 "=" 을 중심으로 왼쪽은 속성을 의미하고 오른쪽은 속성에 대한 값을 정의한 것이다.

 

stream패키지에 Main.java 파일을 생성한다.

Main.java

더보기
package stream;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/* 
	Properties클래스는 파싱해주는 클래스
	config.properties 파일은 src가 루트 경로이다. 그래서 파일의 위치를 src밑에 둔다.	
*/
public class Main {
	public static void main(String[] args) {
		String propertiesFilename = "config.properties";
		Properties prop = loadProperties(propertiesFilename);
		PrintProperties(prop);
	}

	private static void PrintProperties(Properties prop) 
	{
		//	stream을 통해 키와 키에 대한 값을 가지고 온다.
		//	설정파일(config.properties)의 내용에서 =을 중심으로 좌측이 키값 우측이 키에 대한 속성값이다.
		//	이 값을 분리해서 출력한다.
		prop.stringPropertyNames().stream(
				).map(key->key+"="+prop.getProperty(key)).forEach(System.out::println);
		
	}
	
	private static Properties loadProperties(String propertiesFilename) 
	{
		Properties prop = new Properties();	//	속성을 저장하는 클래스
		
		//	Properties클래스를 사용하려면 현재의 클래스를 로드해야 한다.
		ClassLoader loader = Main.class.getClassLoader();	//	Main클래스를 로드한다.
		
		InputStream in = loader.getResourceAsStream(propertiesFilename);
		
		//try(in){}
		//catch(Exception e) {e.printStackTrace();}
		
		if ( in == null )
		{	
			//	실패한 이유 처리 
		}
		
		try {	prop.load(in);	} 
		catch (IOException e) {e.printStackTrace();}
		
		return prop;
	}
}

 

실행하면 다음과 같은 결과가 출력된다.

 

위의 PrintProperties메소드에서 "="대신 ":"이라 적고 실행해보자. 즉, 메소드를 아래와 같이 변경하자.

 

그러면 다음과 같은 결과를 얻는다.

 

프로젝트에서의 파일과 폴더의 계층 구조는 다음과 같다.