How do I create a Java string from the contents of a file?
Asked Answered
L

35

1776

I've been using the idiom below for some time now. And it seems to be the most wide-spread, at least on the sites I've visited.

Is there a better/different way to read a file into a string in Java?

private String readFile(String file) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader (file));
    String line = null;
    StringBuilder stringBuilder = new StringBuilder();
    String ls = System.getProperty("line.separator");

    try {
        while((line = reader.readLine()) != null) {
            stringBuilder.append(line);
            stringBuilder.append(ls);
        }

        return stringBuilder.toString();
    } finally {
        reader.close();
    }
}
Lepidosiren answered 28/11, 2008 at 18:32 Comment(14)
Can anyone explain me in a very simple way what's with the NIO? Each time I read about itI get lost in the nth mention of channel :(Lepidosiren
do remember that it's not guaranteed that the line separator in the file isn't necessary the same as the system's line separator.Neri
Code above has a bug of adding extra new line char at the last line. It should be something like following if(line = reader.readLine() ) != null){ stringBuilder.append( line ); } while (line = reader.readLine() ) != null) { stringBuilder.append( ls ); stringBuilder.append( line ); }Extracellular
Java 7 introduces byte[] Files.readAllBytes(file); To those, who suggest the 'one-line' Scanner solution: Don't yo need to close it?Nombles
@Lepidosiren The biggest change for me is that NIO allows you to listen to many ports without allocating a thread for each. Not a problem unless you want to send a packet to every machine in a class B network address space (65k addresses) to see what exists, Windows runs out of threads at around 20k (Found this out solving exactly this problem--discovery of a class A/B network, before NIO it was tough).Jillayne
If you see the Files.readAllBytes() implementation, you will notice it is using a channel which is closeable. So no need to close it explicitly.Rosaceous
With the advent of Groovy, you can read the file thus: return new File( file).text()Threecornered
Linking another StackOverflow link, which find is well explained: #14170161Sharpsighted
@Extracellular The last line in a text file is usually line-terminated, so what you describe as a bug isn't one, and your code has the bug of removing all the line terminators.Cantle
Please accept an answer to your question and help put this to rest.Inconsumable
To all those poor souls who recommend using byte-based methods when obviously text should be handled: Our world will be hell as long as you persist in your ignorance. (I mean I'm lenient with 90s legacy code in this respect, but Goddammit we're in 2021, and globalization and non-ASCII characters is something.)Readus
@FranzD. What do you think is used to store that text in a file?Lepidosiren
@OscarRyz: Well, bytes, my dear Oscar. But byte-based methods tend not to handle to intricacies of byte <-> character conversions appropriately. And while that might work if you test your code with some ASCII or maybe even Latin-1, it will fail horribly and cause hours of work and frustration as soon as someone tries to read/write Chinese or some other "minor" (in THEIR world) language. Most of my former colleagues who proudly called themselves "software engineers" did neither know nor care about UTF-16 surrogates, and yes, I do call that ignorant, because that's what it is.Readus
@Franz D. Good, then you read bytes and decode using the appropriate character encoding. You're wrongly assuming the file would be encoding using UTF-16 but it could be literally anything else. It's strongly recommended to use UTF-8 for anything nowadays. Read the accepted answer, has very useful information.Lepidosiren
C
1845

Read all text from a file

Java 11 added the readString() method to read small files as a String, preserving line terminators:

String content = Files.readString(path, encoding);

For versions between Java 7 and 11, here's a compact, robust idiom, wrapped up in a utility method:

static String readFile(String path, Charset encoding)
  throws IOException
{
  byte[] encoded = Files.readAllBytes(Paths.get(path));
  return new String(encoded, encoding);
}

Read lines of text from a file

Java 7 added a convenience method to read a file as lines of text, represented as a List<String>. This approach is "lossy" because the line separators are stripped from the end of each line.

List<String> lines = Files.readAllLines(Paths.get(path), encoding);

Java 8 added the Files.lines() method to produce a Stream<String>. Again, this method is lossy because line separators are stripped. If an IOException is encountered while reading the file, it is wrapped in an UncheckedIOException, since Stream doesn't accept lambdas that throw checked exceptions.

try (Stream<String> lines = Files.lines(path, encoding)) {
  lines.forEach(System.out::println);
}

