Java写文件的方式:FileOutputStream vs. FileWriter

一般用Java写文件常用的两种方式就是FileOutputStream 和FileWriter。

使用FileOutputStream:

File fout = new File(file_location_string);
FileOutputStream fos = new FileOutputStream(fout);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos));
out.write("something");

使用FileWriter:

FileWriter fstream = new FileWriter(file_location_string);
BufferedWriter out = new BufferedWriter(fstream);
out.write("something");

Java API给出的解释是:FileOutputStream是用来输出原始字节流的,如图像数据。要输出字符流,则使用FileWriter。

下面从两者的实现上面来分析,先看2段代码:
1,
FileWriter fw=new FileWriter("c:\test.txt");
fw.write("abcdefgh");
2,
FileOutputStream fos=new FileOutputStream("c:\test.txt");
fos.write("abcdefgh".getBytes());
两段代码都能创建test.txt的文件,但第一段代码创建的文件内容为空,第二段代码中有内容写入。
因为FileWriter继承自OutputStreamWriter,调用FileWriter的方法就是调用OutputStreamWriter的write方法,而在OutputStreamWriter中有一个StreamEncoder对象,调用OutputStreamWriter的write方法,其实就是调用的StreamEncoder的write方法。在StreamEncoder中有一个字节缓冲区,会先把准备写入目的的字符先转变为字节,等缓冲区满了或者流被刷新后,流中的数据就写到目的中去。所以,第一段代码由于没有刷新流,所以实际上是写到了StreamEncoder的字节缓冲区中去了;所以文件中没有内容!
FileOutputStream直接继承自OutputStream,调用FileOutputStream的write方法的时候,实际上就在调用底层的写方法,把数据直接写到文件中去了,没有缓存。
如果要在已有文件后面加内容而不覆盖已有内容,在new FileWriter时多传递一个true参数。如new FileWriter(file, true); 
下面是一个FileWriter的example:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
 
public class Main {
	public static void main(String[] args) throws IOException {
		File dir = new File(".");
		String loc = dir.getCanonicalPath() + File.separator + "Code.txt";
 
		FileWriter fstream = new FileWriter(loc, true);
		BufferedWriter out = new BufferedWriter(fstream);
 
		out.write("something");
		out.newLine();
 
		//close buffer writer
		out.close();
	}
}


FileOutputStream的example:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class WriteFileExample {
        public static void main(String[] args) {

                File file = new File("/Users/heilang/MySpace/newfile1.txt");
                String content = "This is the text content";

                try (FileOutputStream fop = new FileOutputStream(file)) {

                        // if file doesn't exists, then create it
                        if (!file.exists()) {
                                file.createNewFile();
                        }

                        // get the content in bytes
                        byte[] contentInBytes = content.getBytes();

                        fop.write(contentInBytes);
                        fop.flush();
                        fop.close();

                        System.out.println("Done");

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

上面FileOutputStream是直接写的字节流,也可以用OutputStreamWriter将字节流转换成字符流,下面是example:

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class Main {
        public static void main(String[] args) throws IOException {
                File dir = new File(".");
                String loc = dir.getCanonicalPath() + File.separator + "Code.txt";

                File fout = new File(loc);
                FileOutputStream fos = new FileOutputStream(fout);
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos));
                out.write("something else");
                out.newLine();
                out.write("new line");

                //close buffer writer
                out.close();
        }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值