I/O流基础

I/O流(类和类中方法)

流分类

输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备。

、I/O流分为字节流和字符流。字节流(以2进制为单位)又分为字节输入流和字节输出流;字符流(字符为单位)分为字符输出流和字符输入流。当我门把字节流转换成相应的字符流时我把种方法称为转换流。输入和输出流以程序为判断点,输入程序就是输入流,从程序流出就是输出流。
输入流是用来读数据,输出是用来写数据。

、还可以根据输入和输出的对象不同来进行区分,当操作的输入或者输出流为磁盘时被称为字节流,当操作的对象为内存时他被称为缓冲流。

File类概述和构造方法

I/O流可以对文件的内容机械能读写操作,但是对于文件本身而言无法通过I/O流来实现。
File:文件和目录都可以通过File封装成对象。
对于一个File而言,其封装并不是一个正真存在的文件,仅仅是一个路径名而已,可以存在,也可以不存在,将来时要通过具体的操作吧这个路径的内容转换成具体存在。

1、创建文件对象常用方法

package IO_Stream;

import java.io.File;

public class IO_Str {
    public static void main(String[] args){
        File file=new File("D:\\BaiduNetdiskDownload");
        System.out.println("文件名:"+file.getName());
        System.out.println("文件相对路径:"+file.getAbsolutePath());

        File f2=new File("D:\\BaiduNetdiskDownload","java.txt");
        System.out.println(f2);
            
        File f3=new File("D:\\BaiduNetdiskDownload");
        File f4=new File(f3,"java.txt");
    }
}

2、创建目录和文件

package IO_Stream;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;

public class IO_Str {
    public static void main(String[] args)throws IOException {
        File file=new File("D:\\BaiduNetdiskDownload\\java.txt");
        System.out.println("创建的文件名为:"+file.createNewFile());


        File f2=new File("D:\\BaiduNetdiskDownload\\java1");
        System.out.println("创建目录:"+f2.mkdir());

        File f3=new File("D:\\BaiduNetdiskDownload\\javas\\1\\2\\3");
        System.out.println("创建多级目录:"+f3.mkdirs());
        
        System.out.println("删除文件或目录:"+f3.delete());//可以删除单级目录,不可以删除多级
        
        System.out.println("是否为目录"+f3.isDirectory());
        System.out.println("是否为文件"+file.isFile());
        System.out.println("路径是否存在:"+f2.exists());
        
       //输出文件名称
        File[] fileArrF=f3.listFiles();
        for(File fileName:fileArrF){
            if(f3.isFile())
                System.out.println(fileName.getName());
            else
                System.out.println("is not File");

        }

      /*  String[] fileArr= file.list();
        for(String file_1:fileArr){
            System.out.println(file_1);
        }
*/

    }
}

递归删除

package IO_Stream;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;

public class IO_Str {
    public static void main(String[] args)throws IOException {

        File file=new File("D:\\BaiduNetdiskDownload\\javas\\1\\2\\3");
        System.out.println("创建多级目录:"+file.mkdirs());

        //斐波那契数列求和  1 1 2 3 5 8
        int[] arr=new int[20];
        arr[0]=1;
        arr[1]=1;
        for(int i=2;i<arr.length;i++){
            arr[i]=arr[i-1]+arr[i-2];
        }
        System.out.println(arr[19]);


        System.out.println( f(20));
    }
    
    //重复做相同的事情
    public  static int f(int m) {
        if (m == 1 || m == 2) {
            return 1;
        } else {
            return f(m-1)+f(m-2);
        }
    }

}

递归深入理解

package IO_Stream;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;

public class IO_Str {
    public static void main(String[] args)throws IOException {

        File file=new File("D:\\BaiduNetdiskDownload\\javas\\1\\2\\3");
        System.out.println("创建多级目录:"+file.mkdirs());

        int result=jc(5);
        System.out.println(result);
        
    }

    public  static int  jc(int n){
        if(n==1){
            return 1;
        }else
            return n*jc(n-1);
    }
    
}

在这里插入图片描述

import jdk.internal.dynalink.beans.StaticClass;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {

        File file = new File("D:\\BaiduNetdiskDownload");
        //System.out.println("创建多级目录:" + file.createNewFile());

        getAllFilePath(file);
    }

    public static void getAllFilePath(File file) {
        File[] fireArray= file.listFiles();
        if (fireArray != null) {
            for (File file1 : fireArray) {
                if (file1.isDirectory()) {
                    getAllFilePath(file);
                } else {
                    System.out.println(file.getAbsoluteFile());
                }
            }
        }
    }
}

字节流

文件写入与读出

写出
public class IO_Str {
    public static void main(String[] args)throws IOException {

       //调用系统功能创建对象
       //创建字节流输出对象
       //让字节流对象指向创建好的文件
        
        FileOutputStream fo=new FileOutputStream("D:\\BaiduNetdiskDownload\\java.txt");

        fo.write(97);

        fo.close();



	  byte[] bys="abcde".getBytes();//字符串转换对应的字节数组写出
       fo.write(bys);

       for(int i=0;i<10;i++){
           fo.write("hello".getBytes());
           fo.write("\r\n".getBytes());
       }

    }


读入
import java.io.*;
import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {
        
        FileInputStream fo=new FileInputStream("D:\\BaiduNetdiskDownload\\java.txt");
        int b=0;
        while ( (b=fo.read()) !=-1){
            System.out.println(b);
        }
        fo.close();
        
        
    }
}



写出追加
import java.io.*;
import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {

        FileOutputStream fo=new FileOutputStream("D:\\BaiduNetdiskDownload\\java.txt",true);//写上true就是追加

        String str="Hello Wrold";
        fo.write(str.getBytes());
        System.out.println(fo);
        fo.close();
        
    }
}


