FileInputStream类(重点)
(1)基本概念
java.io.FileInputStream类用于读取诸如图像之类的原始字节流。
(2)常用的方法
FileInputStream(String name) - 根据参数指定的文件进行关联并创建对象。
int read( ) - 用于读取一个字节数据,返回-1表示读到文件末尾,否则返回数据。
int read(byte[] b) - 用于读满整个字节数组。 若读到文件尾就返回-1,否则返回实际读取的字节数。
int read(byte[] b, int off, int len) - 用于读满字节数组的一部分空间。
void close( ) - 关闭流并释放资源。
代码1:读取 E:/abc.txt 路径下的 abc.txt文档文件 内容是: abcd
import java.io.FileInputStream; import java.io.FileNotFoundException; public class FileInputStreamTest { public static void main(String[] args) { try { // 1.创建FileInputStream类 的对象 与指定的文件关联 (相当于管道) FileInputStream fis = new FileInputStream("E:\abc.txt"); // 2. 读取文件中的内容 并且打印出来 int res = 0; while((res= fis.read())!=-1) { // 当 (res= fis.read())= -1 时,表示已经读完文件中的字节了 System.out.println("打印出读出的内容(int类型的ASCII码值): "+res); System.out.println("打印出读出的字节内容(强转成char类型): "+(char)res); System.out.println(); } // 3.关闭流对象 并释放资源 fis.close(); } catch (Exception e) { e.printStackTrace(); } } }
结果:
打印出读出的内容(int类型的ASCII码值): 97 打印出读出的字节内容(强转成char类型): a 打印出读出的内容(int类型的ASCII码值): 98 打印出读出的字节内容(强转成char类型): b 打印出读出的内容(int类型的ASCII码值): 99 打印出读出的字节内容(强转成char类型): c 打印出读出的内容(int类型的ASCII码值): 100 打印出读出的字节内容(强转成char类型): d
代码2:
package com.monkey1024; import java.io.FileInputStream; import java.io.FileNotFoundException; public class FileInputStreamTest { public static void main(String[] args) { try { // 1.创建FileInputStream类 的对象 与指定的文件关联 (相当于管道) FileInputStream fis = new FileInputStream("E:\abc.txt"); // 2. 读取文件中的内容 并且打印出来 byte[] data = new byte[10]; //创建一个byte类型的数组 int res = fis.read(data); System.out.println("实际读取到的数据大小是: "+res+",读取到的文内内容是:"+new String(data, 0, res) +"!");
//String中有个构造方法String(byte[] bytes) //String(int[] codePoints, int offset, int count)
// 分配一个新的String
,它包含 Unicode 代码点数组参数一个子数组的字符。 // 3.关闭流对象 并释放资源 fis.close(); } catch (Exception e) { e.printStackTrace(); } } }
结果:
实际读取到的数据大小是: 4,读取到的文内内容是:abcd!
FileOutputStream类(重点)
1.基本概念
java.io.FileOutputStream类主要用于将字节流数据写入到输出流中。
2.常用的方法
FileOutputStream(String name) - 按照参数指定的路径构造对象。
FileOutputStream(String name, boolean append) - 按照追加的方式构造对象与指定的路径关联。
void write(int b) - 写入单个字节。
void write(byte[ ] b, int off, int len) - 写入数组中的一部分字节数据。
void write(byte[ ] b) - 写入整个数组的字节数据。
void flush() - 刷新输出流并强制写入缓冲数据。
void close() - 关闭输出流并释放资源。
代码1:
import java.io.FileOutputStream; public class FileOutputStreamTest { public static void main(String[] args) { try { // 1.创建FileOutputStream类的对象,与指定的文件关联 // 若文件不存在,则 自动创建新的空文件 // 若文件存在, 则 清空文件中的原有内容 FileOutputStream fos = new FileOutputStream("e:/hello.txt"); // 2. 使用write()可以向文件中 写入数据 fos.write(97); // a fos.write(98); // b fos.write(99); // c fos.write("hello".getBytes()); // 转换成字符数组 System.out.println("数据写入成功....."); // 3.关闭流操作 fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } }
结果:
数据写入成功.....
注意:
// FileOutputStream fos = new FileOutputStream("e:/hello.txt",true);
在后面加 true,这样写的意思:
-若文件存在, 则向文件中追加新的数据内容;
-若文件不存在,则自动创建新的空文件
三、演示 拷贝文件
方式一:
package com.monkey1024; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileCopyTest { public static void main(String[] args) { try { // 1.创建FileInputStream类的对象,指向源文件 (读文件) FileInputStream fis = new FileInputStream("E:\reader.txt"); // 2.创建FileOutputStream类的对象,指向目标文件 (写文件) FileOutputStream fos = new FileOutputStream("E:\readerCopy.txt"); // 3.读一个字节,写一个字节
// 不断地读取源文件中的内容 并且 写入到 目标文件中
// 这样可以实现文件的拷贝,但是 文件比较大的时候,效率低下 int res = 0; while((res =fis.read())!= -1) { fos.write(res);//写 } // 4.关闭流操作 fis.close(); fos.close(); System.out.println("拷贝完毕"); } catch (Exception e) { e.printStackTrace(); } } }
结果:
拷贝完毕
方式二:
根据源文件的大小准备对应的缓冲区(数组),可能导致内存溢出
方式三:
无论文件大小是多少,每次都准备一个1024整数倍的数组
package com.monkey1024; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileCopyTest { public static void main(String[] args) { try { // 1.创建FileInputStream类的对象,指向源文件 (读文件) FileInputStream fis = new FileInputStream("E:\reader.txt"); // 2.创建FileOutputStream类的对象,指向目标文件 (写文件) FileOutputStream fos = new FileOutputStream("E:\readerCopy.txt"); // 3.无论文件大小是多少,每次都准备一个1024整数倍的数组
// 这样做,效率高太多
byte[] data = new byte[1024*8]; int res = 0; while((res = fis.read(data)) != -1){ fos.write(data,0,res); } // 4.关闭流操作 fis.close(); fos.close(); System.out.println("拷贝完毕"); } catch (Exception e) { e.printStackTrace(); } } }
结果:
拷贝完毕