FileInputStream通过字节的方式读取文件,适合读取所有类型的文件(图像、视频、文本文件等)。
FileOutputStream 通过字节的方式写数据到文件中,适合所有类型的文件(图像、视频、文本文件等)。
FileInputStream文件输入字节流
public class TestFileInputStream {
public static void main(String[] args) {
//使用try-with-resource方式关闭资源。
//在try中打开资源,不需要在代码中添加finally块关闭资源。
try(FileInputStream fis = new FileInputStream("d:/a.txt");){
StringBuilder sb = new StringBuilder();
int temp=0;
while((temp = fis.read()) != -1){
sb.append((char) temp);
}
System.out.println(sb);
}catch(Exception e){
e.printStackTrace();
}
}
FileOutputStream文件输出字节流
public class TestFileOutputStream {
public static void main(String[] args) {
String str = "Old Lu";
// true表示内容会追加到文件末尾;false表示重写整个文件内容。
try(FileOutputStream fos = new FileOutputStream("d:/a.txt",true)){
//将整个字节数组写入到文件中。
fos.write(str.getBytes());
//将数据从内存中写入到磁盘中。
fos.flush();
}catch (IOException e){
e.printStackTrace();
}
}
}
注意:文件字节输出流将内存写入磁盘中:fos.flush()不能少!!!
文件字节流的应用--实现文件的复制
通过创建一个指定长度的字节数组作为缓冲区,以此来提高IO流的读写效率。该方式适用于读取较大文件时的缓冲区定义。注意:缓冲区的长度一定是2的整数幂。一般情况下1024长度较为合适。
public class TestFileByteBuffer{
public static void main(String[] args) {
long time1 = System.currentTimeMillis();
copyFile("d:/1.jpg", "d:/2.jpg");
long time2 = System.currentTimeMillis();
System.out.println(time2 - time1);
}
/**
*
* @param src 源文件
* @param desc 目标文件
*/
public static void copyFile(String src,String desc){
//“后开的先关闭!”按照他们被创建顺序的逆序来关闭
try(FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(desc)){
//创建一个缓冲区,提高读写效率
byte[] buffer = new byte[1024];
int temp = 0;
while ((temp = fis.read(buffer)) != -1){
//将缓存数组中的数据写入文件中,注意:写入的是读取的真实长度;
fos.write(buffer,0,temp);
}
//将数据从内存中写入到磁盘中。
fos.flush();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
注意 在使用字节缓冲区时,我们需要注意:
- 为了减少对硬盘的读写次数,提高效率,通常设置缓存数组。相应地,读取时使用的方法为:read(byte[] b);写入时的方法为:write(byte[ ] b, int off, int length)
- 程序中如果遇到多个流,每个流都要单独关闭,防止其中一个流出现异常后导致其他流无法关闭的情况。