1. 使用 JDK 5 的 Scanner
package cc.unmi.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Scanner;
/**
*
* @author Unmi
* @Creation date: 2013-02-01
*/
public class Test {
/**
* @param args
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
InputStream inputStream = new FileInputStream("d:/sample.txt");
Scanner scanner = new Scanner(inputStream, "UTF-8");
String text = scanner.useDelimiter("\\A").next();
System.out.println(text);
scanner.close();
}
}
2. JDK1.4 及之前的 BufferedReader 法
package cc.unmi.test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
*
* @author Unmi
* @Creation date: 2013-02-01
*/
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("d:/sample.txt");
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
boolean firstLine = true;
String line = null; ;
while((line = bufferedReader.readLine()) != null){
if(!firstLine){
stringBuilder.append(System.getProperty("line.separator"));
}else{
firstLine = false;
}
stringBuilder.append(line);
}
System.out.println(stringBuilder.toString());
}
}
中间那些判断是不是第一行来决定是否加换行符是些杂音。
3. JDK1.4 及之前的 readBytes 法
package cc.unmi.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
*
* @author Unmi
* @Creation date: 2013-02-01
*/
public class Test {
/**
* @throws IOException
*/
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("d:/sample.txt");
byte[] buffer = new byte[2048];
int readBytes = 0;
StringBuilder stringBuilder = new StringBuilder();
while((readBytes = inputStream.read(buffer)) > 0){
stringBuilder.append(new String(buffer, 0, readBytes));
}
System.out.println(stringBuilder.toString());
}
}
缓冲区的大小自己根据实际来调,比 BufferedReader 还简洁些,不需管换行符的事情。
4. Apache commons IOUtils.toString 法
package cc.unmi.test;
import java.io.*;
import org.apache.commons.io.IOUtils;
/**
*
* @author Unmi
* @Creation date: 2013-02-01
*/
public class Test {
/**
* @throws IOException
*/
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("d:/sample.txt");
String text = IOUtils.toString(inputStream);
System.out.println(text);
}
}
第三方库就是第三方库,人家充分考虑到了你的感受,你对 JDK 库的抱怨,多简洁,一行搞定。IOUtils 还能把内容拷入其他的 Writer 中,如 IOUtils.copy(inputStream, new StringWriter())。
5. Google guava 的 CharStreams 方法
package cc.unmi.test;
import java.io.*;
import com.google.common.io.CharStreams;
/**
*
* @author Unmi
* @Creation date: 2013-02-01
*/
public class Test {
/**
* @throws IOException
*/
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("d:/sample.txt");
String text = CharStreams.toString(new InputStreamReader(inputStream, "UTF-8"));
System.out.println(text);
}
}
CharSteams 不是直接作用在 InputSteam 上的,还要靠 InputStreamReader 拱个桥。
6. JDK 7 的 NIO readAllBytes
package cc.unmi.test;
import java.io.IOException;
import java.nio.file.*;
/**
*
* @author Unmi
* @Creation date: 2013-02-01
*/
public class Test {
/**
* @throws IOException
*/
public static void main(String[] args) throws IOException {
byte[] bytes = Files.readAllBytes(Paths.get("d:/sample.txt"));
String text = new String(bytes);
System.out.println(text);
}
}
这让我们相信 JDK 一直还有人在管,虽然不可能象动态语言的方法那么快捷,上面的 readAllBytes 在处理大文件时肯定会很被动的。而 Files.readAllLines 会把文件的内容读入一个 List