改进追加
package IO_Stream;

import java.io.*;
import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {

        FileOutputStream out=new FileOutputStream("D:\\BaiduNetdiskDownload\\java.txt",true);
    try {
    String str = "Hello Wrold";
    out.write(str.getBytes());
    }finally {
        try{
            if(out != null){
                out.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    
    }
}

文件copy

package IO_Stream;

import java.io.*;

import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {

        FileInputStream inner=new FileInputStream("source/src.jpg");

        FileOutputStream out=new FileOutputStream("target/tar.jgp");

        int len=0;

        //获取copy文件前面的系统时间
        long beginTime=System.currentTimeMillis();
        try {
            //通过循环读取到文件字节信息写入到文件
            while ((len = inner.read()) != -1) {
                out.write(len);
            }
            //获取copy之后的系统时间
            
            long endTime = System.currentTimeMillis();

            //输出copy花费的时间
            System.out.println("系统花费时间为:" + (endTime - beginTime) + "毫秒");

        }finally {
            try {
                if (inner != null){
                    inner.close();
            }
            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                if(out!=null){
                    out.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

    }
}

字节流的缓冲区
定义一个字节数组将数据放到字节数组中,这个数组就叫做缓冲区。

package IO_Stream;

import java.io.*;

import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {

        FileInputStream inner=new FileInputStream("source/src.jpg");

        FileOutputStream out=new FileOutputStream("target/tar.jgp");
        byte[] bys=new byte[2048];

        int len=0;
        long beginTime=System.currentTimeMillis();

        //通过文件读取填充到字节数组,然后通过len记住数组的字节数
        while ((len=inner.read(bys))!=-1){
            out.write(bys,0,len);
        }

        long  endTime=System.currentTimeMillis();
        System.out.println("花费时间为:"+(endTime-beginTime)+"ms");

        inner.close();
        out.close();
        

    }
}

字节缓冲流
缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中读取。
在这里插入图片描述

package IO_Stream;

import java.io.*;

import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {

        BufferedInputStream inner=new BufferedInputStream(new FileInputStream("source/src.jpg"));
		//字节流缓冲流是以字节流来实现的。
        BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("target/tar.jgp"));
			
        int len=0;
        byte[] buffer=new byte[1024];
        long beginTime=System.currentTimeMillis();

        while ((len=inner.read(buffer))!=-1){
            out.write(buffer,0,len);
        }

        long  endTime=System.currentTimeMillis();
        System.out.println("花费时间为:"+(endTime-beginTime)+"ms");

        inner.close();
        out.close();


    }
}
字符流操作文件

由于字节流对中文操作不方便,所以使用字符流。
字符流=字节流+编码表(不同的字母代表成二进制)

package IO_Stream;

import java.io.*;

import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {


       //读取文件
      /* FileReader inner=new FileReader("source/1");

       int len=0;
        while ((len=inner.read())!=-1){
            System.out.print((char)len);
        }
        inner.close();*/


        //写入文件
       /* FileWriter out=new FileWriter("target/2");
        out.write("努力学习:\r\n");
        out.write("努力变强:\r\n");
        out.close();*/



        //文件追加
       /* FileWriter out=new FileWriter("target/2",true);
        out.write("努力学习:\r\n");
        out.write("努力变强:\r\n");
        out.write("努力变强:\r\n");
        out.write("努力变强:\r\n");
        out.close();*/

        //文件copy
      /*  FileReader inner=new FileReader("source/1");
        FileWriter out=new FileWriter("target/2");

        int len=0;
        char[] buffer=new char[1024];
        long beginTime=System.currentTimeMillis();
        while ((len=inner.read(buffer))!=-1){
               out.write(buffer,0,len); //write(byte,0,len)byte:指定数组
        }
        long  endTime=System.currentTimeMillis();
        System.out.println("花费时间为:"+(endTime-beginTime)+"ms");
        inner.close();
        out.close();*/



        //使用缓冲区读写文件
        BufferedReader inner=new BufferedReader(new FileReader("source/1"));
        BufferedWriter out=new BufferedWriter(new FileWriter("target/2"));

        String str=null;
        char[] buffer=new char[1024];
        long beginTime=System.currentTimeMillis();
        while( (str=inner.readLine())!=null){//readLine():一次读取一行文本
            out.write(str);

        }
        long  endTime=System.currentTimeMillis();
        System.out.println("花费时间为:"+(endTime-beginTime)+"ms");
        inner.close();
        out.close();



    }
}
转换流

将字节流转换成字符流

package IO_Stream;

import java.io.*;

import java.util.ArrayList;

public class IO_Str {
    public static void main(String[] args)throws IOException {


        //创建字节输入流
        FileInputStream inner=new FileInputStream("source/1");
        //将字节流转换成字符流
        InputStreamReader inn=new InputStreamReader(inner);
        //创建字符输入缓冲流对象
        BufferedReader out_1=new BufferedReader(inn);

        //创建字节输出流对象,这个流是写入到文件的
        FileOutputStream out=new FileOutputStream("target/2");
        //字节输出流对象转换成字符输出流对象
        OutputStreamWriter osw=new OutputStreamWriter(out);
        //创建字符输出缓冲流
        BufferedWriter bw=new BufferedWriter(osw);

        String str=null;
        while ((str=out_1.readLine())!=null){
            bw.write(str);
            bw.newLine();
        }
        out_1.close();
        bw.close();

    }
}

IO流小结
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NIO

NIO采用内存映射文件的方式来处理输入输出,他将文件或文件的一段区域映射到内存,这样就可以想访问内存一样访问文件了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值