Javaには、C#のように、テキストファイルに読み込む1行の命令がありますか?
つまり、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();
}
ノート:
Apache commons-io には以下が含まれます:
String str = FileUtils.readFileToString(file, "utf-8");
しかし、標準のJavaクラスにはこのようなユーティリティはありません。(何らかの理由で)外部ライブラリが必要ない場合は、再実装する必要があります。 Here =はいくつかの例であり、代わりに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 );
もちろん、同様に簡単にする他のサードパーティのライブラリがあると確信しています-私はグアバに最も精通しています。
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を書いているのですか?
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では、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
外部ライブラリは必要ありません。ファイルの内容は、文字列に変換される前にバッファリングされます。
Path path = FileSystems.getDefault().getPath(directory, filename);
String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
ループを必要とせずに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);
}
}
}
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;
外部ライブラリは必要ありません。ファイルの内容は、文字列に変換される前にバッファリングされます。
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
}