[java] 자바 : 텍스트 파일 읽는 방법

공백으로 구분 된 값이 포함 된 텍스트 파일을 읽고 싶습니다. 값은 정수입니다. 어떻게 읽고 배열 목록에 넣을 수 있습니까?

다음은 텍스트 파일 내용의 예입니다.

1 62 4 55 5 6 77

나는 그것을 arraylist에 [1, 62, 4, 55, 5, 6, 77]. Java에서 어떻게 할 수 있습니까?



답변

를 사용 Files#readAllLines()하여 텍스트 파일의 모든 줄을 List<String>.

for (String line : Files.readAllLines(Paths.get("/path/to/file.txt"))) {
    // ...
}

튜토리얼 : 기본 I / O> 파일 I / O> 텍스트 파일 읽기, 쓰기 및 만들기


정규식에 따라 in 부분 String#split()을 분할하는 데 사용할 수 있습니다 String.

for (String part : line.split("\\s+")) {
    // ...
}

자습서 : 숫자 및 문자열> 문자열> 문자열에서 문자 조작


당신은 사용할 수 있습니다 Integer#valueOf()을 변환 StringInteger.

Integer i = Integer.valueOf(part);

튜토리얼 : 숫자와 문자열> 문자열> 숫자와 문자열 간 변환


List#add()요소를 추가하는 데 사용할 수 있습니다 List.

numbers.add(i);

자습서 : 인터페이스> 목록 인터페이스


따라서 간단히 말해서 (파일에 빈 줄이나 후행 / 선행 공백이 없다고 가정).

List<Integer> numbers = new ArrayList<>();
for (String line : Files.readAllLines(Paths.get("/path/to/file.txt"))) {
    for (String part : line.split("\\s+")) {
        Integer i = Integer.valueOf(part);
        numbers.add(i);
    }
}

이미 Java 8을 사용하는 경우 .NET으로 시작 하는 Stream API 를 사용할 수도 있습니다 Files#lines().

List<Integer> numbers = Files.lines(Paths.get("/path/to/test.txt"))
    .map(line -> line.split("\\s+")).flatMap(Arrays::stream)
    .map(Integer::valueOf)
    .collect(Collectors.toList());

자습서 : Java 8 스트림으로 데이터 처리


답변

Java 1.5는 파일 및 스트림의 입력을 처리하기위한 Scanner 클래스를 도입했습니다 .

파일에서 정수를 가져 오는 데 사용되며 다음과 같습니다.

List<Integer> integers = new ArrayList<Integer>();
Scanner fileScanner = new Scanner(new File("c:\\file.txt"));
while (fileScanner.hasNextInt()){
   integers.add(fileScanner.nextInt());
}

그래도 API를 확인하십시오. 다른 유형의 입력 소스, 다른 구분 기호 및 다른 데이터 유형을 처리하기위한 더 많은 옵션이 있습니다.


답변

이 예제 코드는 Java에서 파일을 읽는 방법을 보여줍니다.

import java.io.*;

/**
 * This example code shows you how to read file in Java
 *
 * IN MY CASE RAILWAY IS MY TEXT FILE WHICH I WANT TO DISPLAY YOU CHANGE WITH YOUR   OWN
 */

 public class ReadFileExample
 {
    public static void main(String[] args)
    {
       System.out.println("Reading File from Java code");
       //Name of the file
       String fileName="RAILWAY.txt";
       try{

          //Create object of FileReader
          FileReader inputFile = new FileReader(fileName);

          //Instantiate the BufferedReader Class
          BufferedReader bufferReader = new BufferedReader(inputFile);

          //Variable to hold the one line data
          String line;

          // Read file line by line and print on the console
          while ((line = bufferReader.readLine()) != null)   {
            System.out.println(line);
          }
          //Close the buffer reader
          bufferReader.close();
       }catch(Exception e){
          System.out.println("Error while reading file line by line:" + e.getMessage());
       }

     }
  }


답변

이 예를보고 직접 시도해보십시오.

import java.io.*;

public class ReadFile {

    public static void main(String[] args){
        String string = "";
        String file = "textFile.txt";

        // Reading
        try{
            InputStream ips = new FileInputStream(file);
            InputStreamReader ipsr = new InputStreamReader(ips);
            BufferedReader br = new BufferedReader(ipsr);
            String line;
            while ((line = br.readLine()) != null){
                System.out.println(line);
                string += line + "\n";
            }
            br.close();
        }
        catch (Exception e){
            System.out.println(e.toString());
        }

        // Writing
        try {
            FileWriter fw = new FileWriter (file);
            BufferedWriter bw = new BufferedWriter (fw);
            PrintWriter fileOut = new PrintWriter (bw);
                fileOut.println (string+"\n test of read and write !!");
            fileOut.close();
            System.out.println("the file " + file + " is created!");
        }
        catch (Exception e){
            System.out.println(e.toString());
        }
    }
}


답변

재미로, 내가 좋아하는 모든 라이브러리를 이미 사용하고있는 실제 프로젝트에서 수행 할 작업이 있습니다 (이 경우 Guava , 이전에 Google Collections ).

String text = Files.toString(new File("textfile.txt"), Charsets.UTF_8);
List<Integer> list = Lists.newArrayList();
for (String s : text.split("\\s")) {
    list.add(Integer.valueOf(s));
}

이점 : 유지 관리 할 자체 코드가 많지 않습니다 (예 : this 과 대조 ). 편집 :이 경우 tschaible의 스캐너 솔루션에 더 이상 코드 가 없다는 점은 주목할 가치가 있습니다!

단점 : 분명히이를 위해 새로운 라이브러리 종속성을 추가하고 싶지 않을 수 있습니다. (그러면 프로젝트에서 Guava를 사용하지 않는 것이 어리석은 일입니다. 😉


답변

이와 같은 단순 / 일반적인 작업 에는 Apache Commons (IO 및 Lang)를 사용하십시오 .

수입품 :

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.ArrayUtils;

암호:

String contents = FileUtils.readFileToString(new File("path/to/your/file.txt"));
String[] array = ArrayUtils.toArray(contents.split(" "));

끝난.


답변

Java 7을 사용하여 NIO.2로 파일 읽기

다음 패키지를 가져옵니다.

import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

다음은 파일을 읽는 프로세스입니다.

Path file = Paths.get("C:\\Java\\file.txt");

if(Files.exists(file) && Files.isReadable(file)) {

    try {
        // File reader
        BufferedReader reader = Files.newBufferedReader(file, Charset.defaultCharset());

        String line;
        // read each line
        while((line = reader.readLine()) != null) {
            System.out.println(line);
            // tokenize each number
            StringTokenizer tokenizer = new StringTokenizer(line, " ");
            while (tokenizer.hasMoreElements()) {
                // parse each integer in file
                int element = Integer.parseInt(tokenizer.nextToken());
            }
        }
        reader.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

한 번에 파일의 모든 행을 읽으려면 :

Path file = Paths.get("C:\\Java\\file.txt");
List<String> lines = Files.readAllLines(file, StandardCharsets.UTF_8);