0
点赞
收藏
分享

微信扫一扫

【Day14-IO流】

b91bff6ffdb5 2022-03-18 阅读 72
java

一、基础概念

1、IO 流 -->   I  input     O  output   Stream
2、IO流  -->  输入输出流     所谓的入和出都是相应于内存的。
     txt  -->   java(JVM ,内存)                            输入流
     java代码  String a = "hello world"   -->  txt    输出流
3、按照传输的数据类型 分为 字节流 和 字符流
     字节 -->  byte  = 8 bit    -->  电影、音乐, 图片 -->   每一个电影以及音乐缺少一点点都可以导致       整部电影播放不了,所以需要细粒度的传输。

     可以表示英文的,英文的字符可以用一个字节表示
     字符  --> char   -->  文本的传输

常用编码:  

ASCII码:
   一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
   一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最  小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:
    一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码:
    一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:
    英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号      “。”占2个字节的大小。

二、常用流的父类

字节流的两个父类:

     - 字节输入流:InputStream
     - 字节输出流:OutputStream

字符流的两个父类:

     - 字符读入流:Reader
     - 字符写出流:Writer

IO流使⽤的注意事项:

     - 四大父类流,都是抽象类, 都不能实例化对象。需要借助他们的子类实现数据的读写。
     - 流对象一旦实例化完成, 将建立一个程序与文件之间的连接。 这个连接会持有这个文件。 如果这个连接不断, 此时这个文件就是一个被使用中的状态, 此时将无法对这个文件进行其他的操作,例如删除。
     - 一个流在使用完成之后, 切记! 一定要进行流的关闭。

三、知识预备

1、绝对路径和相对路径

绝对路径:就是真实的路径,是计算机中完整路径,必须准确,否则不能找到,起点是系统的根目录,也就是各个盘符,例如:C:/Users/a1394/Desktop/OneDrive

相对路径:绝对路径是一种简化版的路径,以当前文件,活动窗口目录为根目录,进行向上或者向下切入。

2、不同操作系统中分隔符区别

目录分隔符: Windows \       Linux /

路径分隔符: Windows ;    Linux :

3、常用类File

File常用的构造方法:

// 构造方法一:通过一个参数创建file

File file = new File("C:\\Users\\User\\Desktop\\a.txt");
System.out.println(file.exists());

File file2 = new File("C:\\Users\\User\\Desktop\\b.txt");
System.out.println(file2.exists());

// 构造方法二:根据两个参数决定一个路径
File file3 = new File("C:\\Users\\User\\Desktop","a.txt");

// 文件夹也可以是File类的实例化对象
File director = new File("C:\\Users\\User\\Desktop");
File file4 = new File(director, "a.txt");

File类的常用方法:

package com.day14;

import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
 * @Author
 * @Description TODO
 * @Date 2022/3/18 10:15
 * @Version 1.0
 */
public class Demo03 {
    public static void main(String[] args) throws IOException {
        //
        File file = new File("D:\\桌面文件\\银行系统.txt");
        System.out.println(file.exists());  //判断⼀个⽂件(⽬录)是否存在。
        System.out.println(file.isFile());  //判断⼀个路径指定的是否是⼀个⽂件。
        System.out.println(file.isDirectory()); //判断⼀个路径指定的是否是⼀个⽂件夹。
        System.out.println(file.canExecute());  //判断⼀个⽂件(⽬录)是否是可执⾏的。
        System.out.println(file.canRead());   //判断⼀个⽂件(⽬录)是否是可读的。
        System.out.println(file.canWrite());  //判断⼀个⽂件(⽬录)是否是可写的。
        System.out.println(file.isHidden());  //判断⼀个⽂件(⽬录)是否是隐藏的。
        System.out.println(file.getAbsolutePath());  //获取⼀个⽂件(⽬录)的路径。
        System.out.println(file.getName());  //获取⼀个⽂件(⽬录)的⽬录。
        System.out.println(file.getParent());  //获取⼀个⽂件(⽬录)的⽗级路径(字符串)。
        System.out.println(file.lastModified()); //获取⼀个⽂件(⽬录)上次修改的时间。

        //获取⽂件上次修改的时间(时间戳)--是最后修改的时间,不是查看的时间   
        long time = file.lastModified();
        Date date = new Date(time);
        System.out.println(date);

        File file1 = new File("D:\\桌面文件\\a.txt");
        if (!file1.exists()){
            file1.createNewFile();
        }

        file1.delete();
    }
}

四、字节流操作

1、输入字节流:

