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


81

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

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

1 62 4 55 5 6 77

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

답변:


170

를 사용 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 스트림으로 데이터 처리


1
Java 7 및 8에서이 작업을 수행하는 더 좋은 방법이 있습니다. stackoverflow.com/questions/4716503/…
Alex Beardsley

34

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를 확인하십시오. 다른 유형의 입력 소스, 다른 구분 기호 및 다른 데이터 유형을 처리하기위한 더 많은 옵션이 있습니다.


2
이 버퍼링, IO, 독자 조합보다 기억하기 훨씬 쉽게입니다
avanderw

18

이 예제 코드는 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());                      
       }

     }
  }

10

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

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());
        }
    }
}

5

재미로, 내가 좋아하는 모든 라이브러리를 이미 사용하고있는 실제 프로젝트에서 수행 할 작업이 있습니다 (이 경우 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를 사용하지 않는 것이 어리석은 일입니다. ;-)


물론 루프 대신 Google Collections의 transform () 및 함수를 사용할 수도 있지만 IMHO는 읽기가 어렵고 더 짧지 않습니다.
Jonik

4

이와 같은 단순 / 일반적인 작업 에는 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(" "));

끝난.


2

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);

1

지금까지 주어진 모든 대답에는 파일을 한 줄씩 읽고 줄을으로 String가져온 다음 처리하는 것이 포함됩니다.String .

이것이 이해하기 가장 쉬운 방법이라는 것은 의심의 여지가 없으며, 파일이 상당히 짧은 경우 (예 : 수만 줄) 효율성 측면에서도 허용됩니다. 그러나 파일이 길면 다음 두 가지 이유로 매우 비효율적 인 방법입니다.

  1. 모든 문자는 두 번,를 구성 할 String때 한 번, 처리 할 때 한 번 처리됩니다.
  2. 파일에 줄이 많은 경우 가비지 수집기는 친구가 아닙니다. String각 줄에 대해 새 줄을 만들고 다음 줄로 이동할 때 버립니다. 가비지 수집기는 결국 String더 이상 원하지 않는 이러한 모든 개체 를 처리해야합니다 . 누군가 당신을 쫓아 내야합니다.

속도에 관심이 있다면 데이터 블록을 읽고 한 줄씩 처리하는 것보다 바이트 단위로 처리하는 것이 훨씬 낫습니다. 숫자의 끝에 올 때마다 List건물에 추가합니다 .

다음과 같이 나옵니다.

private List<Integer> readIntegers(File file) throws IOException {
    List<Integer> result = new ArrayList<>();
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    byte buf[] = new byte[16 * 1024];
    final FileChannel ch = raf.getChannel();
    int fileLength = (int) ch.size();
    final MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0,
            fileLength);
    int acc = 0;
    while (mb.hasRemaining()) {
        int len = Math.min(mb.remaining(), buf.length);
        mb.get(buf, 0, len);
        for (int i = 0; i < len; i++)
            if ((buf[i] >= 48) && (buf[i] <= 57))
                acc = acc * 10 + buf[i] - 48;
            else {
                result.add(acc);
                acc = 0;
            }
    }
    ch.close();
    raf.close();
    return result;
}

위의 코드는 이것이 ASCII라고 가정하고 (다른 인코딩에 대해 쉽게 조정할 수 있음) 숫자가 아닌 모든 것 (특히 공백 또는 줄 바꿈)은 숫자 사이의 경계를 나타냅니다. 또한 파일이 숫자가 아닌 것으로 끝나는 것으로 가정합니다 (실제로 마지막 줄은 개행으로 끝남). 그러나 그렇지 않은 경우를 처리하기 위해 조정할 수 있습니다.

그것은이다 훨씬 더 빨리, 더 의 어떤 것보다 String이 질문에 대한 답으로 주어진 기반 접근 방식. 이 질문에서 매우 유사한 문제 대한 자세한 조사가 있습니다. 다중 스레드 라인으로 이동하려는 경우 더 개선 할 가능성이 있음을 알 수 있습니다.


0

파일을 읽고 원하는대로 수행합니다. java8 Files.lines (Paths.get ( "c : //lines.txt")). collect (Collectors.toList ());

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.