输入输出流(一)

Java I/O

程序的输入、输出操作
在这里插入图片描述
站在程序的角度,读数据进来叫输入,往外写东西叫输出

文件

相关记录或放在一起的数据的集合
JAVA API :java.io.File 类
File 物理文件或目录

创建文件对象和常用方法

        //创建文件对象(文件或文件夹) 路径字符串作为参数
        File file = new File("a.txt");
        //如果文件不存在 创建文件
        if (!file.exists()) {//判断文件或目录是否存在
            try {
                //创建空文件   不会创建文件夹
                file.createNewFile();//出现必须要处理的异常
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println(file.isFile());//判断是否是文件
        System.out.println(file.isDirectory());//判断是否是目录
        System.out.println("长度是:"+file.length());//文件的长度
        System.out.println("名称是:"+file.getName());//文件或目录的名称
        System.out.println("相对路径是:"+file.getPath());//相对路径
        System.out.println("绝对路径是:"+file.getAbsolutePath());//绝对路径
       //file.delete();//删除文件
       //canRead  canWrite canExecute 可读可写 可执行
       System.out.println(file.canExecute());
       System.out.println(file.canRead());
       System.out.println(file.canWrite());

在这里插入图片描述
在这里插入图片描述

创建文件夹和文件夹下的文件

单独创建文件夹

        //单独创建文件夹 在src文件夹下创建名称为1的文件夹
        File file1=new File("src/1");
        file1.mkdir();
        System.out.println("文件夹的名称是:"+file1.getName());
        //getName()获取的是路径下的最后一个文件夹的名称

在这里插入图片描述

同时创建文件夹和文件

          //创建文件夹和文件  test hello都不存在
          File file = new File("test/hello/a.txt");
          File f=file.getParentFile();//创建a.txt的上一级文件对象
          f.mkdirs();//递归创建文件夹
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

在这里插入图片描述
如果不创建上一级文件对象,直接递归创建文件夹,那么最后一级的文件也会创建文件夹

File file = new File("test/hello/a.txt");
file.mkdirs();//最后会创建一个

renameTo();:移动重命名

          //创建文件夹和文件  test hello都不存在
          File file = new File("test/hello/a.txt");
          File f=file.getParentFile();//创建a.txt的上一级文件对象
          f.mkdirs();//递归创建文件夹
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //b.txt文件不存在
        File file2=new File("b.txt");
        file.renameTo(file2);

test/hello文件夹下的文件a.txt重命名为b.txt,同时移动了路径
前提是a.txt文件必须存在 移动的目标路径必须存在 同时是同一平台操作
具体用法参考链接
https://blog.youkuaiyun.com/u010648555/article/details/78356040
在这里插入图片描述

通过流来读写文件
流是一组有序的数据序列
以先进先出方式发送信息的通道
输入/输出流与数据源
在这里插入图片描述
在这里插入图片描述
流的分类
在这里插入图片描述
在这里插入图片描述
输入输出流是相对于计算机内存来说的
字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流

FileInputStream

InputStream 抽象类 父类 字节输入流
int read() 从输入流一个字节一个字节的读 返回字节对应的整数表示形式 比如a 对应97 如果到了输入流的末尾,返回-1
int read(byte[] b) 从输入流读若干个字节,把这些字节保存到数组b中,返回的是读取到的字节数(多少个字节)且将读取到的字节存储到b中,如果到了输入流的末尾,返回-1
int read(byte[] b ,int off, int len) 从输入流读若干个字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标,len指的是读的字节数目,返回的是读取到的字节数(多少个字节),且保存在数组b中,如果到了输入流的末尾,返回-1
int available(); 可以从输入流读取字节数目;

FileInputStream(File file)
FileInputStream(String name) 路径做参数

借助read()方法读

        FileInputStream fis=null;
        //读a.txt文件中的内容
        //输入流 路径做参数
        try {
            fis=new FileInputStream("a.txt");
            System.out.println("可以读到的字节数是:"+fis.available());
            //借助输入流的方法读文件 read
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data);//data返回的是整数形式 转换成char形式
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fis.close();//关闭流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

在这里插入图片描述

借助read(byte[] b)

        FileInputStream fis=null;
        //读a.txt文件中的内容
        //输入流 路径做参数
        try {
            fis=new FileInputStream("a.txt");
            System.out.println("可以读到的字节数是:"+fis.available());
            //借助数组的方式 创建数组 数组长度就是可读到的字节数
            byte[] b=new byte[fis.available()];
            fis.read(b);//从输入流读若干个字节,把这些字节保存到数组b中
            //保存的是字节的整数形式
            //转换成字符串
            String s=new String(b);//创建字符串对象 可以用byte数组做参数
            System.out.println(s);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fis.close();//关闭流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

在这里插入图片描述

演示int read(byte[] b ,int off,int len)

流是顺序的, 先进先出的队列
你想要读取到某一段流,就必须先把前面的流读取完毕后,才能读后面的
f.txt中是123456789 我只想读89

        FileInputStream fis=new FileInputStream("f.txt");
        byte[] b= new byte[fis.available()];
//        fis.read(b);
        fis.read(b,0,7);//保存到b数组 1234567
        //这里的0 是b数组的下标起始位置  7是read的数目
//        System.out.println(new String(b));
        //文件其实只剩下89
        b=new byte[fis.available()];//再重新初始化
        fis.read(b,0,2);//保存到b数组是89
        System.out.println(new String(b));
        FileInputStream fis =new FileInputStream("f.txt");
        byte[] b=new byte[fis.available()];
        fis.read(b,0,7);
        System.out.println(new String(b));
        fis.read(b,7,1);//读一个出来8  在下标7的位置
        System.out.println(new String(b));

在这里插入图片描述

        FileInputStream fis =new FileInputStream("f.txt");
        byte[] b=new byte[fis.available()];
        fis.read(b,0,7);
        System.out.println(new String(b));//b数组里是1234567
        fis.read(b,0,1);//读一个出来8  然后去置换下标位置为0的1
        System.out.println(new String(b));

在这里插入图片描述

        FileInputStream fis=null;
        //读a.txt文件中的内容
        //输入流 路径做参数
        try {
            fis=new FileInputStream("a.txt");
            System.out.println("可以读到的字节数是:"+fis.available());
            //借助数组的方式 创建数组 数组长度就是可读到的字节数
            byte[] b=new byte[4];
            int tem;
            //这里的理解是重点
            while((tem=fis.read(b))!=-1){//fis.read(b)每次返回的是实际读取的个数 不超过b的长度的最大值
                System.out.println(new String(b,0,tem));
            }
//            fis.read(b);//
//            fis.read(b,0,6);//从输入流读若干个字节,把这些字节保存到数组b中
//            fis.read(b,6,2);
            //保存的是字节的整数形式
            //转换成字符串
//            String s=new String(b);//创建字符串对象 可以用byte数组做参数
//            System.out.println(s);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fis.close();//关闭流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

在这里插入图片描述

FileOutputStream

OutputStream类 抽象类 父类 字节输出流

方法与FileInputStream相似
flush():强制将缓冲区清空
new FileOutputStream(String path,boolean append):可以追加覆盖或追加文件

        FileOutputStream fos=new FileOutputStream("b.txt");
         //FileOutputStream fos=new FileOutputStream("b.txt",true);//追加
        String s="firendship is precious";
        byte[] b=s.getBytes();//将字符串打散为字节数组
//        fos.write(b,0,b.length);//从0下标开始 长度为b.length
        fos.write(b);//以数组的方式往里面写
        fos.close();

在这里插入图片描述

		//边读边写
        FileInputStream fis=new FileInputStream("f.txt");
        FileOutputStream fos=new FileOutputStream("a.txt");
        int tmp;
        while ((tmp = fis.read()) != -1) {
            fos.write((char)tmp);
        }
		//全部读进去再写出来
        FileInputStream fis=new FileInputStream("D:/IOTest/picture.jpg");
        FileOutputStream fos=new FileOutputStream("picture.jpg");
        byte[] b=new byte[fis.available()];
        fis.read(b);//保存到b数组中
        fos.write(b);//将b数组写出来

创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值