小白的关于 IO流小笔记

在这里插入图片描述

1.2 流的分类
1.2.1 按方向【重点
  • 输入流:将<存储设备>中的内容读入到<内存>中。
  • 输出流:将<内存>中的内容写入到<存储设备>中。
1.2.2 按单位
  • 字节流:以字节为单位,可以读写所有数据 。

  • 字符流:以字符为单位,只能读写文本数据 。

1.2.3 按功能
  • 技术流、节点流:具有实际传输数据的读写功能。
  • **包装流、**过滤流:在节点流的基础之上增强功能。

InputStream:字节输入流基类,抽象类是表示字节输入流的所有类的超类。

	// 从输入流中读取数据的下一个字节 abstract 
	int read() 
    // 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中 
    int read(byte[] b) 
    // 将输入流中最多 len 个数据字节读入 byte 数组 
    int read(byte[] b, int off, int len)  	
    // 跳过和丢弃此输入流中数据的 n个字节 
    long skip(long n)

OutputStream:字节输出流基类,抽象类是表示输出字节流的所有类的超类。

	// 将 b.length 个字节从指定的 byte 数组写入此输出流 
	void write(byte[] b) 
    // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流 
    void write(byte[] b, int off, int len) 
    // 将指定的字节写入此输出流 abstract 	
    void write(int b)
    //刷新输出流,强制写出缓冲的输出字节
    void flush();

字节文件操作:

FileInputStream:字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。


	//1创建FileInputStream,并指定文件路径
	FileInputStream fis=new FileInputStream("d:\\aaa.txt");
	//FileInputStream 用 read 添加数据
	//public int read(byte[] b) 从流中读取多个字节,将独到的内容存入b数组中,返回实读到的字节数
	//如果达到尾部 返回-1
	//2读取文件
	//fis.read()
	//遍历读取打印
	  int data;
        while((data=fis.read())!=-1) {
            System.out.print((char) data);
        }
	//1创建文件字节输出流对象
	FileOutputStream fos=new FileOutputStream("d:\\bbb.txt",true);
	//FileOutputStream 用 write 添加数据

流的方法:

File类:

常见方法:

方法名描述
createNewFile()创建一个新文件。
mkdir()创建一个新目录。
delete()删除文件或空目录。
exists()判断File对象所对象所代表的对象是否存在。
getAbsolutePath()获取文件的绝对路径。
getName()取得名字。
getParent()获取文件/目录所在的目录。
isDirectory()是否是目录。
isFile()是否是文件。
length()获得文件的长度。
listFiles()列出目录中的所有内容。
renameTo()修改文件名为。
2.3 字节缓冲流

缓冲流:BufferedOutputStream/BufferedInputStream

  • 提高IO效率,减少访问磁盘的次数。
  • 数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close。
  • **mkdir( )**方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
  • **mkdirs()**方法创建一个文件夹和它的所有父文件夹。
	FileInputStream fis=new FileInputStream("d:\\aaa.txt");//创建输入字节流
	BufferedInputStream bis=new BufferedInputStream(fis);//创建输入缓冲流
	
		//2.2一次读取多个字节
		byte[] buf=new byte[1024];
		int count=0;
		while((count=bis.read(buf))!=-1) {
			System.out.println(new String(buf,0,count));
        }

带缓冲区的输入输入字符流:

BufferedWriter

BufferedReader

对象流:

ObjectOutputStream

ObjectInputStream

  • 增强了缓冲区功能。
  • 增强了读写8种基本数据类型和字符串功能。
  • 增强了读写对象的功能:
    • readObject() 从流中读取一个对象。
    • writeObject(Object obj) 向流中写入一个对象。

四、字符流【重点


4.1 字符抽象类

Reader:字符输入流

  • public int read(){}。
  • public int read(char[] c){}。
  • public int read(char[] b,int off,int len){}。

Writer:字符输出流

  • public void write(int n){}。
  • public void write(String str){}。
  • public void write(char[] c){}。
4.2 字符节点流

FileWriter

  • public void write(String str) 。
  • 一次写多个字符,将b数组中所有字符,写入输出流。

FileReader:

  • public int read(char[] c) 。
  • 从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。

四、字符流【重点


4.1 字符抽象类

Reader:字符输入流

  • public int read(){}。
  • public int read(char[] c){}。
  • public int read(char[] b,int off,int len){}。

Writer:字符输出流

  • public void write(int n){}。
  • public void write(String str){}。
  • public void write(char[] c){}。
4.2 字符节点流

FileWriter:

FileWriter fw=new FileWriter("d:\\buffer.txt");

  • public void write(String str) 。
  • 一次写多个字符,将b数组中所有字符,写入输出流。

FileReader:

FileReader fr=new FileReader("d:\\write.txt");

  • public int read(char[] c) 。
  • 从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
4.4 打印流

PrintWriter:

	PrintWriter pw=new PrintWriter("d:\\print.txt");
	//2打印
	pw.println(97);
  • println会直接输出你所输入的字符
  • 封装了print() / println()方法,支持写入后换行。
  • 支持数据原样打印。
4.5 转换流

转换流:

InputStreamReader

FileInputStream fis=new FileInputStream("d:\\write.txt");
	InputStreamReader isr=new InputStreamReader(fis, "gbk");

OutputStreamWriter
FileOutputStream fos=new FileOutputStream("d:\\info.txt"); OutputStreamWriter osw=new OutputStreamWriter(fos, "utf-8");

  • 可将字节流转换为字符流。
  • 可设置字符的编码方式。
  • 对象流
  • 内存流

序列化

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

ing:

1、根据处理数据类型的不同分为:
字符流:1)Reader 读取字符流的抽象类
      常用方法: read() 读取单个字符
read(char[] cbuf) 将字符读入数组。
            read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
            close() 关闭该流并释放与之关联的所有资源。
      2)Writer 写入字符流的抽象类
      常用方法:write(int c) 写入单个字符。
           write(String str) 写入字符串
           write(String str, int off, int len) 写入字符串的某一部分。
           write(char[] cbuf) 写入字符数组。
           write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
           flush() 刷新该流的缓冲。
           close() 关闭此流,但要先刷新它。
字节流:
      1)InputStream 此抽象类是表示字节输入流的所有类的超类
       常用方法:read() 从输入流中读取数据的下一个字节。
            read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
            read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。
            close() 关闭此输入流并释放与该流关联的所有系统资源。
      2) OutputStream 此抽象类是表示字节输出流的所有类的超类
       常用方法:write(int b) 将指定的字节写入此输出流。
            write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
            write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的
            flush() 刷新此输出流并强制写出所有缓冲的输出字节。
            close() 关闭此输出流并释放与此流有关的所有系统资源。
2、根据数据流向不同分为:输入流和输出流
3、字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
4、字节流和字符流的区别:
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
5、结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
6、输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

RandomAccessFile 随机访问流

…seek(1);偏移量 //表示指针所指方向

拥有指针

针对文件写入操作的时候,不会清空数据,从指针开始进行写入覆盖原有的数据。

复制文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6F5XtDE5-1599036743181)(E:\zuomian\笔记\image\断点续传.PNG)]

读写 =BIO

先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
6、输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

RandomAccessFile 随机访问流

…seek(1);偏移量 //表示指针所指方向

拥有指针

针对文件写入操作的时候,不会清空数据,从指针开始进行写入覆盖原有的数据。

复制文件:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值