InputStream 和 Reader 是所有输入流的基类。
InputStream(典型实现:FileInputStream)
int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
Reader(典型实现:FileReader)
int read()
int read(char [] c)
int read(char [] c, int off, int len)
程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。
package com.atguigu.java;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.junit.Test;
/*
* 1.流的分类
* 按照数据流向的不同:输入流、输出流
* 按照处理数据的单位的不同:字节流 字符流(处理的文本文件)
* 按照角色的不同:字节流(直接作用于文件) 处理流
* 2.IO的体系
* 抽象基类 节点流(文件流) 缓冲流
* InputStream FileInputStream BufferedInputStream
* OutputStream FileOutputStream BufferedOutputStream
* Reader FileReader BufferedReader
* Writer FileWriter BufferedWriter
*/
public class TestFileInputOutputStream {
//调用下面的复制方法,并计算复制时间
@Test
public void testCopyFile(){
long start = System.currentTimeMillis();//毫秒
String src = "C:\\Users\\xiaotinh\\Desktop\\03.jpg";
String dest = "C:\\Users\\xiaotinh\\Desktop\\04.jpg";
copyFile(src, dest);
long end = System.currentTimeMillis();
System.out.println("花费时间为:"+ (end - start));
}
//实现文件复制的方法,加了参数的方法具有通用性
public void copyFile(String src,String dest){
//1.提供读入、写出的文件
File file1 = new File(src);
File file2 = new File(dest);
//2.提供相应的流
FileInputStream fis = null;
FileOutputStream fos = null;
try{
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
//3.实现文件的复制
byte[] b = new byte[20];
int len;
while((len = fis.read(b)) != -1){
//fos.write(b);错误写法 fos.write(b,0,b.length)是一样的
fos.write(b, 0, len);//写b里面的东西;从0开始;len是长度
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(fos!= null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis!= null){//fis和fos的关闭可以并列进行,因为都处于finally中,最后都会执行
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//从硬盘读取一个文件,并写入到另一个位置。(相当于文件的复制)
@Test
public void testFileInputOutputStream(){
//1.提供读入、写出的文件
File file1 = new File("hello.txt");
File file2 = new File("hello3.txt");
//2.提供相应的流
FileInputStream fis = null;
FileOutputStream fos = null;
try{
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
//3.实现文件的复制
byte[] b = new byte[20];
int len;
while((len = fis.read(b)) != -1){
//fos.write(b);错误写法 fos.write(b,0,b.length)是一样的
fos.write(b, 0, len);//写b里面的东西;从0开始;len是长度
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(fos!= null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis!= null){//fis和fos的关闭可以并列进行,因为都处于finally中,最后都会执行
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//FileOutputStream
@Test
public void testFileOutputStream(){
//1.创建一个File对象,标明要写入的文件位置
//输出的物理文件可以不存在,当执行过程中,若不存在,会自动创建。若存在,会将原有的文件覆盖。
File file = new File("hello2.txt");
//2.创建一个FileOutputStream的对象,将file的对象作为形参传递给FileOutputStream的构造器中
FileOutputStream fos = null;
try{
fos = new FileOutputStream(file);
//3.写入操作
fos.write(new String("I love China I love the World!").getBytes());
}catch(IOException e){
e.printStackTrace();
}finally{
//4.关闭输出流
if(fos != null){
try{
fos.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
public void testFileInputOutputStream3(){
FileInputStream fis = null;
try {
File file = new File("hello.txt");
fis = new FileInputStream(file);
byte[] b = new byte[5];//读取到的数据要写入的数组
int len;//每次读到byte中的字节的长度
while((len = fis.read(b)) != -1){
// for (int i = 0; i < len; i++) {//不可以写成b.length,否则输出abcdefgcde
// System.out.print((char)b[i]);
// }
String str = new String(b, 0, len);
System.out.print(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fis!= null){//可以判断fis不为空时,才执行.close()
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//使用try-catch的方式处理如下的异常更合理!
//因为throw是遇到问题就抛出,下面的程序便不再执行,所以无法释放打开的珍贵的流资源
//而try-catch则会在抓到异常以后,继续执行,而将.close放到finally中,则必然会被关闭
@Test
public void testFileInputOutputStream2(){
//2.创建一个FileInputStream类的对象
FileInputStream fis= null;
try {
//1.创建一个File类的对象
File file = new File("hello.txt");
fis = new FileInputStream(file);
//3.调用FileInputStream的方法,实现file问价的读取
int b;
while((b = fis.read()) != -1){
System.out.print((char)b);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//4.关闭相应的流
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//因为流的资源并不是java虚拟机的资源,不会自动回收,需要显示关闭
}
}
//从硬盘存在的文件中,读取其内容到程序中。使用FileInputStream
//要读取的文件一定要存在,否则抛FileNotFoundException
@Test
public void testFileInputOutputStream1() throws Exception{
//1.创建一个File类的对象
File file = new File("hello.txt");
//2.创建一个FileInputStream类的对象
FileInputStream fis = new FileInputStream(file);
//3.调用FileInputStream的方法,实现file问价的读取
/*
* read():读取文件的一个字节。 当执行到文件结尾时,返回-1.abcdefg
*/
// int b = fis.read();
// while(b != -1){
// System.out.print((char)b);
// b = fis.read();
// }或者
int b;
while((b = fis.read()) != -1){
System.out.print((char)b);
}
//4.关闭相应的流
fis.close();//因为流的资源并不是java虚拟机的资源,不会自动回收,需要显示关闭
}
}