This Stream does need a close() call; this is poorly documented on the API, and I suspect many people don't even notice Stream has a close() method. Be sure to use an ARM-block as shown.

If you are working with a source other than a file, you can use the lines() method in BufferedReader instead.

Memory utilization

If your file is small enough relative to your available memory, reading the entire file at once might work fine. However, if your file is too large, reading one line at a time, processing it, and then discarding it before moving on to the next could be a better approach. Stream processing in this way can eliminate the total file size as a factor in your memory requirement.

Character encoding

One thing that is missing from the sample in the original post is the character encoding. This encoding generally can't be determined from the file itself, and requires meta-data such as an HTTP header to convey this important information.

The StandardCharsets class defines some constants for the encodings required of all Java runtimes:

String content = readFile("test.txt", StandardCharsets.UTF_8);

The platform default is available from the Charset class itself:

String content = readFile("test.txt", Charset.defaultCharset());

There are some special cases where the platform default is what you want, but they are rare. You should be able justify your choice, because the platform default is not portable. One example where it might be correct is when reading standard input or writing standard output.


Note: This answer largely replaces my Java 6 version. The utility of Java 7 safely simplifies the code, and the old answer, which used a mapped byte buffer, prevented the file that was read from being deleted until the mapped buffer was garbage collected. You can view the old version via the "edited" link on this answer.

Canzonet answered 28/11, 2008 at 18:56 Comment(2)
The memory utilization depends on the use case. If you can process a file line by line, without the need to keep processed lines, streaming over the lines requires the least memory. However, when you need all of them in memory, a list of string objects, one for each line, is everything but cheap. The overhead might be even larger than having a byte array and a (single) string in memory. If certain preconditions are met, the first solution, Files.readString(…), is the only one that can work without requiring additional memory.Wirra
@Wirra Ah, "the first" is no longer the first due to edits. I need to patch that up.Canzonet
H
398

If you're willing to use an external library, check out Apache Commons IO (200KB JAR). It contains an org.apache.commons.io.FileUtils.readFileToString() method that allows you to read an entire File into a String with one line of code.

Example:

import java.io.*;
import java.nio.charset.*;
import org.apache.commons.io.*;

public String readFile() throws IOException {
    File file = new File("data.txt");
    return FileUtils.readFileToString(file, StandardCharsets.UTF_8);
}
Havstad answered 28/11, 2008 at 18:44 Comment(0)
G
190

A very lean solution based on Scanner:

Scanner scanner = new Scanner( new File("poem.txt") );
String text = scanner.useDelimiter("\\A").next();
scanner.close(); // Put this call in a finally block

Or, if you want to set the charset:

Scanner scanner = new Scanner( new File("poem.txt"), "UTF-8" );
String text = scanner.useDelimiter("\\A").next();
scanner.close(); // Put this call in a finally block

Or, with a try-with-resources block, which will call scanner.close() for you:

try (Scanner scanner = new Scanner( new File("poem.txt"), "UTF-8" )) {
    String text = scanner.useDelimiter("\\A").next();
}

Remember that the Scanner constructor can throw an IOException. And don't forget to import java.io and java.util.

Source: Pat Niemeyer's blog

Gabrielagabriele answered 16/9, 2011 at 20:2 Comment(2)
\\A works because there is no "other beginning of file", so you are in fact read the last token...which is also the first. Never tried with \\Z. Also note you can read anything that is Readable , like Files, InputStreams, channels...I sometimes use this code to read from the display window of eclipse, when I'm not sure if I'm reading one file or another...yes, classpath confuses me.Gabrielagabriele
Scanner implements Closeable (it invokes close on the source) - so while elegant it shouldn't really be a one-liner. The default size of the buffer is 1024, but Scanner will increase the size as necessary (see Scanner#makeSpace())Translucid
B
162
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

Java 7

String content = new String(Files.readAllBytes(Paths.get("readMe.txt")), StandardCharsets.UTF_8);

Java 11

String content = Files.readString(Paths.get("readMe.txt"));
Breathing answered 28/10, 2016 at 7:4 Comment(0)
A
81

If you're looking for an alternative that doesn't involve a third-party library (e.g. Commons I/O), you can use the Scanner class:

