newprog

JAVA 파일 입출력 - 예제, 소스코드 첨부 본문

JAVA

JAVA 파일 입출력 - 예제, 소스코드 첨부

newprog 2016. 10. 1. 06:00

이번에는 하나의 클래스를 가지고 분석을 해본다.


-------------------------------------------------------------------------------


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

'JAVA' 카테고리의 다른 글

JAVA 피보나치 수열 만들기  (0) 2016.10.13
JAVA String 클래스 메소드  (0) 2016.10.04