java基础笔记之IO流:

时间:2023-02-24 19:03:04
知识点: IO流: 概述:用来传输数据的 // 内存和硬盘之间进行数据交互的 分类: 流向: 输入流:读取数据 输出流:写数据 操作: 字节流:可以操作任意类型的数据,但是操作中文可能会出现乱码 字符流:专门用来操作纯文本文件 字节流的常用抽象父类: InputStream:字节输入流. 继承类: FileInputStream: 构造方法: public FileInputStream(String name); public FileInputStream(File file); 成员方法: available(); //了解即可. 获取到要读取的文件的 所有字节数 read():一次读一个字节,读不到返回-1,读到就返回对应的码值 read(byte[] bys):一次读一个数组,读不到返回-1,读到就返回有效字节数,返回值:int FileInputStream fls =newFileInputStream(放一个文件路径(file是一个封装路径的对象)); //int x = fls.read();从硬盘上读取一个字节 一般这样写: int b; while((b.read())!=-1){ system.out.println(b); } fls.close();关闭释放资源 文件结束标记是-1; BufferedInputStream(字节缓冲输入流/字节高效输入流):封装的是普通流 OutputStream:字节输出流 继承类: FileOutputStream:创建对象时,如果没有就会帮我们创建出来,如果有了,就会把文件清空,再写入数据 构造方法: //如果文件不存在,会自动创建. public FileOutputStream(String name); public FileOutputStream(File file);
public FileOutputStream(String name,boolean append);//往文件中追加数据 public FileOutputStream(File file,boolean append); 成员方法: write(int a): write(byte[] bys); write(byte[] bys,int index,int len); BufferedOutputStream: //字节缓冲输出流(字节高效输出流) 代码: FileOutputStream fos = new FileOutputStream(放文件路径,如果没有就自己创建,boolean append//默认是false,不会在后面追加,只会覆盖,改成true就会续写);//创建字节流输出流对象,没有就自动创建 fos.write(内容); fos.close()
字节流操作中文的问题: 读取中文: 可能会读取到中文的半个字节,造成乱码. 写出中文: 需要将中文转换成其对应的 字节数组,然后再写出.getbyte()



字符流的常见抽象父类: Reader:字符输入流 Writer:字符输出流
拷贝图片
定义一个小数组来拷贝文件(推荐) 字节流一次读写一个指定长度的字节数组. FileInputStream fis = new FileInputStream("ss.jpg");//创建输入流对象,封装的是数据源 FileOutputStream fis = new FileOutputStream("copy.jpg");//创建输出流,封装的的是目的地 byte[] arr = new byte[长度,一般是1024的整数倍]; int len ; while((len=fis.read(arr))!=-1){//如果忘记加arr,返回的就不是字节个数了,而是字节码的值, fos.rea(arr,0,len//有效的字节数);
} fis.close();//关闭释放资源 fos.close()
代码:第一种拷贝 FileInputStream fis = new FileInputStream("ss.jpg");//创建输入流对象 FileOutputStream fis = new FileOutputStream("copy.jpg");//创建输出流 int b; while((b=fis.read())!=-1){//不断读取每个字节 fos.write(b);//逐个字节拷贝 } fis.close();//关闭释放资源 fos.close()
//fis.available获取文件大小(不推荐)



IO流的核心代码: 1: 创建输入流对象,封装数据源文件. 2: 创建输出流对象,封装目的地文件. 3: 定义变量,用来记录读取到的内容(或者是有效字节(符)数). 4: 定义循环开始读取,只要条件满足就一直读. 5: 将读取到的内容写入到目的地文件中. 6: 关闭关闭输入流对象和输出流对象.







面试题: 记忆: 1.集合的顶层都是接口,IO流是抽象类 2. 普通流封装的是文件,高效流封装的是普通流 3: 在try(){}格式中,写在小括号中的代码会在大括号中的代码执行完毕后,自动释放. 前提是: 必须实现 AutoCloseable 接口.
1.read()方法读取一个字节,为什么返回int,而不是byte? 防止中间出现11111111(-1的补码),这样的数据,后面的数据就读取不了啦 2: 字节缓冲流的内置缓冲区大小是多少? 8192个字节. 3.close() 和flush() 方法的区别? * flush()方法: 具备刷新的功能,用来刷新缓冲区的,刷新之后,流对象可以继续使用. * close()方法:      * 具备刷新的功能,用来关闭流,释放资源的,在关闭流之前,会刷新一次缓冲区,关闭时候,流对象不可以继续使用.