private String readFile(String pathname) throws IOException {

    File file = new File(pathname);
    StringBuilder fileContents = new StringBuilder((int)file.length());        

    try (Scanner scanner = new Scanner(file)) {
        while(scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine() + System.lineSeparator());
        }
        return fileContents.toString();
    }
}
Amandy answered 28/11, 2008 at 19:0 Comment(0)
L
73

Guava has a method similar to the one from Commons IOUtils that Willi aus Rohr mentioned:

import com.google.common.base.Charsets;
import com.google.common.io.Files;

// ...

String text = Files.toString(new File(path), Charsets.UTF_8);

EDIT by PiggyPiglet
Files#toString is deprecated, and due for removal Octobor 2019. Instead use Files.asCharSource(new File(path), StandardCharsets.UTF_8).read();

EDIT by Oscar Reyes

This is the (simplified) underlying code on the cited library:

InputStream in = new FileInputStream(file);
byte[] b  = new byte[file.length()];
int len = b.length;
int total = 0;

while (total < len) {
  int result = in.read(b, total, len - total);
  if (result == -1) {
    break;
  }
  total += result;
}

return new String( b , Charsets.UTF_8 );

Edit (by Jonik): The above doesn't match the source code of recent Guava versions. For the current source, see the classes Files, CharStreams, ByteSource and CharSource in com.google.common.io package.

Lepidosiren answered 28/11, 2008 at 18:32 Comment(2)
This code has casting from long to int which could pop up some crazy behaviour with big files. Has extra spaces and where do you close the inputstream?Disgraceful
@M-T-A: The stream is closed, note the use of Closer in CharSource. The code in the answer isn't the actual, current Guava source.Subsidence
M
61
import java.nio.file.Files;

.......

 String readFile(String filename) {
            File f = new File(filename);
            try {
                byte[] bytes = Files.readAllBytes(f.toPath());
                return new String(bytes,"UTF-8");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "";
    }
Margenemargent answered 16/4, 2012 at 14:33 Comment(1)
or new String(Files.readAllBytes(Paths.get(filename))); :-)Decahedron
C
52

If you need a string processing (parallel processing) Java 8 has the great Stream API.

String result = Files.lines(Paths.get("file.txt"))
                    .parallel() // for parallel processing 
                    .map(String::trim) // to change line   
                    .filter(line -> line.length() > 2) // to filter some lines by a predicate                        
                    .collect(Collectors.joining()); // to join lines

More examples are available in JDK samples sample/lambda/BulkDataOperations that can be downloaded from Oracle Java SE 8 download page

Another one liner example

String out = String.join("\n", Files.readAllLines(Paths.get("file.txt")));
Castaway answered 29/10, 2014 at 8:51 Comment(1)
The stream returned by Files.lines(Paths.get("file.txt")) is not closed and is a resource leak. You should wrap in a try-with-resources block.Curare
S
51

That code will normalize line breaks, which may or may not be what you really want to do.

Here's an alternative which doesn't do that, and which is (IMO) simpler to understand than the NIO code (although it still uses java.nio.charset.Charset):

public static String readFile(String file, String csName)
            throws IOException {
    Charset cs = Charset.forName(csName);
    return readFile(file, cs);
}

public static String readFile(String file, Charset cs)
            throws IOException {
    // No real need to close the BufferedReader/InputStreamReader
    // as they're only wrapping the stream
    FileInputStream stream = new FileInputStream(file);
    try {
        Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
        StringBuilder builder = new StringBuilder();
        char[] buffer = new char[8192];
        int read;
        while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
            builder.append(buffer, 0, read);
        }
        return builder.toString();
    } finally {
        // Potential issue here: if this throws an IOException,
        // it will mask any others. Normally I'd use a utility
        // method which would log exceptions and swallow them
        stream.close();
    }        
}
Sporophyte answered 28/11, 2008 at 19:56 Comment(2)
Forgive me for reviving a comment this old, but did you mean to pass in a String object called "file", or should that be a File object instead?Merchantman
Great answer. +1. But this answer is 12 years old. Java now has try-with-resources.Legionnaire
F
33

