web-dev-qa-db-ja.com

テキストファイル全体をJava

Javaには、C#のように、テキストファイルに読み込む1行の命令がありますか?

つまり、Javaにはこれと同等のものがありますか?

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

そうでない場合...これを行うための「最適な方法」は何ですか?

編集:
Java標準ライブラリ...内の方法を好みます...サードパーティのライブラリを使用できません。

56
Betamoo

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

ノート:

  • ファイルからテキストを読み取るには、FileInputStreamを使用します
  • パフォーマンスが重要な場合、大きなファイルを読み込んでいる場合は、BufferedInputStreamでストリームをラップすることをお勧めします
  • ストリームは呼び出し元によって閉じられる必要があります
22
Neeme Praks

Apache commons-io には以下が含まれます:

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

しかし、標準のJavaクラスにはこのようなユーティリティはありません。(何らかの理由で)外部ライブラリが必要ない場合は、再実装する必要があります。 Here =はいくつかの例であり、代わりにcommons-ioまたはGuavaによってどのように実装されるかを見ることができます。

45
Bozho

メインの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 );

もちろん、同様に簡単にする他のサードパーティのライブラリがあると確信しています-私はグアバに最も精通しています。

27
Jon Skeet

Java 7は、この残念な状況を Files クラス(グアバの 同名のクラス と混同しないでください)で改善します。ファイルからの行-外部ライブラリなし-あり:

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

または1つの文字列に:

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

きれいなJDKですぐに使えるものが必要な場合は、これで十分です。とはいえ、なぜグアバなしでJavaを書いているのですか?

24
dimo414

Java 8(外部ライブラリなし)では、ストリームを使用できます。このコードはファイルを読み取り、「、」で区切られたすべての行をストリングに入れます。

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

JDK/11では、Files.readString(Path 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 
4
Naman

外部ライブラリは必要ありません。ファイルの内容は、文字列に変換される前にバッファリングされます。

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

ループを必要とせずに1行でテキストファイルを読み取る3つの方法を次に示します。 Javaのファイルから読み取る15の方法 を文書化しましたが、これらはその記事からです。

ファイルの内容を読み取るための実際の呼び出しはループせずに1行だけで済みますが、返されるリストをループする必要があることに注意してください。

1)Java.nio.file.Files.readAllLines()-デフォルトのエンコード

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()-明示的なエンコーディング

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);
    }
  }
}
0
gomisha

Nullpointerによって投稿されたJDK 11を使用する場合、ライナーは1つではなく、おそらく廃止されます。非ファイル入力ストリームがある場合でも有用です

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

外部ライブラリは必要ありません。ファイルの内容は、文字列に変換される前にバッファリングされます。

  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
      }
0
SzB