如何在java中获取文件内容?

时间:2011-04-12 20:16:24

标签: java java-io

获取txt文件的内容我通常使用扫描仪并遍历每一行以获取内容:

Scanner sc = new Scanner(new File("file.txt"));
while(sc.hasNextLine()){
    String str = sc.nextLine();                     
}

java api是否提供了使用一行代码获取内容的方法,如:

String content = FileUtils.readFileToString(new File("file.txt"))

6 个答案:

答案 0 :(得分:26)

不是内置的API - 但Guava确实是其他宝藏之一。 (这是一个神话般的图书馆。)

String content = Files.toString(new File("file.txt"), Charsets.UTF_8);

有类似的方法可以读取任何Readable,或者将二进制文件的全部内容作为字节数组加载,或者将文件读入字符串列表等。

请注意,此方法现已弃用。新的等价物是:

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

答案 1 :(得分:15)

使用Java 7,这些行就有一个API。

Files.readAllLines(Path path, Charset cs)

答案 2 :(得分:14)

commons-io有:

IOUtils.toString(new FileReader("file.txt"), "utf-8");

答案 3 :(得分:8)

public class MyClass 
{
  // variable 'a' is initialize as a = 5 only once
  private int a = 5;

  private void CalculateSum(int b)
  {
    // every time the function is called it uses this (a) value
    int sum  = a + b;

    // But if sum = 10... 
    if (sum == 10)
    {
        // then value of 'a' changes to 10
        a = 10; 
    }
  }

  // Some other code here 
}

来自https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Files.html#readString(java.nio.file.Path)

答案 4 :(得分:4)

您可以将FileReader类与BufferedReader一起使用来读取文本文件。

File fileToRead = new File("file.txt");

try( FileReader fileStream = new FileReader( fileToRead ); 
    BufferedReader bufferedReader = new BufferedReader( fileStream ) ) {

    String line = null;

    while( (line = bufferedReader.readLine()) != null ) {
        //do something with line
    }

    } catch ( FileNotFoundException ex ) {
        //exception Handling
    } catch ( IOException ex ) {
        //exception Handling
}

我希望我有所帮助。 :)

答案 5 :(得分:0)

经过一些测试,我发现BufferedReaderScanner在各种情况下都是有问题的(前者经常无法检测到新行,而后者通常会从JSON字符串中剥离空格)由 org.json 库导出)。还有其他方法可用,但是问题是它们仅在某些Java版本(例如,对于Android开发人员而言是不好的)之后才受支持,并且您可能不希望仅为这样的单一目的而使用Guava或Apache commons库。因此,我的解决方案是将整个文件读取为字节,然后将其转换为字符串。以下代码摘自我的一个爱好项目:

    /**
     * Get byte array from an InputStream most efficiently.
     * Taken from sun.misc.IOUtils
     * @param is InputStream
     * @param length Length of the buffer, -1 to read the whole stream
     * @param readAll Whether to read the whole stream
     * @return Desired byte array
     * @throws IOException If maximum capacity exceeded.
     */
    public static byte[] readFully(InputStream is, int length, boolean readAll)
            throws IOException {
        byte[] output = {};
        if (length == -1) length = Integer.MAX_VALUE;
        int pos = 0;
        while (pos < length) {
            int bytesToRead;
            if (pos >= output.length) {
                bytesToRead = Math.min(length - pos, output.length + 1024);
                if (output.length < pos + bytesToRead) {
                    output = Arrays.copyOf(output, pos + bytesToRead);
                }
            } else {
                bytesToRead = output.length - pos;
            }
            int cc = is.read(output, pos, bytesToRead);
            if (cc < 0) {
                if (readAll && length != Integer.MAX_VALUE) {
                    throw new EOFException("Detect premature EOF");
                } else {
                    if (output.length != pos) {
                        output = Arrays.copyOf(output, pos);
                    }
                    break;
                }
            }
            pos += cc;
        }
        return output;
    }

    /**
     * Read the full content of a file.
     * @param file The file to be read
     * @param emptyValue Empty value if no content has found
     * @return File content as string
     */
    @NonNull
    public static String getFileContent(@NonNull File file, @NonNull String emptyValue) {
        if (file.isDirectory()) return emptyValue;
        try {
            return new String(readFully(new FileInputStream(file), -1, true), Charset.defaultCharset());
        } catch (IOException e) {
            e.printStackTrace();
            return emptyValue;
        }
    }

您可以简单地使用getFileContent(file, "")来读取文件的内容。