Properties
우선 간단하게 입/출력 스트림에 대해 알아보자.
자바 프로젝트를 하나 만드는데 이름은 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메소드에서 "="대신 ":"이라 적고 실행해보자. 즉, 메소드를 아래와 같이 변경하자.
그러면 다음과 같은 결과를 얻는다.
프로젝트에서의 파일과 폴더의 계층 구조는 다음과 같다.