前面介绍了如何应用输入流FileInputStream从本地文件读取数据。本课介绍应用输出流FileOutputStream把数据写入本地文件。
用FileOutputStream写入文件流程如下:
FileOutputStream写入文件过程
使用FileOutputStream写入文件的过程,同使用FileInputStream过程相同,都是先用File类打开本地文件,实例化输入输出流,然后调用流的读写方法写入数据,最后关闭流。
FileOutputStream的构造方法
FileOutputStream提供了4个常用构造方法,用于实例化FileOutputStream对象,不同的场景使用不同的构造方法。
场景1:使用File对象打开本地文件,从文件读取数据。
public static void main(String[] args) {
File file = new File("d://samplew.txt");
try {
//实例化FileOutputStream
FileOutputStream fos = new FileOutputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}场景2:不使用File对象,直接传入文件路径。
public static void main(String[] args) {
try {
//实例化FileOutputStream
FileOutputStream fos = new FileOutputStream("d://samplew.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}FileOutputStream的构造方法允许直接传入文件路径,而无须使用File对象。查看该构造方法的源代码,其内部使用了File对象打开文件。
场景3:打开文件,在文件的尾部追加写入数据。
public static void main(String[] args) {
File file = new File("d://samplew.txt");
try {
//实例化FileOutputStream,在文件的尾部写入数据
FileOutputStream fos = new FileOutputStream(file,true);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}场景要求在文件的尾部写入数据,由于前面两个构造函数都是从文件开始写入数据(覆盖原文件),因此不能使用前面2个场景的构造函数。FileOutputStream提供了另外两个构构造方法,分别是:
FileOutputStream(File file, boolean append); FileOutputStream(String name, boolean append);
同前面的构造方法相比,这两个构造方法各多了一个boolean参数append。append参数为true时,数据从文件尾部写入;append参数为false时,数据覆盖原文件。
FileOutputStream的写入方法
FileOutputStream类提供了多种文件写入方法,可以单独写一个字节到文件,也可以写一个byte数组到文件,也可以取byte数组的部分数据写入到文件。
案例1:建立FileOutputStreamTest测试类,使用FileOutputStream类的write()方法写入数据到文件。
在PCoreUnit6项目新建outputstream包,在outputstream包下新建FileOutputStreamTest类。代码如下:
package outputstream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName: FileOutputStreamTest
* @Description: 输入与输出(FileOutputStream类)案例1
* @author 编程训练营
* @date
*
*/
public class FileOutputStreamTest {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
File file = new File("d://new.txt");
try {
//创建文件
file.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//实例化FileOutputStream,在文件的尾部写入数据
FileOutputStream fos = new FileOutputStream(file);
String str = "this is new file";
for( int i = 0; i < str.length();i++ )
{
int b = (int)str.charAt(i);
fos.write(b);
}
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}案例代码首先调用File类的createNewFile()创建new.txt文件,然后将str内容写入到新创建的new.txt文件中。
案例2:建立FileOutputStreamTest1测试类,使用FileOutputStream类的write(byte[] b)方法写入数据到文件。
在outputstream包下新建FileOutputStreamTest1类。代码如下:
package outputstream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName: FileOutputStreamTest1
* @Description: 输入与输出(FileOutputStream类)案例2
* @author 编程训练营
* @date
*
*/
public class FileOutputStreamTest1 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
File file = new File("d://new.txt");
try {
//创建文件
file.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//实例化FileOutputStream,在文件的尾部写入数据
FileOutputStream fos = new FileOutputStream(file);
String str = "this is new file";
fos.write(str.getBytes());
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}String类的getBytes()方法可以将字符串转换为byte数组,使用FileOutputStream 类的write(byte[] b)方法,将转换的byte数组写入文件。
案例3:建立FileOutputStreamTest3测试类,使用FileOutputStream类的w write(byte[] b,int off,int len)方法写入数据到文件。
在outputstream包下新建FileOutputStreamTest3类。代码如下:
package outputstream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName: FileOutputStreamTest3
* @Description: 输入与输出(FileOutputStream类)案例3
* @author 编程训练营
* @date
*
*/
public class FileOutputStreamTest3 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
File file = new File("d://new.txt");
try {
//创建文件
file.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//实例化FileOutputStream,在文件的尾部写入数据
FileOutputStream fos = new FileOutputStream(file);
String str = "this is new file";
fos.write(str.getBytes(),5,11);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}程序把指定的str内容写入到文件,fos.write(str.getBytes(),5,10)语句的第一个参数为byte数组,第二个参数5是从byte数组的下标5开始,第三个参数是写入的字节数。程序执行后,写入的内容为“is new file”。
使用该方法一定要注意数组越界的问题。例如,byte数组长度为20,从下标12开始,写入15个字节到文件,就会造成数组越界,程序报错。
案例4:建立FileOutputStreamTest4测试类,使用FileOutputStream复制文件。
在outputstream包下新建FileOutputStreamTest4类。代码如下:
package outputstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName: FileOutputStreamTest4
* @Description: 输入与输出(FileOutputStream类)案例4
* @author 编程训练营
* @date
*
*/
public class FileOutputStreamTest4 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String source = "d://sample.txt";
String dest = "d://samplenew.txt";
File fSource = new File(source);
File fDest = new File(dest);
//创建一个新文件
try {
fDest.createNewFile();
//复制文件
copyFile(fSource,fDest);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void copyFile(File src, File dest){
if(!src.exists()){
System.out.println("源文件不存在");
return ;
}
try {
//创建文件输入流,读取源文件
FileInputStream fis = new FileInputStream(src);
//创建文件输出流,写入目标文件
FileOutputStream fos = new FileOutputStream(dest);
byte[] buf = new byte[fis.available()];
//读取源文件
fis.read(buf);
//将缓冲区内的数据写入到目标文件
fos.write(buf);
//刷新缓冲区
fos.flush();
//关闭文件
fos.close();
fis.close();
System.out.println("复制成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}案例代码的copyFile()方法完成文件的复制,在复制之前,先判断一下源文件是否存在,然后申请一个byte数组,用于存储读取的源文件数据,该数组大小与源文件总字节数相同,读取成功后,再将数组内容写入到目标文件。
使用FileOutputStream流可以写入字节数据到目标文件,FileOutputStream提供了单字节写入和byte数组写入两种方式。建议使用byte数组写入,将待写入的数据存储到一个byte数组中,然后再写入文件。当写入的文件已经存在时,需要指明写入方式是覆盖还是追加。