java 读取写入文件文本内容的多种方式及推荐
写入操作
-
Java使用OutputStream写入文本文件
-
Java使用PrintWriter写入文本文件
-
Java使用FileWriter写入文本文件
-
Java使用BufferedWriter写入文本文件
1.使用java.io.OutputStream写入文本文件
File file =new File("D:"+ File.separator+"testFileContent.txt");
if(!file.getParentFile().exists()){//文件不在
file.getParentFile().mkdirs();//创建父路径
}
try {
OutputStream outputStream=new FileOutputStream(file,false);//true表示拼接
String str1 ="菜鸟教程\r\n";
//outputStream.write(str.getBytes());//只能输出字节数组
//outputStream.write(str.getBytes("ISO8859-1"));//只能输出字节数组
outputStream.write(str1.getBytes("UTF-8"));//只能输出字节数组
String str2 ="www.runoob.com\r\n";
outputStream.write(str2.getBytes("UTF-8"));//只能输出字节数组
String str3 ="姓名:%s,年龄:%d,收入:%9.2f\r\n";
outputStream.write(str3.getBytes("UTF-8"));//只能输出字节数组
} catch (IOException e) {
e.printStackTrace();
}
利用字节流进行处理的时候,并不会使用到缓冲区,只能输出字节数组。不推荐!
2.使用java.io.PrintWriter写入文本文件
File file=new File("D:"+ File.separator+"testFileContent.txt");//定义操作文件
PrintWriter pu=new PrintWriter(new FileOutputStream(file));
String name="小童子";
int age=78;
double salary=72800;
//pu.printf("姓名:%s,年龄:%d,收入:%9.2f",name,age,salary);
pu.write("菜鸟教程");
pu.write("www.runoob.com");
pu.write("姓名:%s,年龄:%d,收入:%9.2f");
pu.close();
PrintWriter:是具有自动行刷新的缓冲字符输出流,这是一个高级流。所谓的自动行刷新,意思就是说:在构造函数中指定autoFlush
的值为true
时,则 println()
、printf()
或 format()
方法将自动刷新输出缓冲区(自动调用flush()
方法),但是,自动行刷新无疑会增加写出次数而降低写出效率。
从PrintWeiter的构造方法中我们就可以知道,该高级流很灵活,接下来我们会介绍BufferedWriter/BufferedReader这一对字符缓冲流,但是,由于BufferedWriter没有PrintWriter使用灵活,所以在实际的操作中,我们往往会使用PrinterWriter/BufferedReader这种组合。
PrintStream也可以代替PrintWriter,比较一下PrintStream与PrintWriter的区别:
在操作对象上:
PrintStream主要操作字节流,也就是说打印出来所有字符按照平台的编码转换为字节,所以一般用于二进制文件。(文本文件也是可以的)。字符串转换为字节流是平台相关的,也就是说 不同的系统或者环境,可能对于同一份字符串的输出字节流会有差异,不能够跨平台
PrintWriter主要操作字符,可以创建指定的字符集,一般用来读取文本文件,因为默认用unicode编码,所以PrintWriter的跨平台性要比PrintStream好,也就是说PrintWriter可用于操作中文。
在自动刷新方面:
PrintStream在遇到换行符的时候就会自动刷新,即在调用了println()方法,或者文本中出现“\n”,就会自动flush
PrintWriter则不会,要在构造方法中设置自动刷新,或者手动flush。参考这个方法设置自动更新:PrintWriter(OutputStream out, boolean autoFlush) 。autoFlush,该参数为boolean值,该值为true时,则具有了自动行刷新功能。
所以,PrintWriter不但能接收字符流,也能接收字节流。推荐!
3.使用java.io.FileWriter写入文本文件
File file =new File("D:"+ File.separator+"testFileContent.txt");
if(!file.getParentFile().exists()){//文件不在
file.getParentFile().mkdirs();//创建父路径
}
try {
//字符流,优势:中文处理方便!
Writer out=new FileWriter(file);
String str ="菜鸟教程\n";
out.write(str);//可以输出字符串
out.append("www.runoob.com\n");//追加输出字符串
out.append("姓名:%s,年龄:%d,收入:%9.2f\n");//追加输出字符串
out.close();//字符输出流必须关闭
} catch (IOException e) {
e.printStackTrace();
}
4.使用java.io.BufferedWriter写入文本文件
//创建一个字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("D:"+ File.separator+"testFileContent.txt")) ;
//写数据
bw.write("菜鸟教程\r\n");
bw.write("www.runoob.com\n");
bw.write("姓名:%s,年龄:%d,收入:%9.2f\r\n");
//刷新流
bw.flush();
//关闭资源
bw.close();
BufferedWriter:字符缓冲输出流(高级流),将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。BufferedWriter只能对字符流进行操作。
PrintWriter和BufferedWriter都是继承java.io.Writer,所以很多功能都一样。不过PrintWriter提供println()方法可以写不同平台的换行符,而BufferedWriter可以任意设定缓冲大小。OutputStream可以直接传给PrintWriter(BufferedWriter不能接收)。
Socket编程中,尽量用PrintWriter取代BufferedWriter,下面是PrintWriter的优点:
1. PrintWriter的print、println方法可以接受任意类型的参数,而BufferedWriter的write方法只能接受字符、字符数组和字符串;
2. PrintWriter的println方法自动添加换行,BufferedWriter需要显示调用newLine方法;
3. PrintWriter的方法不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生;
4. PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush);
5. PrintWriter的构造方法更广。
读取操作
- Java read text file using FileInputStream class
Java使用FileInputStream读取文本文件 - Java read text file using Files class
Java使用Files类读取文本文件 - Read text file in java using
FileReader
使用FileReader
读取Java中的文本文件 - Java read text file using BufferedReader
Java使用BufferedReader读取文本文件 - Using Scanner class to read text file in java
使用Scanner类读取Java中的文本文件
首先准备文档,路径:D:\testFileContent.TXT
菜鸟教程
www.runoob.com
姓名:%s,年龄:%d,收入:%9.2f
1.使用java.io.FileInputStream
在Java中读取文本文件:
File file =new File("D:"+ File.separator+"testFileContent.txt");
InputStream input=new FileInputStream(file) ;
byte data[]=new byte[1024]; //开辟一个缓冲区读取数据
int len=input.read(data);
System.out.println("【"+new String(data)+"】");
input.close();
输出(输出结果相同,下面例子省略...)
菜鸟教程
www.runoob.com
姓名:%s,年龄:%d,收入:%9.2f
最原始的方法,利用字节流读取数据,而且必须开辟缓冲区。不建议。
2.Java使用java.nio.file.Files
读取文本文件:
String fileName = "D:"+ File.separator+"testFileContent.txt";
Path path = Paths.get(fileName);
byte[] bytes = Files.readAllBytes(path);
List<String> allLines = Files.readAllLines(path, StandardCharsets.UTF_8);
for (int i = 0; i < allLines.size(); i++) {
System.out.println(allLines.get(i));
}
我们可以使用Files类将文件的所有内容读入字节数组。 Files类还具有一种读取所有行到字符串列表的方法。 Files类是Java 7中引入的,如果要加载所有文件内容,则很好。 仅在处理小型文件并且需要所有文件内容在内存中时,才应使用此方法。
3.使用java.io.FileReader
在Java中读取文本文件:
String fileName = "D:"+ File.separator+"testFileContent.txt";
File file = new File(fileName);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
while((line = br.readLine()) != null){
//process the line
System.out.println(line);
}
您可以使用FileReader获取BufferedReader,然后逐行读取文件。 FileReader不支持编码,并且与系统默认编码一起使用,因此,这不是在Java中读取文本文件的非常有效的方法
4.Java使用java.io.BufferedReader
读取文本文件:
String fileName = "D:"+ File.separator+"testFileContent.txt";
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line;
while((line = br.readLine()) != null){
//process the line
System.out.println(line);
}
br.close();
如果要逐行读取文件并对其进行处理,则BufferedReader很好。 这对于处理大文件非常有用,并且还支持编码。BufferedReader是同步的,因此可以安全地从多个线程完成对BufferedReader的读取操作。 BufferedReader的默认缓冲区大小为8KB。推荐!
5.使用扫描仪Scanner读取Java中的文本文件:
Scanner scan=new Scanner(new File("D:"+ File.separator+"testFileContent.txt"));
scan.useDelimiter("\n");//设置读取分隔符
while(scan.hasNext()){
System.out.println(scan.next());
}
scan.close();
如果要逐行或基于某些Java正则表达式读取文件,则使用Scanner类。扫描程序使用定界符模式将其输入分为令牌,默认情况下,该模式与空格匹配。 然后,可以使用各种下一种方法将生成的令牌转换为不同类型的值。 扫描器类未同步,因此不是线程安全的。