이번에는 하나의 클래스를 가지고 분석을 해본다.
-------------------------------------------------------------------------------
import java.io.File; // 파일을 입력받고자 한다.
import java.io.IOException; // 입력받고자 하는 파일이 없을 경우의 상황.
import java.io.PrintWriter; // 지정된 파일에 내용을 쓰고자 한다.
import java.util.Scanner; // 콘솔로부터 내용을 입력받고자 한다.
/**
* 원래 있던 글에서 글의 첫 부분에 숫자를 메긴다.
*
*/
public class LineNumberer {
public static void main(String[] args) throws IOException{ // 위에 import java.io.IOException;을 쓴 것과 마찬가지로 파일이 없을 때의 예외경우를 지정해주는 명령문?이라고 한다. 자세한건 모름.
Scanner console = new Scanner(System.in);
// 원래 있던 글을 읽어들여옴
System.out.print("input file: ");
String inputFileName = console.next(); // 콘솔로부터 입력파일 이름을 입력받는다.
// 수정한 글을 쓸 파일.
System.out.print("Output file: ");
String outputFileName = console.next(); // 아웃풋 내용이 들어갈 파일의 이름을 지정받는다.
File inputFile = new File(inputFileName); // File객체 inputFile을 선언하고 콘솔로부터 입력받은 입력파일을 저장한다.
Scanner in = null; // 값을 불러올 객체 in을 선언.
PrintWriter out = null; // 값을 쓸(Write) 객체 out을 선언.
in = new Scanner(inputFile); // 파일이름 string이 아닌 File 객체를 인자로 주어야 한다.
out = new PrintWriter(outputFileName); // 파일이름 string을 인자로 준다.
int lineNumber = 0;
while (in.hasNextLine()) // 다음 한 줄이 있을 때 실행.
{
String line = in.nextLine();
out.println("/* " + ++lineNumber + " */ " + line); // 값을 쓸 객체.println(내용);
}
console.close();
in.close();
out.close(); // 값을 썼던 객체를 종료시켜줘야 가상메모리에 임시저장되어 있던 내용들 중 나머지도 모두 아웃풋 파일에 저장된다
}
}
----------------------------------------------------------------------------------
실행하면
원래파일.txt
newprog
java example
yeap
새로생성된파일.txt
/* 1 */ newprog
/* 2 */ java example
/* 3 */ yeap
이렇게 된다.
매번 입출력 파일을 콘솔에서 지정해 주는 것 말고 명령줄 인자를 사용할 수도 있다.
코드만 올려보자면
------------------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
/**
* 라인마다 숫자가 메겨진 글에서 숫자를 지운다.
*/
public class DeNumberer {
public static void main(String[] args) throws IOException{
Scanner input = new Scanner(System.in);
// 숫자가 적힌 글
System.out.print("input file: ");
String inputFileName = input.next();
// 숫자를 없앤 글을 저장할 파일
System.out.print("output file: ");
String outputFileName = input.next();
// 여기에 숫자가 적힌 글을 File객체에 저장.
File inputFile = new File(inputFileName);
Scanner in = new Scanner(inputFile); // 파일이름 string이 아닌 File 객체를 인자로 주어야 한다.
PrintWriter out = new PrintWriter(outputFileName); // 파일이름 string을 인자로 준다.
while (in.hasNextLine())
{
String line = in.nextLine();
int temp = line.indexOf("*/");
out.println(line.substring(temp + 3));
}
input.close();
in.close();
out.close();
}
}
--------------------------------------------------------------------------
위의 이것이 콘솔로 입출력 파일 지정하는 방법.
아래가 명령줄 인자를 사용한 방법.
---------------------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
/**
* 명령줄인자를 사용하여 입력파일과 출력파일을 설정한다.
*/
public class DeNumberer2 {
public static void main(String[] args) throws IOException{
File inputFile = new File(args[0]);
Scanner in = new Scanner(inputFile); // 파일이름 string이 아닌 File 객체를 인자로 주어야 한다.
PrintWriter out = new PrintWriter(args[1]); // 파일이름 string을 인자로 준다.
while (in.hasNextLine())
{
String line = in.nextLine();
int temp = line.indexOf("*/");
out.println(line.substring(temp + 3));
}
in.close();
out.close();
}
}
----------------------------------------------------------------------------
명령줄 인자 사용시엔 바로 File객체를 선언한다.
File inputFile = new File(args[0]);
여기서 args[0]은 첫 번째로 인자로 주어지는 파일을 말한다.
그리고 여기서 선언한 inputFile을
Scanner in = new Scanner(inputFile);로 선언한다.
in이라는 스캐너에 첫 번째로 주어지는 파일의 내용이 들어가는 것이다.
그런데 교수님한테 물어보니 굳이 File객체를 생성하지 않고
Scanner in = new Scanner(args[0]); 이렇게 바로 선언해도 된다고 하셨다.
이런 작은 실습은 별도의 과정을 거치지 않고 곧바로 해도 프로그램에 영향을 미치진 않기 때문이다.
그래도 처음 배울 때 왜 쓰는지는 아는 것이 좋겠다.
PrintWriter out = new PrintWriter(args[1]);
두 번째에 입력받는 파일에는 아웃풋 내용을 입력한다는 뜻이다.
이 이후로는 비슷하다.
대충 차이점을 살펴보면
----------------------------------
Scanner input = new Scanner(System.in);
String inputFileName = input.next();
String outputFileName = input.next();
File inputFile = new File(inputFileName);
Scanner in = new Scanner(inputFile);
PrintWriter out = new PrintWriter(outputFileName);
---------------------------------
File inputFile = new File(args[0]);
Scanner in = new Scanner(inputFile);
PrintWriter out = new PrintWriter(args[1]);
---------------------------------
똑같은 역할을 하는 두 코드인데 딱 봐도 명령줄 인자를 사용한 것이 훨씬 간결해보인다.
그래서 과제 제출할 때에도 모두 저걸 사용했는데 나중에 알고 보니까 명령줄 인자를 사용하면
코드 돌리는 컴퓨터를 옮길 때마다 새로 설정해 주어야 한다.
네이버 블로그 : http://newprog.blog.me
blogger : http://progjw.blogspot.com