programing tip

전체 텍스트 파일을 Java의 문자열로

itbloger 2021. 1. 6. 07:51
반응형

전체 텍스트 파일을 Java의 문자열로


Java에는 C #과 같이 텍스트 파일을 읽는 한 줄 명령이 있습니까?

내 말은, Java에서 이것과 동등한 것이 있습니까? :

String data = System.IO.File.ReadAllText("path to file");

그렇지 않다면 ...이를 수행하는 '최적의 방법'은 무엇입니까 ...?

편집 :
Java 표준 라이브러리 내 방식을 선호합니다 ... 타사 라이브러리를 사용할 수 없습니다 ..


Java 11 은 샘플 코드 인 Files.readString을 사용하여이 사용 사례에 대한 지원을 추가 합니다.

Files.readString(Path.of("/your/directory/path/file.txt"));

Java 11 이전에는 표준 라이브러리를 사용한 일반적인 접근 방식은 다음과 같습니다.

public static String readStream(InputStream is) {
    StringBuilder sb = new StringBuilder(512);
    try {
        Reader r = new InputStreamReader(is, "UTF-8");
        int c = 0;
        while ((c = r.read()) != -1) {
            sb.append((char) c);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    return sb.toString();
}

메모:

  • file 에서 텍스트읽으 려면 FileInputStream을 사용하십시오.
  • 성능이 중요 하고 큰 파일을 읽는 경우 스트림을 BufferedInputStream으로 래핑하는 것이 좋습니다.
  • 호출자가 스트림을 닫아야합니다.

apache commons-io 에는 다음이 있습니다.

String str = FileUtils.readFileToString(file, "utf-8");

그러나 표준 자바 클래스에는 그러한 유틸리티가 없습니다. (어떤 이유로) 외부 라이브러리를 원하지 않는 경우이를 다시 구현해야합니다. 다음 은 몇 가지 예입니다. 또는 commons-io 또는 Guava에서 어떻게 구현되는지 확인할 수 있습니다.


기본 Java 라이브러리에는 없지만 Guava 를 사용할 수 있습니다 .

String data = Files.asCharSource(new File("path.txt"), Charsets.UTF_8).read();

또는 줄을 읽으려면 :

List<String> lines = Files.readLines( new File("path.txt"), Charsets.UTF_8 );

물론 비슷하게 쉽게 만들 수있는 다른 타사 라이브러리가 있다고 확신합니다. 저는 Guava에 가장 익숙합니다.


Java 7은 Files클래스 의 이러한 미안한 상태를 개선합니다 ( 동일한 이름 의 Guava 클래스 와 혼동하지 말 것 ). 파일에서 모든 행을 외부 라이브러리없이 가져올 수 있습니다.

List<String> fileLines = Files.readAllLines(path, StandardCharsets.UTF_8);

또는 하나의 문자열로 :

String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
// or equivalently:
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(path)));

깨끗한 JDK로 즉시 사용할 수있는 것이 필요한 경우 이것은 훌륭하게 작동합니다. 즉, Guava없이 Java를 작성하는 이유는 무엇입니까?


에서 자바 8 (외부 라이브러리) 당신은 스트림을 사용할 수 있습니다. 이 코드는 파일을 읽고 ','로 구분 된 모든 줄을 문자열에 넣습니다.

try (Stream<String> lines = Files.lines(myPath)) {
    list = lines.collect(Collectors.joining(", "));
} catch (IOException e) {
    LOGGER.error("Failed to load file.", e);
}

JDK / 11을 사용하면 다음을 사용하여 전체 파일을 Path문자열로 읽을 수 있습니다 Files.readString(Path path).

try {
    String fileContent = Files.readString(Path.of("/foo/bar/gus"));
} catch (IOException e) {
    // handle exception in i/o
}

JDK의 메소드 문서는 다음과 같습니다.

/**
 * Reads all content from a file into a string, decoding from bytes to characters
 * using the {@link StandardCharsets#UTF_8 UTF-8} {@link Charset charset}.
 * The method ensures that the file is closed when all content have been read
 * or an I/O error, or other runtime exception, is thrown.
 *
 * <p> This method is equivalent to:
 * {@code readString(path, StandardCharsets.UTF_8) }
 *
 * @param   path the path to the file
 *
 * @return  a String containing the content read from the file
 *
 * @throws  IOException
 *          if an I/O error occurs reading from the file or a malformed or
 *          unmappable byte sequence is read
 * @throws  OutOfMemoryError
 *          if the file is extremely large, for example larger than {@code 2GB}
 * @throws  SecurityException
 *          In the case of the default provider, and a security manager is
 *          installed, the {@link SecurityManager#checkRead(String) checkRead}
 *          method is invoked to check read access to the file.
 *
 * @since 11
 */
public static String readString(Path path) throws IOException 

외부 라이브러리가 필요하지 않습니다. 파일의 내용은 문자열로 변환되기 전에 버퍼링됩니다.

Path path = FileSystems.getDefault().getPath(directory, filename);
String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);

다음은 루프없이 텍스트 파일을 한 줄로 읽는 3 가지 방법입니다. 나는 자바로 파일을 읽는 15 가지 방법을 문서화 했고 이것들은 그 기사에서 나온 것이다.

Note that you still have to loop through the list that's returned, even though the actual call to read the contents of the file requires just 1 line, without looping.

1) java.nio.file.Files.readAllLines() - Default Encoding

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;

public class ReadFile_Files_ReadAllLines {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    List  fileLinesList = Files.readAllLines(file.toPath());

    for(String line : fileLinesList) {
      System.out.println(line);
    }
  }
}

2) java.nio.file.Files.readAllLines() - Explicit Encoding

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;

public class ReadFile_Files_ReadAllLines_Encoding {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    //use UTF-8 encoding
    List  fileLinesList = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);

    for(String line : fileLinesList) {
      System.out.println(line);
    }
  }
}

3) java.nio.file.Files.readAllBytes()

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class ReadFile_Files_ReadAllBytes {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    byte [] fileBytes = Files.readAllBytes(file.toPath());
    char singleChar;
    for(byte b : fileBytes) {
      singleChar = (char) b;
      System.out.print(singleChar);
    }
  }
}

No external libraries needed. The content of the file will be buffered before converting to string.

  String fileContent="";
  try {
          File f = new File("path2file");
          byte[] bf = new byte[(int)f.length()];
          new FileInputStream(f).read(bf);
          fileContent = new String(bf, "UTF-8");
      } catch (FileNotFoundException e) {
          // handle file not found exception
      } catch (IOException e) {
          // handle IO-exception
      }

Not quite a one liner and probably obsolete if using JDK 11 as posted by nullpointer. Still usefull if you have a non file input stream

InputStream inStream = context.getAssets().open(filename);
Scanner s = new Scanner(inStream).useDelimiter("\\A");
String string = s.hasNext() ? s.next() : "";
inStream.close();
return string;

ReferenceURL : https://stackoverflow.com/questions/3849692/whole-text-file-to-a-string-in-java

반응형