Arquivo de texto inteiro para uma string em Java

O Java tem uma instrução de uma linha para ler um arquivo de texto, como o que o C # possui?

Quer dizer, existe algo equivalente a isso em Java ?:

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

Se não … qual é o “caminho ideal” para fazer isso …?

Editar:
Eu prefiro uma maneira dentro de bibliotecas padrão Java … Eu não posso usar bibliotecas de terceiros ..

AFAIK, não existe uma única linha com bibliotecas padrão. Abordagem típica com bibliotecas padrão seria algo assim:

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

Notas:

  • Para ler o texto do arquivo , use FileInputStream
  • Se o desempenho for importante e você estiver lendo arquivos grandes, seria aconselhável envolver o stream no BufferedInputStream
  • o stream deve ser fechado pelo chamador

apache commons-io tem:

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

Mas não existe esse utilitário nas classs java padrão. Se você (por algum motivo) não quiser bibliotecas externas, terá que reimplementá-lo. Aqui estão alguns exemplos e, alternativamente, você pode ver como ele é implementado por commons-io ou Guava.

Não dentro das principais bibliotecas Java, mas você pode usar o Guava :

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

Ou para ler linhas:

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

É claro que tenho certeza de que existem outras bibliotecas de terceiros que facilitariam o processo de forma similar – estou mais familiarizado com o Guava.

O Java 7 melhora este estado de coisas com a class Files (não confundir com a class de Guava do mesmo nome ), você pode obter todas as linhas de um arquivo – sem bibliotecas externas – com:

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

Ou em uma string:

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

Se você precisa de algo fora da checkbox com um JDK limpo, isso funciona muito bem. Dito isso, por que você está escrevendo Java sem o Google?

No Java 8 (sem bibliotecas externas) você poderia usar streams. Este código lê um arquivo e coloca todas as linhas separadas por ‘,’ em uma String.

 try (Stream lines = Files.lines(myPath)) { list = lines.collect(Collectors.joining(", ")); } catch (IOException e) { LOGGER.error("Failed to load file.", e); } 
 Path path = FileSystems.getDefault().getPath(directory, filename); String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8); 
  String fileContent=""; try { File f = new File("path2file"); FileInputStream inp = new FileInputStream(f); byte[] bf = new byte[(int)f.length()]; inp.read(bf); fileContent = new String(bf, "UTF-8"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

Use o método fileContentsFromLocalFilePath() na class de Test fornecida abaixo:

 import org.apache.commons.io.IOUtils; import java.io.*; public class Test { private static String fileContentsFromLocalFilePath(String localFilePath) { //initially empty file content String emptyContent = ""; try { //we assume that file exists File localFile = new File(localFilePath); //if local file does not exist (as a directory or a file); //else if local file does exist, but does not refer to file; throw exception if(!localFile.exists() || (localFile.exists() && !localFile.isFile())) throw new IllegalArgumentException("Provided path: " + localFilePath + "does not exist or it does not refer to a file"); //at this point localFile exists and it is actually a file InputStream inputStream = new FileInputStream(localFile); //write the result to String writer StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, "UTF-8"); //return the file contents string return writer.toString(); } // try catch(Exception ex) { //report the exception to the user ex.printStackTrace(); //in other cases return empty string return emptyContent; } // catch } // fileContentsFromLocalFilePath } // Test 

Aqui estão 3 maneiras de ler um arquivo de texto em uma linha, sem exigir um loop. Eu documentei 15 maneiras de ler de um arquivo em Java e estas são desse artigo.

Observe que você ainda precisa percorrer a lista retornada, mesmo que a chamada real para ler o conteúdo do arquivo exija apenas 1 linha, sem loop.

1) java.nio.file.Files.readAllLines () – Codificação Padrão

 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 () – codificação explícita

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