Programming > Java

Java 파일 읽고 쓰기 (디렉토리)

#file write#file read#파일읽고쓰기#파일쓰기

파일읽기 (Read File)

① Stream 에 읽은 파일을 내보내 읽어들인다. ( Stream - Files.lines )

String fileName = "D:/sample.txt";
Stream<String> stream = Files.lines(Paths.get(fileName), Charset.forName("UTF-8"));
stream.forEach(System.out::println);
//stream.collect(Collectors.toList()).forEach(System.out::println);
//stream.
parallel().forEach(System.out::println);  // 병렬처리시
//stream.
parallel().forEachOrdered(System.out::println);  // 병렬처리시 순서보장

stream.close();

※ 위와 동일 try{} 자동해제
Path
path = Paths.get("D:/sample.txt");

try (Stream<String> stream = Files.lines(path)) {
           stream.forEach(System.out::println);
}

② 버퍼로 읽어서 루프돌리기 ( BufferedReader )

String fileName = "D:/sample.txt";
BufferedReader reader = Files.newBufferedReader(Paths.get(fileName), Charset.forName("UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
      System.out.println(line);
}                   
reader.close();

Path path=Paths.get("D:/sample.txt ");
try(BufferedReader reader=Files.newBufferedReader(path)) {
      reader.lines().forEach(System.out::println);
}

③ Files객체로 라인별 List에 읽기 ( Files.readAllLines )

String fileName = "D:/sample.txt";
List<String> lines = Files.readAllLines(Paths.get(fileName), Charset.forName("UTF-8"));
lines.forEach(System.out::println);

④ Files객체를 통해 Byte배열에 읽어들이기 ( Files.readAllBytes )

String fileName = "D:/sample.txt";
byte[] bytes = Files.readAllBytes(Paths.get(fileName));
System.out.println(new String(bytes));

⑤ 스캐너로 읽어들인다 ( Scanner )

String fileName = "D:/sample.txt";
try
(Scanner scan = new Scanner(new File(fileName))) {

           while (scan.hasNextLine()) {
                     System.out.println(scan.nextLine());
           }
}

⑥ 한문자씩 읽어서 출력 (  FileReader )

※ char 를 체크할때 사용가능하다.

String fileName = "D:/sample.txt";
File
file = new File(fileName);

FileReader filereader = new FileReader(file);
int _ch = 0;
while((_ch = filereader.read()) != -1){
    System.out.print((char)_ch);

   // if( (char)_ch == '\r' ) { ... ... } 
// 필요시 문자체크

}
filereader.close();

 

 

파일쓰기

1) BufferedWriter

File file = new File("D:/sample.txt");

// new FileWriter(file, true) :
// [ 옵션 ]
//   default 는 false 이고
//   true 설정시 append로 기존 파일내용에 이어쓰기한다.
try (BufferedWriter bufwr = new BufferedWriter(new FileWriter(file, true))) {
    bufwr.write("한줄을 추가한다.");
    bufwr.newLine();  // 개행문자 입력
    bufwr.write("또 한줄을 추가한다.");
} catch (IOException e) {
    e.printStackTrace();
}

2) PrintWriter

File file = new File("D:/sample.txt");

// FileWriter Options : true(append), default(false:삭제후 쓰기)
try(PrintWriter _pw = new PrintWriter(new FileWriter(file, true))) {
    _pw.print("한줄을 입력한다.");
    _pw.println();
    _pw.write("새롭게 입력한다.\n");
    _pw.println("또 한줄을 입력한다.");
    _pw.printf("포메팅 : %s %d \n", "정수입력", 1234);
} catch (IOException e) {
    e.printStackTrace();
}

3) FileOutputStream

※ byte 단위로 파일을 쓰기 때문에 이미지 파일등 row byte를 파일에 쓸때 적합하다.

File file = new File("D:/sample.txt");

// byte 단위로 파일을 쓰기 때문에 이미지 파일등 row byte를 파일에 쓸때 적합하다.
try (FileOutputStream _fos = new FileOutputStream(file)) {
           _fos.write("한줄을 입력한다.\n".getBytes());
           _fos.write("또 한줄을 입력한다.".getBytes());
   
} catch (IOException e) {
    e.printStackTrace();
}

4)DataOutputStream

File file = new File("d:\\sample.txt");

try (DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file, true)))) {
           dos.writeUTF("안녕하세요 다함께 써용\n");
           dos.writeInt(200000);
} catch (IOException e) {
           e.printStackTrace();
}

 

 

 

 

 

 

 

 

 

 

디렉토리 읽기

Stream 객체를 통해 읽기

String path = "D:/";
Stream<Path> dir = Files.list(Paths.get(path));
dir.forEach(System.out::println);
dir.close();


String path = "D:/";
try(Stream<Path> dir = Files.list(Paths.get(path))) {
           dir.forEach(System.out::println);
}

DirectoryStream 객체를 통해 읽기

String path = "D:/";
DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(path));
stream.forEach(System.out::println);
stream.close();

 

디렉토리를 반복해서 검색하기
File.listFiles() 를 통해 반복해서 체크 또는 아래와 같이 Stream을 통해 체크

 String path = "D:/data";
 recv(Paths.get(path));

public static void recv(Path path) throws IOException {
      try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
            for (Path entry : stream) {
                  if (Files.isDirectory(entry)) {
                        System.out.println("DIR  : " + entry); // 메소드 부르기전 처리해야 순서대로 처리됨
                        recv(entry);
                  } else {
                        System.out.println("FILE : " + entry);
                  }
            }
      }
}

Files.walkFileTree 를 사용한 반복 검색

반환값의 종류

CONTINUE 계속진행한다.
TERMINATE 이후 검색을 종료한다.  특정 파일을 찾고 끝낼경우 이값을 리턴하면 된다.
SKIP_SUBTREE 하위 디렉토리 검색을 하지 않는다.
SKIP_SIBLINGS 형제 파일들을 검색하지 않는다.

※ 필요한 메소드만 상속받아 처리하면 된다.

String fileName = "D:/";
Path path = Paths.get(fileName);

try {
      Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
           
            /**
             * 파일에 접근했을때
             */
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                  System.out.println("FILE : " + file);
                  return FileVisitResult.CONTINUE;
            }

            /**
             * 디렉토리에 접근했을때
             */
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                  System.out.println("▶DIR  : " + dir);
                  return FileVisitResult.CONTINUE;
            }

            /**
             * 파일접근에 실패했을때
             *
             * 디폴트는 리턴은 예외를 발생시키고 정지한다.
             *  return FileVisitResult.CONTINUE; - 예외를 throws하지 않고 지속한다.
             */
            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                  System.out.println("■ERROR : " + file);
                  return FileVisitResult.CONTINUE;
            }

            /**
             * 디렉토리에 접근 후 떠날때
             */
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                  System.out.println("◀DIR  : " + dir);
                  return FileVisitResult.CONTINUE;
            }
      });
} catch (IOException e) {
      e.printStackTrace();
}