0、IO流

0.1、IO(Input Output)流的概念

Java中将不同设备之间的数据传输抽象为“流”:Stream
设备指的是:磁盘上的文件,网络连接,另一个主机等等

 

按流向分:输入流,输出流:都是针对内存来说的

  1. 输入流,只能从其中读取数据
  2. 输出流,只能把数据放入其中

javaIO--数据流之IO流与字节流

按每次处理的数据单位分:字节流,字符流
1.字节流:每次处理一个字节
2.字符流:每次处理一个字符

javaIO--数据流之IO流与字节流

 

javaIO--数据流之IO流与字节流

 

0.2、IO流抽象基类

通常流的分类,如果没有特定指出,都是按操作数据单位来说的

字节流:两个方向
InputStream:输入字节流
OutputStream:输出字节流

字节流继承图:

javaIO--数据流之IO流与字节流

 

字符流:两个方向
Reader:输入字符流
Writer:输出字符流

字符流继承图:

javaIO--数据流之IO流与字节流

1、字节流

1.1字节输出流抽象基类:OutputStream

javaIO--数据流之IO流与字节流

 

javaIO--数据流之IO流与字节流

javaIO--数据流之IO流与字节流

 

 

javaIO--数据流之IO流与字节流

1.1.1 FileOutputStream实现类

javaIO--数据流之IO流与字节流

javaIO--数据流之IO流与字节流

 

构造方法:(输出流会自动创建输出对象)
FileOutputStream(File file)
  通过一个File对象创建一个文件输出流对象
FileOutputStream(String name)
  通过一个字符串构建一个文件输出流对象
FileOutputStream(File file,boolean append)
  通过文件对象创建文件输出流对象,并指定是否追加
FileOutputStream(String name,boolean append)
  通过一个字符串构建一个文件输出流对象,并指定是否追加

note:如果没有实际对象,对对象的操作并不会作用于实际文件

写出数据到流对象:
void write(byte[] bytes)
  一次写一个字节数组的数据
void write(int b)
  一次写一个字节
void write(byte[] bytes,int off,int len)
  一次写一个字节数组的一部分

关闭流对象:
void close()
  关闭此文件输出流并释放与此流有关的所有系统资源

关闭流的两个作用:
1.让流不能再继续使用
2.释放和此流相关的系统资源

1.1.2 FileInputStream实现类

javaIO--数据流之IO流与字节流

javaIO--数据流之IO流与字节流

构造方法:(必须要求输入对象事先存在)
FileInputStream(File file)
  通过File对象创建一个文件输入流对象FileInputStream(String name)
  通过一个字符串创建一个文件输入流对象 String可以是完整路径字符串
int read()
  从输入流中读取一个字节
int read(byte[] b)
  从输入流中读取字节,放到字节数组中,返回字节个数
int read(byte[] b,int off,int len)
  从输入流中读取字节,放到字节数组中,只放到指定位置(不常用)

javaIO--数据流之IO流与字节流

javaIO--数据流之IO流与字节流

javaIO--数据流之IO流与字节流

 

1.1.3自带关闭资源的try语句块

为了替换finally臃肿的写法,JDK7出现了自带关闭资源的try语句块,可以不用显式的写finally语句。
用法:
将需要关闭的资源定义或者初始化语句放到try后的括号里,程序会自动关闭这些资源,前提是这些类实现了AutoCloseable接口或者Closeable接口
格式:

try(需要自动关闭的资源声明或者初始化){
    //正常逻辑语句
}

javaIO--数据流之IO流与字节流

 

案例:字节读取

1.一次读取一个字节
2.用循环改进读取字节
3.简化循环读取字节
4.一次读取一个字节数组
5.加上异常处理读取字节数组
6.改进异常处理读取字节数组
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

/*
 * FileInputStream(File name)
 * FileInputStream(String name)
 */
public class FileInputStreamDemo {

    public static void main(String[] args) throws Exception {
        //输入流关联的文件必须事先存在,否则异常,输出流目标文件可以自动创建
        FileInputStream fis = new FileInputStream(new File("a.txt"));
        
//        FileInputStream fis2 = new FileInputStream("a.txt");
        
        //一次读取一个字节:
//        int b = fis.read();
//        System.out.println(b);
        /*
        b = fis.read();
        System.out.println(b);
        b = fis.read();
        System.out.println(b);
        b = fis.read();
        System.out.println(b);
        b = fis.read();
        System.out.println(b);
        */
        //用循环改进
        /*
        int b = 0;
        while(true){
            b = fis.read();
            if(b == -1){
                break;
            }else{
                System.out.println(b);
            }
        }
        */
        //最终代码
//        int b = 0;
//        while((b = fis.read()) != -1){
//            System.out.println(b);
//        }
        
        //一次读取一个字节数组
        /*
        byte[] bys = new byte[1024];
        int len = fis.read(bys);
        System.out.println(len);
        
        //用字节数组构建字符串
        String str = new String(bys, 0, len);
        System.out.println(str);
        */
        
        //循环读取数据
        int len = 0;
        byte[] bys = new byte[1024];
        while((len = fis.read(bys) + test()) != -1){
            System.out.print(new String(bys,0,len));
        }
        
        //释放资源
        fis.close();

    }

    public static int test(){
        System.out.println("方法被调用了");
        return 0;
    }
    
}
字节读取

相关文章: