字节流/节点流 ( FileOutputStream、FileIntputStream )
FileInputStream 流以Stream结尾是字节流,Input表示输入流,直接从文件中读取数据是节点流;
FileOutputStream 是字节流,输出流,节点流。
----------------------------------------------------------
FileOutputStream ( extends OutputStream )
1.构造方法
- FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
- FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流(更常用)
下两个构造方法中,append 如果为 true
,则将字节写入文件末尾处,而不是写入文件开始处(即在原内容上进行续写操作)
- FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
- FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流
2.成员方法
- void write(int b) 将指定字节写入此文件输出流。
- void write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。
- void write(byte[] b, int off, int len) 写出一个字节数组的一部分
- close()
import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; public class FileOutputStreamTest01 { public static void main(String[] args) throws IOException { //1.创建一个字节输出流对象,用于向指定的文件输出字节的(1.创建流对象2.让内存指向目的地文件3.如果目的地文件不存在,则创建该文件) // FileOutputStream fos = new FileOutputStream(new File("day09\\a.txt")); FileOutputStream fos = new FileOutputStream("day09\\a.txt"); // 这种创建方法更常用 //2.向目的地文件写入数据 write(int b) fos.write(97); // a fos.write(57); // 9 fos.write(55); // 7 byte[] bytes = "我爱Java".getBytes(); System.out.println(Arrays.toString(bytes));// [-26, -120, -111, -25, -120, -79, 74, 97, 118, 97] // 0~2,三个字节组成汉字 ’我‘ fos.write(bytes[0]); fos.write(bytes[1]); fos.write(bytes[2]); // void write(byte[] b)方法 fos.write(bytes); // 我爱Java
fos.write("\n".getBytes()); // 换行操作 // void write(byte[] b, int off, int len) 方法,下标off开始,len个长度 fos.write(bytes,0,6); // 我爱 //3.释放资源 fos.close(); } }
执行代码后生成 a.txt 文件,并写入了以下数据:
------------------------------------------------
字节流的异常处理(捕获处理)
import java.io.FileOutputStream; import java.io.IOException; /* try{
}catch(异常类型 变量){ 异常操作 }finally{ 无论是否产生异常,都会执行的代码块 } 以后开发中需要对于异常进行 捕获处理,你需要这么写 但是我们学习过程中,如果每次都这样写,你的关注点就被分散到异常处理上,代码结构看起来也不是很清晰 因此,平时学习中,抛出处理 就行了 */ public class FileOutputStreamTest04 { public static void main(String[] args) { FileOutputStream fos = null; try { fos = new FileOutputStream("day09\\d.txt"); fos.write(97); }catch (IOException e){ e.printStackTrace(); }finally { try { if (fos != null){ fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
--------------------------------------------
FileInputStream(extends InputStream)
1.构造方法
- FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定
- FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定
2.成员方法
- 读取方法
- int read() 从此输入流中读取一个数据字节。返回下一个数据字节;如果已到达文件末尾,则返回 -1
- int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
- int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中
- close()
- 跳过方法
- long skip(long n) 从输入流中跳过并丢弃 n 个字节的数据。返回实际跳过的字节数
import java.io.FileInputStream; import java.io.IOException; // int read() 从此输入流中读取一个数据字节 public class FileInputStreamTest01 { public static void main(String[] args) throws IOException { // 创建流对象 (b.txt 文件必须已存在,否则报错) FileInputStream fis = new FileInputStream("day09\\b.txt"); // 循环读取每一个字节 int by; while ((by = fis.read()) != -1){ System.out.println(by); } fis.close(); } } /* 循环输出结果: 97 98 99 */
import java.io.FileInputStream; import java.io.IOException; // int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中 public class FileInputStreamTest01 { public static void main(String[] args) throws IOException { // 创建流对象 (b.txt 文件必须已存在,否则报错) FileInputStream fis = new FileInputStream("day09\\b.txt"); //(1)返回结果是读取到的有效个数,如果文件中没有数据了,则返回-1 //(2)每次读取到的字节数,往数组中进行赋值,从第一个元素开始进行赋值 /* byte[] bytes = new byte[2]; System.out.println(Arrays.toString(bytes)); // [0,0] int num = fis.read(bytes); System.out.println("第一次读取返回结果:" + num); // 2 System.out.println("第一次读取后,数组中的内容:" + Arrays.toString(bytes)); // [97,98] int num2 = fis.read(bytes); System.out.println("第二次读取返回结果:" + num2); // 1 System.out.println("第二次读取后,数组中的内容:" + Arrays.toString(bytes)); // [99,98] int num3 = fis.read(bytes); System.out.println("第三次读取返回结果:" + num3); // -1 System.out.println("第三次读取后,数组中的内容:" + Arrays.toString(bytes)); // [99,98] */ // 调用read(byte[] b)从文件中读取若干字节,把读取到的字节保存到字节数组中,返回本次从文件中读到的字节数 byte[] bytes = new byte[2]; int len; while ((len = fis.read(bytes)) != -1){ // String(byte[] bytes, int offset, int length) System.out.println(new String(bytes,0,len)); }
// 释放资源 fis.close(); } } /* 循环输出结果: ab c */
import java.io.FileInputStream; import java.io.IOException; /* skip方法可以跳过某些字节不读,读取后面的 long skip(long n) 从输入流中跳过并丢弃 n 个字节的数据 */ public class FileInputStreamTest02 { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("day09\\b.txt"); int by = fis.read(); System.out.println(by); // 97 fis.skip(1); // 这里,跳过了 1 位字节(98) int by2 = fis.read(); System.out.println(by2); // 99 // 释放资源 fis.close(); } } /* 输出结果: 97 99 */
-------------------------------------------------------
整合( FileOutputStream、FileIntputStream )
案例:将图片( C:\\Users\\Lenovo\\Desktop\\图day09.png)复制到指定位置( day09\\123.png)
当然,复制文件、软件都行,操作一样!
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /* 1.字节输入流(读取的文件的路径) 2.字节输出流(将读取到的字节数据,输出到指定的位置) 3.按照读取一个字节,写出一个字节来完成文件复制 按照读取一个字节数组,写出一个字节数组形式完成复制 4.释放资源 */ public class Test01 { public static void main(String[] args) throws IOException { // 读取一张图片的路径 FileInputStream fis = new FileInputStream("C:\\Users\\Lenovo\\Desktop\\图day09.png"); // 复制到指定位置(包括文件重命名) FileOutputStream fos = new FileOutputStream("day09\\123.png"); //方式一:一次读写一个字节完成复制 int by; while ((by = fis.read()) != -1){ fos.write(by); } //方式二:一次读写一个字节数组(推荐!效率更高) // write(byte[] b, int off, int len) 方法能保证最后一次刚好写够 /* int len; byte[] bytes = new byte[1024]; // 比如一次1024个字节 while ((len = fis.read(bytes)) != -1){ // 1.每次读1024字节到数组中 fos.write(bytes,0,len); // 2.再把数组写入到新图片里 }*/ //释放资源 fis.close(); fos.close(); } } // 执行代码后,图片就会被复制过来: