Java FileOutputStream 详细介绍
1、FileOutputStream 简介
FileOutputStream继承于OutputStream:public class FileOutputStream extends OutputStream
FileOutputStream流是指文件字节输出流,专用于输出原始字节流,如图像数据等,其继承OutputStream类,拥有输出流的基本特性。
2、FileOutputStream 构造方法
FileOutputStream 总共有四个构造方法,但是实际上是由一个核心构造方法而延伸出另外的三种构造方法。
构造方法1:
public FileOutputStream(File file) throws FileNotFoundException{}
构造方法2:
public FileOutputStream(File file,boolean append) throws FileNotFoundException{}
其实,查看底层源码发现该构造方法1实际是调用了另一个构造方法2
public FileOutputStream(File file) throws FileNotFoundException {
this(file, false);
}
若第二个参数为真,则意味着会写入字节到文件的末尾,意味着追加内容,若为假,则是写入字节到文件的开头,意味着是覆盖,
构造方法3:
public FileOutputStream(String name) throws FileNotFoundException{}
构造方法4:
public FileOutputStream(String name,boolean append) throws FileNotFoundException
同理,构造方法3的底层是调用构造方法4来实现的,而构造方法4则通过调用构造方法2来实现:
public FileOutputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null, false);
}
3、FileOutputStream 常用API
(1)将指定的一个字节写入文件的输出流中,此处需要注意:参数是int型不是byte型的。
public void write(int b) throws IOException
代码如下所示:
public class Test
{
public static void main(String[] args)
{
File file = new File("C:\\Users\\Administrator\\Desktop\\out.txt");
try
{
String content = "Hello";
FileOutputStream out = new FileOutputStream(file, false);
byte[] b = content.getBytes();
System.out.println("要写入的字节数据长度:" + b.length);
for (int i = 0; i < b.length; i++)
{
out.write(b[i]); //此处等于是进行了向上转换,即byte类型的转换成了int类型然后调用方法,向上装换不需要强转标识
System.out.println("写入次数:" + (i + 1));
}
}
catch (FileNotFoundException e)
{
System.out.println("文件不存在或者文件不可读或者文件是目录");
}
catch (IOException e)
{
System.out.println("读取过程存在异常");
}
}
}
(2)将指定字节数组中的b.length个字节写入到输出流中
public void write(byte[] b) throws IOException {}
代码如下所示:
public class Test
{
public static void main(String[] args)
{
//建立文件对象
File file = new File("C:\\Users\\Administrator\\Desktop\\out.txt");
try
{
String content = "Hello";
FileOutputStream out = new FileOutputStream(file, false);
out.write(content.getBytes());
}
catch (FileNotFoundException e)
{
System.out.println("文件不存在或者文件不可读或者文件是目录");
}
catch (IOException e)
{
System.out.println("读取过程存在异常");
}
}
}
(3)将从偏移量off开始的指定字节数组中的len个字节写入输出流中
public void write(byte[] b,int off,int len) throws IOException{}
参数说明:参数b代表着含有要写入数据的字节数组,参数off代表着从数组下标off开始,参数len表示最终写入的字节个数。例如,write(bytes,0,5)
则意味着从字节数组bytes中下标0开始读5个字节到输出流中。
代码说明:
public class Test
{
public static void main(String[] args)
{
File file = new File("C:\\Users\\Administrator\\Desktop\\out.txt");
try
{
String content = "Hello";
FileOutputStream out = new FileOutputStream(file, false);
byte[] bytes = content.getBytes(); //得到装有内容的字节数组
out.write(bytes, 1, 4); //代表我只想要从下标1开始的4个字节,即bcde
}
catch (FileNotFoundException e)
{
System.out.println("文件不存在或者文件不可读或者文件是目录");
}
catch (IOException e)
{
System.out.println("读取过程存在异常");
}
}
}
4、FileOutputStream write 方法小结
通过上述实例代码其实可以发现使用write(int n)
是需要传递单字节作为参数,但是一般情况我们都是接收的字节数组,与其使用字节数组进行循环调用还不如使用write(byte[] b)
方法,直接把内容转化成字节数组作为参数调用即可,因此使用FileOutputStream流写数据时一般使用第二种和第三种write方法即可。