每次读取一个字节的方式,效率较低

        //这个地方a.txt    
        // 指的是classes文件夹  表现形式就是 项目目录下
        try(InputStream fileInputStream = new FileInputStream("a.txt")){

            // 每次读取一个字节  -->  这个字节可以读取英文的字符
            //  a -->  占两个字节是错误的,占一个
            /**
             *   read()    字节流每次读取一个字节
             *             如果读取到-1 说明结束了
             */
            /*int read = fileInputStream.read();
            System.out.println((char)read);
            int read2 = fileInputStream.read();
            System.out.println((char)read2);
            int read3 = fileInputStream.read();
            System.out.println((char)read3);
            int read4 = fileInputStream.read();
            System.out.println((char)read4);
            int read5 = fileInputStream.read();
            System.out.println((char)read5);
            int read6 = fileInputStream.read();
            System.out.println(read6);

            System.out.println((char)-1);
            System.out.println((char)-2);*/

            /**
             *  使用循环的方式获取字节流
             *
             */
            int a ;
            while( (a = fileInputStream.read()) != -1){
                System.out.print((char)a);
            }

        }catch (Exception e){
            e.printStackTrace();
        }

2、每次读取一个数组的长度,效率较高

// 这个地方  a.txt    // 指的是classes文件夹  表现形式就是 项目目录下
        try(InputStream fileInputStream = new FileInputStream("a.txt")){

            // 拉煤的车,数组的长度就是 车的载重
            byte[] bytes = new byte[2];
           /* // 这个方法指的是使用一个数组去承载想要读取的数据
            fileInputStream.read(bytes);

            // 现在有一个byte数组,里面有数据,怎么转String
            System.out.println(new String(bytes));
            fileInputStream.read(bytes);
            System.out.println(new String(bytes));

            // read 通过数组读取,读取的个数是返回值。
            fileInputStream.read(bytes);
            System.out.println(new String(bytes, 0, 1));
            //System.out.println(new String(bytes));*/
            int num;
            while( (num = fileInputStream.read(bytes)) != -1){
                System.out.print(new String(bytes, 0, num));
            }

        }catch (Exception e){
            e.printStackTrace();
        }

3、字节输出流:

每次写一个字节

try (OutputStream outputStream = new FileOutputStream("C:\\Users\\User\\Desktop\\b.txt")) {

            String str = "HelloWorld";
            byte[] bytes = str.getBytes();
            // outputStream 有一个方法,每次写一个字节
            for (byte b:bytes) {
                outputStream.write(b);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

4、拷贝功能

 File file = new File("C:\\Users\\User\\Pictures\\mmexport1647173350471.jpg");
        String name = file.getName();
        try(
                InputStream inputStream = new FileInputStream(file);
                FileOutputStream outputStream = new FileOutputStream("D:\\"+name)
        ){
            byte[] arr =new byte[3];
            int num ;
            while((num = inputStream.read(arr)) != -1){
                outputStream.write(arr,0,num);
            }

        }catch (Exception e){
            e.printStackTrace();
        }

五、字符流操作

1、读取文本内容:

 try(Reader reader = new FileReader("C:\\Users\\User\\Desktop\\b.txt")){

            char[] arr = new char[8];
            int num;
            while((num =reader.read(arr)) != -1){
                String s = new String(arr, 0, num);
                System.out.print(s);
            }

        }catch (Exception e){
            e.printStackTrace();
        }

2、写入文本内容:

try (Writer writer = new FileWriter("C:\\Users\\User\\Desktop\\c.txt",true)) {

            String str = "HelloWorld";
            char[] bytes = str.toCharArray();
            // outputStream 有一个方法,每次写一个字节
            for (char b:bytes) {
                writer.write(b);
            }
            writer.write('\n');
            // 强制将缓存中的数据刷入到文件中
            writer.flush();

        } catch (Exception e) {
            e.printStackTrace();
        }

3、尝试使用字节流去拷贝图片

package com.day14;

import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * @Author
 * @Description TODO
 * @Date 2022/3/18 14:49
 * @Version 1.0
 */
public class Demo09 {
    public static void main(String[] args) {

        try(FileInputStream fileInputStream = new FileInputStream("E:\\壁纸\\永劫无间-宁红叶.png");
            final FileOutputStream fileOutputStream = new FileOutputStream("D:\\3.jpg");
        ){
            byte[] arr = new byte[1024];
            int num;
            while ((num = fileInputStream.read(arr))!= -1){
                fileOutputStream.write(arr,0,num);
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

拷贝成功:

 4、尝试使用字符流去拷贝图片,发现可以拷贝,但是打不开,拷贝失败:

File file = new File("C:\\Users\\User\\Pictures\\mmexport1640224454506.jpg.jpg");
        String name = file.getName();
        try(
                FileReader inputStream = new FileReader(file);
                FileWriter outputStream = new FileWriter("D:\\"+name)
        ){
            char[] arr =new char[10];
            int num ;
            while((num = inputStream.read(arr)) != -1){
                outputStream.write(arr,0,num);
            }
            outputStream.flush();

        }catch (Exception e){
            e.printStackTrace();
        }
举报

相关推荐

0 条评论