자바 파일 입출력
원리
1. 파일 객체를 만든다.
2. 해당 파일을 열어 읽는다. (+읽은 내용 알아서 처리, 어디다 쓰든지 문자열을 바꾸던지 뭐 맘대로 하면 된다.)
3. 파일을 닫는다.
1) 한 문자씩 읽기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package com.tistory.jeongpro; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ReadText1 { public static void main(String[] args){ try{ //파일 객체 생성 File file = new File("C:\\Users\\world\\Desktop\\javaprogramming\\FileIO\\Sample.txt"); //입력 스트림 생성 FileReader filereader = new FileReader(file); int singleCh = 0; while((singleCh = filereader.read()) != -1){ System.out.print((char)singleCh); } filereader.close(); }catch (FileNotFoundException e) { // TODO: handle exception }catch(IOException e){ System.out.println(e); } } } | cs |
<결과> (Sample.txt 파일에 내용이 결과와 같이 쓰여있었다.)
1 2 3 4 5 6 7 | while((singleCh = filereader.read()) != -1){ System.out.print((char)singleCh); if((char)singleCh == '\r') System.out.print("오"); if((char)singleCh == '\n') System.out.print("아"); } |
위에서 while()로 읽는 부분을 변경해보면 윈도우에서 개행문자를 "\r\n"으로 표현하기 때문에 아래와 같은 결과를 얻을 수 있다.
* 분명 파일에서는 "\r\n" 두 문자가 개행을 표시하고 자바에서는 "\r"과 "\n" 둘다 개행으로 판단하기 때문에 위와 같은 결과가 나왔구나를 이해할 수 있다.
다만, 그렇게 인식했으면 자바에서 한 문자씩 찍을때 두번 개행이 일어났어야 하는데 의문이 든다. (내 촉은 자바에서 둘이 같이나오면 하나로 처리해주는 것 같다. System.out.print("\r\n"); 이라고 찍어보니까 한번만 개행된다. )
2) 한 줄씩 읽기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.tistory.jeongpro; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ReadText1 { public static void main(String[] args){ try{ //파일 객체 생성 File file = new File("C:\\Users\\world\\Desktop\\javaprogramming\\FileIO\\Sample.txt"); //입력 스트림 생성 FileReader filereader = new FileReader(file); //입력 버퍼 생성 BufferedReader bufReader = new BufferedReader(filereader); String line = ""; while((line = bufReader.readLine()) != null){ System.out.println(line); } //.readLine()은 끝에 개행문자를 읽지 않는다. bufReader.close(); }catch (FileNotFoundException e) { // TODO: handle exception }catch(IOException e){ System.out.println(e); } } } | cs |
기존의 원리에서 벗어나지 않는다.
추가된 내용은 버퍼를 만들어서 한줄씩 읽어 내는 것 뿐이다.
* 파일을 버퍼를 이용해서 읽는 이유는 문자를 효율적으로 입출력하여 CPU부하를 줄일 수 있기 때문이다.
3-1) 파일 한 번에 읽기 - Scanner
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.tistory.jeongpro; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class ReadText1 { public static void main(String[] args){ try{ //파일 객체 생성 File file = new File("C:\\Users\\world\\Desktop\\javaprogramming\\FileIO\\Sample.txt"); //스캐너로 파일 읽기 Scanner scan = new Scanner(file); while(scan.hasNextLine()){ System.out.println(scan.nextLine()); } //System.out.println(scan.useDelimiter("\\z").next()); }catch (FileNotFoundException e) { // TODO: handle exception } } } | cs |
Scanner로 한번에 읽었다. Scanner scan = new Scanner(file); 에서 파일을 한 번에 읽어서 스캐너가 가지고 있고
스캐너에 행이 있으면 그행을 하나씩 출력하는 내용이다.
3-2) 파일 한 번에 읽기 - File
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.tistory.jeongpro; import java.util.List; import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; public class ReadText1 { public static void main(String[] args){ //파일 객체 생성 Path path = Paths.get("C:\\Users\\world\\Desktop\\javaprogramming\\FileIO\\Sample.txt"); // 캐릭터셋 지정 Charset cs = StandardCharsets.UTF_8; //파일 내용담을 리스트 List<String> list = new ArrayList<String>(); try{ list = Files.readAllLines(path,cs); }catch(IOException e){ e.printStackTrace(); } for(String readLine : list){ System.out.println(readLine); } } } | cs |
파일 쓰기
1) 버퍼를 이용한 파일에 쓰기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package com.tistory.jeongpro; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class ReadText1 { public static void main(String[] args){ try{ //파일 객체 생성 File file = new File("C:\\Users\\world\\Desktop\\javaprogramming\\FileIO\\Writer.txt"); BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file)); if(file.isFile() && file.canWrite()){ //쓰기 bufferedWriter.write("문자열 추가1"); //개행문자쓰기 bufferedWriter.newLine(); bufferedWriter.write("문자열 추가2"); bufferedWriter.close(); } }catch (IOException e) { System.out.println(e); } } } | cs |
새로운 파일(Writer.txt)를 만들고 그 파일에 문자열을 추가했다.
Tip. 운영체제 별로 다른 개행문자 처리하기
- 리눅스(유닉스계열)에서 파일 읽었을 경우
String line = System.getProperty("line.separator");
str = str.replace("\n", line);
'Java > JAVA' 카테고리의 다른 글
자바 쓰레드 (멀티스레드, 스레드 세이프, 스레드 풀) (9) | 2017.10.04 |
---|---|
JAVA CSV 파일 입출력 (6) | 2017.10.03 |
자바 파일 입출력 (txt파일 한 문자씩, 한 줄씩, 한 번에 읽기) (17) | 2017.10.02 |
자바 직렬화 (Serialization) (0) | 2017.05.27 |
URL Connection (0) | 2017.05.26 |
입출력 스트림 (I/O Stream) (0) | 2017.05.26 |
2017년 많이 본 포스트로 '자바 파일 입출력'포스트가 선정되었습니다.
댓글은 없지만 보고 가시는 분들 감사합니다.
잘 보고 갑니다
블로그가 멋있네요 디자인패턴 장인의 기운이..ㅎ
정리해주셔서 감사해요 잘보고갑니다^^
잘 보셨다고하시니 저야말로 감사합니다.
파일을 한 번에 읽는다는 것은 .txt 파일을 string으로 읽는다는 건가요??
한 문자씩 읽는게 아니면 다 String으로 읽고요.
한 문장씩 읽는 것과 한 번에 읽는 것의 차이는 파일의 내용을 다 읽어서 이미 메모리에 가지고 있는지 없는지에 따라 나눴습니다.
한 번에 읽는 것은 위에서
list = Files.readAllLines(...);
Scanner scan = Scanner(file);
로 파일 내용을 전부 읽은 객체가 있지요.
문서 안에 있는 각 단어마다 docid를 만들어주는건 어떻게 하는건가요?
의도를 명확하게 파악하지 못했습니다..
파일에 특정 문자열이 여러번 등장할 때 id를 주고 싶다는 말씀이신가요??
비밀댓글입니다
잘보고갑니다
감사합니다~
잘 보고갑니다^^
감사합니다
엑셀 파일은 이함수로 불가능한가여?
엑셀파일도 가능할 것 같은데요
내부적으로 csv형식을 따를 것으로 예상됩니다.
다만 엑셀의 경우 별도의 라이브러리가 존재하기 때문에 그걸 이용하시는게 더 편리합니다.
잘 보고 갑니다. ^^