java基础-IO流

IO原理及流的分类:
文件流:FileInputStream / FileOutputStream / FileReader / FileWriter    (除了这四个是节点流,其他都是处理流)
缓冲流:BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter
转换流:InputStreamReader / OutputStreamWriter
标准输入/输出流:System.in / System.out
打印流:PrintStream / PrintWriter
数据流:DataInputStream / DataOutputStream
对象流:ObjectInputStream / ObjectOutputStream
随机存取文件流:RandomAccessFile

 

1. File对象不仅可以表示一个文件,也可以表示一个文件目录

     文件可以删除,创建,重命名等等表面信息(不可以修改内容,修改由IO来完成),文件目录可以创建目录,获取文件目录下的所有文件。

2. 流分类:如果是尚硅谷课程的示意图

    按操作数据单位不同分为:字节流(8 bit)(图片,音频,视频等),字符流(16 bit) (文本文件)
    按数据流的流向不同分为:输入流,输出流
    按流的角色的不同分为:节点流(直接作用于文件),处理流(包含着节点流或者处理流,间接)

 3.FileIputStream,FileOutStream,Reader,Writer

伪代码:
    //内容为abc的txt文件,读取并创建对象
    File file = new File("D:/hello.txt");
    //创建文件输出字节流(字符不可读取)
    FileInputStream fis = new FileInputStream(fis);
    //read()方法
    int b =0 ;
    //读取一个字节,并返回给b,返回的b是txt文件字节的ascii码
    while((b=fis.read())!=-1){//如果读到结尾,没有字节了,就会返回-1
          System.out.print(b);
    }
    
    //read(byte[] byte)方法
    int len;//每次写入byte缓冲区的字节总数
    byte[] by = new byte[20];//读取到这个数组中
    while((len=fis.read(by))!=-1){//如果读到结尾,没有字节了,就会返回-1
          System.out.print(len);//如果有22个字节,输出202
    }

复制文件伪代码:
    File filein = new File("in.txt");
    File fileout = new File("out.txt");
    FileInputStream fis = new FileInputStream(filein);
    FileOutputStream fos = new FileOutputStream(fileout);
    byte[] b = new byte[20];
    int len;
    while((b = fis.read(b)) != -1){
        fos.write(b,0,len);
        //不可以写成:fos.write(b);
    }
    fos.close();
    fis.close();

 

4. 缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter    (加一层缓冲流,让速度更快)

缓冲流实现文件复制伪代码:
public void copy(){

    //1.读入写出文件
    File filein = new File("in.txt");
    File fileout = new File("out.txt");
    //2. 创建相应的流
    //先创建节点流
    FileInputStream fis = new FileInputStream(filein);
    FileOutputStream fos = new FileOutputStream(fileout);
    //将创建的节点流传给缓冲流
    BufferedInputStream bis = new BufferedInputStream(fis); 
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    //3.实现复制
    byte[] b = new byte[1024];
    int len;
    while((len = bis.read(b)) != -1){
        bos.write(b , 0 , len);
    }   
     //4.关闭流
    bos.close();
    bis.close();
}

  缓冲流区别:1.字节流每一次读取都是一次IO操作,频繁的IO操作让整个复制过程效率变低;

                            2.给字节流套上一个缓冲流,相当于每次读取或者写出都将内容放到了一个Buffered缓冲区中,缓冲区满了一次性读取或者写入,完成一次IO操作,效率要高。

 5.转换流:InputStreamReader,OutputStreamWriter

    注意:InputStreamReader是输入字节流转换成字符流  

              OutputStreamWriter是输出字符流转换成字节流  

public void tranfer(){

    //InputStreamReader  OutputStreamWriter
    File file = new File("a.txt");
    FileInputStream fis = new FileInputStream(file);
    InputStreamReader isr = new InputStreamReader(fis,"GBK");
    BufferedReader br = new BufferedReader(isr);
    //至此完成了字节流到字符流的转换
    
    File file1 = new File("b.txt");
    FileOutputStream fos = new FileOutputStream(file1);
    OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
    BufferedWriter bw = new BufferedWriter(osw);
}

6.标准输入输出流System.in  System.out

public void standinout(){

    InputStream is = System.in;
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String str;
    while(true){
        System.out.println("请输入:");
        str = br.readLine();
        if(str.equalsIgnoreCase("e") || str.equalsIgnoreCase("exit")){
             break;
        }
        //转换成大写
        System.out.println(str.toUpperCase());
    }
}

7. 打印流

8. 数据流(操作java的基本数据类型)

9. 对象流(操作java的对象)

    对象序列化机制:允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

    优点:可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原。

10. 随机存取文件流 RandomAccessFile(可以读取文件的任意一部分,尾部添加内容,但是却不用占太多内存,对于大文件添加内容来说相当实用)

public void addtxt(){  
        //创建对象
        RandomAccessFile raf=new RandomAccessFile("a.txt", "rw");         
        //将记录指针移动到文件最后  
        raf.seek(raf.length());  
        //追加内容
        raf.write("suffix".getBytes());  
}  

  

posted @ 2017-08-22 09:36  nothing_fish  阅读(221)  评论(0编辑  收藏  举报