Gathered all the possible ways to read the File as String from Disk or Network.

  • Guava: Google using classes Resources, Files

    static Charset charset = com.google.common.base.Charsets.UTF_8;
    public static String guava_ServerFile( URL url ) throws IOException {
        return Resources.toString( url, charset );
    }
    public static String guava_DiskFile( File file ) throws IOException {
        return Files.toString( file, charset );
    }
    

  • APACHE - COMMONS IO using classes IOUtils, FileUtils

    static Charset encoding = org.apache.commons.io.Charsets.UTF_8;
    public static String commons_IOUtils( URL url ) throws IOException {
        java.io.InputStream in = url.openStream();
        try {
            return IOUtils.toString( in, encoding );
        } finally {
            IOUtils.closeQuietly(in);
        }
    }
    public static String commons_FileUtils( File file ) throws IOException {
        return FileUtils.readFileToString( file, encoding );
        /*List<String> lines = FileUtils.readLines( fileName, encoding );
        return lines.stream().collect( Collectors.joining("\n") );*/
    }
    

  • Java 8 BufferReader using Stream API

    public static String streamURL_Buffer( URL url ) throws IOException {
        java.io.InputStream source = url.openStream();
        BufferedReader reader = new BufferedReader( new InputStreamReader( source ) );
        //List<String> lines = reader.lines().collect( Collectors.toList() );
        return reader.lines().collect( Collectors.joining( System.lineSeparator() ) );
    }
    public static String streamFile_Buffer( File file ) throws IOException {
        BufferedReader reader = new BufferedReader( new FileReader( file ) );
        return reader.lines().collect(Collectors.joining(System.lineSeparator()));
    }
    

  • Scanner Class with regex \A. which matches the beginning of input.

    static String charsetName = java.nio.charset.StandardCharsets.UTF_8.toString();
    public static String streamURL_Scanner( URL url ) throws IOException {
        java.io.InputStream source = url.openStream();
        Scanner scanner = new Scanner(source, charsetName).useDelimiter("\\A");
        return scanner.hasNext() ? scanner.next() : "";
    }
    public static String streamFile_Scanner( File file ) throws IOException {
        Scanner scanner = new Scanner(file, charsetName).useDelimiter("\\A");
        return scanner.hasNext() ? scanner.next() : "";
    }
    

  • Java 7 (java.nio.file.Files.readAllBytes)

    public static String getDiskFile_Java7( File file ) throws IOException {
        byte[] readAllBytes = java.nio.file.Files.readAllBytes(Paths.get( file.getAbsolutePath() ));
        return new String( readAllBytes );
    }
    

  • BufferedReader using InputStreamReader.

    public static String getDiskFile_Lines( File file ) throws IOException {
        StringBuffer text = new StringBuffer();
        FileInputStream fileStream = new FileInputStream( file );
        BufferedReader br = new BufferedReader( new InputStreamReader( fileStream ) );
        for ( String line; (line = br.readLine()) != null; )
            text.append( line + System.lineSeparator() );
        return text.toString();
    }
    

Example with main method to access the above methods.

