Java流【全】

发布于:2025-06-02 ⋅ 阅读:(24) ⋅ 点赞:(0)

IO流分类

AA、根据数据流动的方向:输入流和输出流

如:打开一个新的记事本并输入一些内容,而这些内容是在内存里面的,没有存储到磁盘中,当点击保存之后,数据才会从内存流向磁盘;
       当双击打开磁盘文件的时候,数据才会从磁盘流向内存
		
       【数据存储有一个特点:内存一旦断电数据消失,磁盘永久保存】
       如何选择使用输入流或者输出流?
       【程序角度来说:Ctrl+s当内存流向磁盘[输出流],双击打开磁盘文件磁盘流向内存[输入流]

什么是IO?

I(InputStream)O(OutputStream)指的就是输入流和输出流

生活中遇到常见的流:物流、人流、车流、水流、电流……【共同点:强调一个东西,从一个地方到另一个地方】

BB、根据数据流动的类型:字节流和字符流

数据流动的单位是字节就叫做字节流

数据流动的单位是字符就叫做字符流

IO的四大抽象流(都是抽象类):

InputStream:所有字节输入流的基类,其中API里面无提供专门获取对象的方法,可以自己写一个子类继承它,或者直接找它已有的子类,new一个它的子类就能用InputStream里面的方法

这里操作的是文件,就选一个相近一点的使用InputStream下面的子类——FileInputStream

FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境
FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader

字段摘要【无】

构造方法摘要

FileInputStream(File file)

	通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定
	根据指定的文件**对象**创建字节输入流对象

FileInputStream(String name)

	通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定
	根据指定的文件**路径名**创建字节输入流对象
public class InputStremFileInputStremDemo {
   
    public static void main(String[] args) throws FileNotFoundException {
   
        //该构造需要抛异常,可进入FileInputStream构造里面看
        //创建字节输入流对象
        FileInputStream fileInputStream = new FileInputStream("xxxxxx.txt");//不存在的文件
        System.out.println(fileInputStream);//文件不存在,报错
        //Exception in thread "main" java.io.FileNotFoundException: xxxxxx.txt (系统找不到指定的文件。)
    }
}

方法摘要

int read()

	从此输入流中读取一个**数据字节**,下一个数据字节无则返回 -1
	一次性只能读取到一个字节,返回的是ASCII值,如果读到末尾返回 -1

在这里插入图片描述
先创建a.txt文件并写入内容保存,再使用字节输入流读取出来

从文件读取出来是对应的数字

public class InputStremFileInputStremDemo {
   
    public static void main(String[] args) throws IOException {
   
        //创建字节输入流对象
        FileInputStream fileInputStream = new FileInputStream("D:/hh/a.txt");
        //读取第一个字节
        int readK = fileInputStream.read();//read方法需要抛异常
        System.out.println(readK);
        //读取第二个字节
        int readS = fileInputStream.read();
        System.out.println(readS);
        //读取第三个字节
        int readD = fileInputStream.read();
        System.out.println(readD);
        //读取第四个字节
        int readJ = fileInputStream.read();
        System.out.println(readJ);
        //读取第五个字节
        int read = fileInputStream.read();
        System.out.println(read);
        /**
         * 107
         * 115
         * 100
         * 106
         * -1
         */
         //关闭IO流
         fileInputStream.close();
    }
}

从文件读取出来是对应的内容

public class InputStremFileInputStremDemo {
   
    public static void main(String[] args) throws IOException {
   
        //创建字节输入流对象
        FileInputStream fileInputStream = new FileInputStream("D:/hh/a.txt");
        //读取第一个字节
        int read = fileInputStream.read();//read方法需要抛异常
        System.out.println((char) read);
        //读取第二个字节
        read = fileInputStream.read();
        System.out.println((char)read);
        //读取第三个字节
        read = fileInputStream.read();
        System.out.println((char)read);
        //读取第四个字节
        read = fileInputStream.read();
        System.out.println((char)read);
        //读取第五个字节
        read = fileInputStream.read();
        System.out.println(read);//无对应内容
        /**
         * k
         * s
         * d
         * j
         * -1
         */
         //关闭IO流
         fileInputStream.close();
    }
}

循环读取字节——模式1【这里的缺陷:一次性只能装一个数据,因为read()方法只能一次性读取一个字节】

public class InputStremFileInputStremDemo {
   
    public static void main(String[] args) throws IOException {
   
        //创建字节输入流对象
        FileInputStream fileInputStream = new FileInputStream("D:/hh/a.txt");
        //一次性读取一个字节
        int read ; //这里不是没有初始化,没报错的原因,因为其实下面使用已经赋值了,局部变量必须会赋值,不然会提示Variable 'read' might not have been initialized
        //定义一个可变字符串,来拼接字符
        StringBuilder stringBuilder = new StringBuilder();
        //循环读取字节,把读取出来的字符赋值给read,然后以read去判断是否等于-1
        //这里不确定循环的次数所以不能用for循环,所以不知道循环次数都用while
        while ((read = fileInputStream.read()) != -1){
   
            stringBuilder.append((char) read);
            //System.out.println((char)read);
            /**
             * k
             * s
             * d
             * j
             */
        }
        System.out.println(stringBuilder);//ksdj
        //关闭IO流
        fileInputStream.close();
    }
}

常识:一个英文字母占一个字节

int read(byte[] b)

	从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
	一次性能读取多个字节,返回读取字节的个数,如果读到末尾返回 -1

循环读取字节——模式2【这里的缺陷:一次性能装多个数据,因为read(byte[] b)方法能一次性读取多个字节】

public class InputStremFileInputStremDemo {
   
    public static void main(String[] args) throws IOException {
   
        //创建字节输入流对象
        FileInputStream fileInputStream = new FileInputStream("D:/hh/a.txt");
        //一次性读取多个字节
        byte[] bytes = new byte[4];//如果这里为7,实际只有四个字节,会显示null
        //把读取出来的字节放到bytes数组里面
        fileInputStream.read(bytes);
        System.out.println(Arrays.toString(bytes));//[107, 115, 100, 106]
        /**
         * String(byte[] bytes)
         * 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
         */
        System.out.println(new String(bytes));//ksdj
        //关闭IO流
        fileInputStream.close();
    }
}

有中文可以输出中文

public class InputStremFileInputStremDemo {
   
    public static void main(String[] args) throws IOException {
   
        //创建字节输入流对象
        FileInputStream fileInputStream = 

网站公告

今日签到

点亮在社区的每一天
去签到