2010-10-03 3 views
40

Имеет ли Java одну строку для чтения в текстовый файл, например, что у C#?Весь текстовый файл для строки в Java

Я имею в виду, есть ли что-то эквивалент этого в Java ?:

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

Если нет ... то, что это «оптимальный путь», чтобы сделать это ...?

Edit:
Я предпочитаю путь в пределах стандартных библиотек Java ... Я не могу использовать 3-библиотеки ..

+0

Я нашел этот пост полезным для меня. http://stackoverflow.com/questions/7463414/what-s-the-best-way-to-load-a-jsonobject-from-a-json-text-file – 2015-03-03 11:00:57

ответ

17

AFAIK, нет однострочного лайнера со стандартными библиотеками. Типичный подход со стандартными библиотеками будет что-то вроде этого:

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
  • поток должен быть закрыт вызывающими
+2

Буферный читатель имеет строку чтения, которая была бы лучше, чем чтение символа за раз – Steven

+0

Если бы вы использовали BufferedInputStream, это не изменило бы значение –

+0

Таким образом, он добавляет последний (-1) к строке. – Alec

20

Не в основных 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.

39

apache commons-io имеет:

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

Но нет такой утилиты в стандартных классов Java. Если вам (по какой-то причине) не нужны внешние библиотеки, вам придется переопределить его. Here - это несколько примеров, и вы также можете увидеть, как это реализовано commons-io или Guava.

+4

Я бы использовал файл FileUtils.readFileToString (файл, кодирование) 'version - может также рекомендовать хорошие привычки! – Nick

+0

@Nick - спасибо за предложение – Bozho

19

Java 7 улучшает на этом печальном положении дел с Files класса (не следует путать с гуавой-х class of the same name), вы можете получить все строки из файла - без внешнего библиотеки - с:

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 это прекрасно работает. Тем не менее, почему вы пишете Java без Guava?

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

Примечание ['String (byte [], String)'] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String%28byte [],% 20java. lang.String% 29) выдает «UnsupportedEncodingException». Вы должны предпочесть ['String (byte [], Charset)'] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String%28byte [],% 20java.nio.charset.Charset% 29) вместе с константами в ['StandardCharsets'] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html) или '' Charsets' Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Charsets.html). – dimo414

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

В Java 8 (без внешних библиотек), вы могли бы использовать потоки. Этот код считывает файл и помещает все строки, разделенные символом ',' в строку.

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

Используйте метод fileContentsFromLocalFilePath() в предоставленном Test класса ниже:

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 
Смежные вопросы