public static void main(String[] args) throws IOException {
    String fileName = "E:/parametarisation.csv";
    File file = new File( fileName );

    String fileStream = commons_FileUtils( file );
            // guava_DiskFile( file );
            // streamFile_Buffer( file );
            // getDiskFile_Java7( file );
            // getDiskFile_Lines( file );
    System.out.println( " File Over Disk : \n"+ fileStream );


    try {
        String src = "https://code.jquery.com/jquery-3.2.1.js";
        URL url = new URL( src );

        String urlStream = commons_IOUtils( url );
                // guava_ServerFile( url );
                // streamURL_Scanner( url );
                // streamURL_Buffer( url );
        System.out.println( " File Over Network : \n"+ urlStream );
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

@see

Frictional answered 29/5, 2018 at 10:9 Comment(0)
D
27

If it's a text file why not use apache commons-io?

It has the following method

public static String readFileToString(File file) throws IOException

If you want the lines as a list use

public static List<String> readLines(File file) throws IOException
Doxia answered 17/10, 2011 at 15:34 Comment(0)
H
25

Since JDK 11:

String file = ...
Path path = Paths.get(file);
String content = Files.readString(path);
// Or readString(path, someCharset), if you need a Charset different from UTF-8
Houlihan answered 26/6, 2018 at 14:26 Comment(3)
Why, oh why, introduce new methods that rely on the default charset in 2018 ?Pneumoencephalogram
@Pneumoencephalogram this method doesn't rely on the default system charset. It defaults to UTF-8, that is fine.Houlihan
@Houlihan you're right ! so does Files.readAllLines ! that makes the files API not very consistent with older methods but it's for the better :)Pneumoencephalogram
C
17

To read a File as binary and convert at the end

public static String readFileAsString(String filePath) throws IOException {
    DataInputStream dis = new DataInputStream(new FileInputStream(filePath));
    try {
        long len = new File(filePath).length();
        if (len > Integer.MAX_VALUE) throw new IOException("File "+filePath+" too large, was "+len+" bytes.");
        byte[] bytes = new byte[(int) len];
        dis.readFully(bytes);
        return new String(bytes, "UTF-8");
    } finally {
        dis.close();
    }
}
Caparison answered 18/4, 2010 at 7:34 Comment(0)
T
17

With Java 7, this is my preferred option to read a UTF-8 file:

String content = new String(Files.readAllBytes(Paths.get(filename)), "UTF-8");

Since Java 7, the JDK has the new java.nio.file API, which provides many shortcuts, so 3rd party libraries are not always required for simple file operations.


Since people are still upvoting this answer, here is a better solution that got introduced in Java 11:

String content = Files.readString(path);
Tribulation answered 19/4, 2016 at 16:39 Comment(0)
W
15

Java attempts to be extremely general and flexible in all it does. As a result, something which is relatively simple in a scripting language (your code would be replaced with "open(file).read()" in python) is a lot more complicated. There doesn't seem to be any shorter way of doing it, except using an external library (like Willi aus Rohr mentioned). Your options:

  • Use an external library.
  • Copy this code into all your projects.
  • Create your own mini-library which contains functions you use often.

Your best bet is probably the 2nd one, as it has the least dependencies.

Whelp answered 28/11, 2008 at 18:52 Comment(3)
Yeap. It makes the "high" level language take a different meaning. Java is high level compared with C but low compared with Python or RubyLepidosiren
Agree that Java is long on high-level abstractions but short on convenience methodsUnderslung
True, Java has an insane number of ways of dealing with Files and many of them seem complicated. But this is fairly close to what we have in higher level languages: byte[] bytes = Files.readAllBytes(someFile.toPath());Swordtail
T
11

Using JDK 8 or above:

no external libraries used

You can create a new String object from the file content (Using classes from java.nio.file package):

public String readStringFromFile(String filePath) throws IOException {
    String fileContent = new String(Files.readAllBytes(Paths.get(filePath)));
    return fileContent;
}
Tufted answered 21/6, 2018 at 5:46 Comment(1)
Duplicate of Moritz Petersen answer who wrote:String content = new String(Files.readAllBytes(Paths.get(filename)), "UTF-8");Guenzi
S
7

There is a variation on the same theme that uses a for loop, instead of a while loop, to limit the scope of the line variable. Whether it's "better" is a matter of personal taste.

for(String line = reader.readLine(); line != null; line = reader.readLine()) {
    stringBuilder.append(line);
    stringBuilder.append(ls);
}
Seepage answered 28/11, 2008 at 20:33 Comment(2)
This will change the newlines to the default newline choise. This may be desirable, or unintended.Caparison
Rolled back the edit to this answer because the point was to narrow the scope of the line variable. The edit declared it twice, which would be a compile error.Seepage
N
7

If you do not have access to the Files class, you can use a native solution.

static String readFile(File file, String charset)
        throws IOException
{
    FileInputStream fileInputStream = new FileInputStream(file);
    byte[] buffer = new byte[fileInputStream.available()];
    int length = fileInputStream.read(buffer);
    fileInputStream.close();
    return new String(buffer, 0, length, charset);
}
Nonresistant answered 6/1, 2015 at 18:52 Comment(1)
example charset to invoke?Foxhound
C
4

A flexible solution using IOUtils from Apache commons-io in combination with StringWriter:

Reader input = new FileReader();
StringWriter output = new StringWriter();
try {
  IOUtils.copy(input, output);
} finally {
  input.close();
}
String fileContents = output.toString();

It works with any reader or input stream (not just with files), for example when reading from a URL.

Connell answered 15/2, 2012 at 10:47 Comment(0)
E
3
public static String slurp (final File file)
throws IOException {
    StringBuilder result = new StringBuilder();

    BufferedReader reader = new BufferedReader(new FileReader(file));

    try {
        char[] buf = new char[1024];

        int r = 0;

        while ((r = reader.read(buf)) != -1) {
            result.append(buf, 0, r);
        }
    }
    finally {
        reader.close();
    }

    return result.toString();
}
Enriqueenriqueta answered 8/2, 2010 at 19:51 Comment(3)
I think this has the inconvenience os using the platform default encoding. +1 anyway :)Lepidosiren
I seems to me that the finally block does not know variables defined in the try block. javac 1.6.0_21 throws the error cannot find symbol.Collide
Have you even tried your own code? You've defined reader in try/catch block, so it won't be accessible in finally block.Synn
I
3

This one uses the method RandomAccessFile.readFully, it seems to be available from JDK 1.0 !

public static String readFileContent(String filename, Charset charset) throws IOException {
    RandomAccessFile raf = null;
    try {
        raf = new RandomAccessFile(filename, "r");
        byte[] buffer = new byte[(int)raf.length()];
        raf.readFully(buffer);
        return new String(buffer, charset);
    } finally {
        closeStream(raf);
    }
} 


private static void closeStream(Closeable c) {
    if (c != null) {
        try {
            c.close();
        } catch (IOException ex) {
            // do nothing
        }
    }
}
Interclavicle answered 23/10, 2011 at 7:43 Comment(0)
I
3

Be aware when using fileInputStream.available() the returned integer does not have to represent the actual file size, but rather the guessed amount of bytes the system should be able to read from the stream without blocking IO. A safe and simple way could look like this

public String readStringFromInputStream(FileInputStream fileInputStream) {
    StringBuffer stringBuffer = new StringBuffer();
    try {
        byte[] buffer;
        while (fileInputStream.available() > 0) {
            buffer = new byte[fileInputStream.available()];
            fileInputStream.read(buffer);
            stringBuffer.append(new String(buffer, "ISO-8859-1"));
        }
    } catch (FileNotFoundException e) {
    } catch (IOException e) { }
    return stringBuffer.toString();
}

It should be considered that this approach is not suitable for multi-byte character encodings like UTF-8.

Irreformable answered 15/3, 2013 at 9:9 Comment(1)
This code may give unpredictable results. According to the documentation of the available() method, there is no guarantee that the end of file is reached in the event that the method returns 0. In that case you might end up with an incomplete file. What's worse, the number of bytes actually read can be smaller than the value returned by available(), in which case you get corrupted output.Connell
B
3

Using this library, it is one line:

String data = IO.from(new File("data.txt")).toString();
Begrime answered 10/12, 2016 at 15:55 Comment(1)
if the lines inside the library are not counted.Sniper
W
3

You can try Scanner and File class, a few lines solution

 try
{
  String content = new Scanner(new File("file.txt")).useDelimiter("\\Z").next();
  System.out.println(content);
}
catch(FileNotFoundException e)
{
  System.out.println("not found!");
}
Wende answered 7/2, 2017 at 6:10 Comment(0)
E
3

Based on @erickson`s answer, you can use:

public String readAll(String fileName) throws IOException {
    List<String> lines = Files.readAllLines(new File(fileName).toPath());
    return String.join("\n", lines.toArray(new String[lines.size()]));
}
Elam answered 1/4, 2018 at 13:34 Comment(0)
M
3

User java.nio.Files to read all lines of file.

public String readFile() throws IOException {
        File fileToRead = new File("file path");
        List<String> fileLines = Files.readAllLines(fileToRead.toPath());
        return StringUtils.join(fileLines, StringUtils.EMPTY);
}
Madalinemadalyn answered 26/10, 2018 at 6:38 Comment(0)
R
2

I cannot comment other entries yet, so I'll just leave it here.

One of best answers here (https://mcmap.net/q/45085/-how-do-i-create-a-java-string-from-the-contents-of-a-file):

private String readFile(String pathname) throws IOException {

File file = new File(pathname);
StringBuilder fileContents = new StringBuilder((int)file.length());
Scanner scanner = new Scanner(file);
String lineSeparator = System.getProperty("line.separator");

try {
    while(scanner.hasNextLine()) {        
        fileContents.append(scanner.nextLine() + lineSeparator);
    }
    return fileContents.toString();
} finally {
    scanner.close();
}
}

still has one flaw. It always puts new line char in the end of string, which may cause some weirds bugs. My suggestion is to change it to:

    private String readFile(String pathname) throws IOException {
    File file = new File(pathname);
    StringBuilder fileContents = new StringBuilder((int) file.length());
    Scanner scanner = new Scanner(new BufferedReader(new FileReader(file)));
    String lineSeparator = System.getProperty("line.separator");

    try {
        if (scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine());
        }
        while (scanner.hasNextLine()) {
            fileContents.append(lineSeparator + scanner.nextLine());
        }
        return fileContents.toString();
    } finally {
        scanner.close();
    }
}
Radium answered 13/12, 2013 at 9:33 Comment(1)
In the first case you might be adding an extra newline at the end. in the second case you might be omitting one. So both are equally wrong. See this articleEldoree
L
2

After Ctrl+F'ing after Scanner, I think that the Scanner solution should be listed too. In the easiest to read fashion it goes like this:

public String fileToString(File file, Charset charset) {
  Scanner fileReader = new Scanner(file, charset);
  fileReader.useDelimiter("\\Z"); // \Z means EOF.
  String out = fileReader.next();
  fileReader.close();
  return out;
}

If you use Java 7 or newer (and you really should) consider using try-with-resources to make the code easier to read. No more dot-close stuff littering everything. But that's mostly a stylistic choice methinks.

I'm posting this mostly for completionism, since if you need to do this a lot, there should be things in java.nio.file.Files that should do the job better.

My suggestion would be to use Files#readAllBytes(Path) to grab all the bytes, and feed it to new String(byte[] Charset) to get a String out of it that you can trust. Charsets will be mean to you during your lifetime, so beware of this stuff now.

Others have given code and stuff, and I don't want to steal their glory. ;)

Lasagne answered 29/11, 2015 at 14:9 Comment(0)
L
2

Also if your file happens to be inside a jar, you can also use this:

public String fromFileInJar(String path) {
    try ( Scanner scanner 
            = new Scanner(getClass().getResourceAsStream(path))) {
        return scanner.useDelimiter("\\A").next();
    }
}

The path should start with / for instance if your jar is

my.jar/com/some/thing/a.txt

Then you want to invoke it like this:

String myTxt = fromFileInJar("/com/com/thing/a.txt");
Lepidosiren answered 15/2, 2017 at 21:15 Comment(0)
C
2

In one line (Java 8), assuming you have a Reader:

String sMessage = String.join("\n", reader.lines().collect(Collectors.toList()));
Cornucopia answered 15/3, 2017 at 2:39 Comment(0)
M
1

Use code:

File file = new File("input.txt");
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(
                file));
byte[] buffer = new byte[(int) file.length()];
bin.read(buffer);
String fileStr = new String(buffer);

fileStr contains output in String.

Mahmoud answered 16/1, 2017 at 6:53 Comment(0)
W
1

Using BufferedReader as mentioned in comments before but this way is more readable:

String FILE_PATH = "filepath.txt";

try (FileReader fileReader = new FileReader(FILE_PATH)) {
    BufferedReader fileBufferReader = new BufferedReader(fileReader);
    String text = fileBufferReader.lines()
        .collect(Collectors.joining(System.lineSeparator()));
    System.out.println(text);
} catch (IOException e) {
    // exception handling
}

Widthwise answered 24/1, 2023 at 2:38 Comment(0)
C
0
Scanner sc = new Scanner(new File("yourFile.txt"));
sc.useDelimiter("\\Z");

String s = sc.next();
Coffeehouse answered 4/2, 2022 at 18:39 Comment(0)
S
-1

Pure kotlin code with no dependencies

Works on all android versions

val fileAsString = file.bufferedReader().use { it.readText() }
Scarecrow answered 17/11, 2022 at 18:55 Comment(0)
F
-2

in java 8 , there are a new Class

java.util.stream.Stream

A stream represents a sequence of elements and supports different kind of operations to perform computations upon those elements

to Read more about it :

Oracle Documentation

Here an Example :

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public Class ReadFile{
  public  static String readFile(String filePath) {
 StringBuilder  stringBuilder = new StringBuilder();
    String ls = System.getProperty("line.separator");
        try {

            try (Stream<String> lines = Files.lines(Paths.get(filePath), StandardCharsets.UTF_8)) {
                for (String line : (Iterable<String>) lines::iterator) {


                      stringBuilder.append(line);
                      stringBuilder.append(ls);


                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

      return stringBuilder.toString(); 


}

}
Frameup answered 6/12, 2016 at 12:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.