Java IO流的基本操作

       经过了快一个月的学习,JavaSE部分已经基本上结束了,最近开始了数据库的学习,但前面的模块还是不太熟练,有的知识点甚至不清晰,所以趁着元旦假期间整理整理之前的笔记,把前面的知识点再回顾一下。在前面的学习过程中,我觉得最主要的难点还是在IO流和多线程这块,这块感觉有点抽象,不是那么容易理解,理解了用起来也可能出现问题,这就很淦,所以这三天时间主要是把这块的知识再巩固一下,今天就先把IO流这块的基础知识回顾一下。

1.流的概念

Java的IO流是实现输入与输出的基础,即数据在俩设备之间的传输就称为流,流的本质是数据传输,因为数据在传输过程中是需要通道的,而IO流就是数据传输的通道,程序除了自身定义一些数据信息外,有时候还会引用外界的数据或者是将自身的数据传送到外界,这时就要借助于“流”来更直观方便的进行数据操作。

2.流的分类

  • 输入流和输出流

   输入流:从外界(网络或本地文件等)到程序的方向。

   输出流:从程序输出到外界方向。

        此处的输入,输出相对于代码而言。

  • 节点流和处理流

   节点流:从或向一个特定的地方(节点)读写数据。

   处理流:是对一个已经存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。 处理流的构造方法总是要带一个其他流对象做参数,一个流对象经过
   其他流的多次包装,称为流的链接。

       按照流是否直接与特定的地方(磁盘,内存,设备等)相连而区分节点流与处理流。

  • 字节流和字符流

 字节流:每次读写一个字节

 字符流:每次读写一个字符

3.IO流的类

 InputStream是所有字节输入流的父类,其定义了基础的读取方法:

     int read();读取一个字节,以int形式返回
     int read(byte[] d);尝试最多读取给定的数组的length个字节并存入数组,返回值为实际读取的字节量

OutputStream是所有字节输出流的父类,其定义了基础的写出方法:
      void write(int d)写出一个字节
      void write(byte[] d)将给定的字节数组中的所有字节全部写出

Reader是所有字符输入流的父类:

    Reader常用方法:
      int read();读取一个字符
      int read(char[] chs);从该流中读取一个字符数组length个字符并存入该数组,返回值为实际读取的字符量

Writer是所有字符输出流的父类

    Writer常用方法:
      void write(int c);写出一个字符
      void write(String str);将给定的字符串写出
      void write(char[] chs.int off,int len);将给定的字符数组中从off开始连续的len个字符写出

4.文件流,缓冲流,对象流

  • 文件流

创建FOS对象(重写模式)
    FileOutputStream是文件的字节输出流,通过该流可以以字节为单位将数据写入文件
    构造方法:
       FileOutputStream(File file)
       创建一个向指定File对象表示的文件中写入数据的文件输出流
    构造方法:
       FileOutputStream(String filename)
       创建一个向指定名称文件中写入数据的文件输出流

    注意:若指定的文件已经包含内容,那么当使用FOS对其写入数据时,会将该文件中原有数据清除。

创建FOS对象(追加模式)
    构造方法:
       FileOutputStream(File file,boolean append)
       创建一个向指定File对象表示的文件中写入数据的文件输出流,当第二个参数为true时,在原有数据之后追加
    构造方法:
       FileOutputStream(String filename,boolean append)
       创建一个向指定名称文件中写入数据的文件输出流,当第二个参数为true时,在原有数据之后追加  
    
创建FIS对象
    FileInputStream是文件的字节输入流,使用该流可以以字节为单位读取文件内容
    构造方法:
         FileInputStream(File file)
         创建用于读取给定的File对象所表示的文件
    构造方法:
         FileInputStream(String name)
         创建用于读取给定的文件系统中的路径所表示的文件 

read()和write(int d)方法
    int read()
    从此输入流中读取一个数据字节

    void write(int d)
    将指定的字节写入此文件的输出流

    int read(byte[] b)
    批量读取字节数据

    void write(byte[] d)
    批量写出字节

    void write(byte[] d.int off,int len)
    将指定byte数组中从偏移量off开始的len个字节写入此文件输出流

  • 缓冲流

    BOS实现写出缓冲,在向硬件设备做写出操作时,增大写出次数无疑会降低写出效率,为此可以使用缓冲输出流来一次性批量写出若干数据减少写出次数来提高效率,BufferedOutputStream缓冲字节输出流内部维护者一个缓冲区,每当向该流写数据时,都会先将数据存入缓冲区,当缓冲区满,缓冲流会将数据一次性全部写出,写入同理。

    BOS的flush方法:使用缓冲输出流可以提高写出效率,但是也存在一个问题,就是写出的数据缺乏即时性,有时我们需要在执行完某些写出操作后,就希望将这些数据立即写入,而非在缓冲区中保存直至缓冲区满后才写出,而又不希望关流,这是可以使用缓冲流的flush方法,释放空间,批量写出
    void flush()
    清空缓冲区,将缓冲区的数据强制写出

  • 对象流

   对象是存在与内存中,有时需要将对象保存到硬盘上,又有时需要将对象传输到另一台计算机上等等。这时需要将对象转换为一个字节序列,这个过程就称为对象序列化。相反,有一个这样的字节序列,需要
 将其转换为对应的对象,这个过程就成为对象反序列化。

使用OOS实现对象序列化ObjectOutputStream是用来对对象进行序列化的输出流
      ObjectOutputStream(Object o)
      该方法可以将给定的对象转换为一个字节序列写出write(Object c)

使用OIS实现对象反序列化
      ObjectInputStream是用来对对象进行反序列化的输出流
      实现对象反序列化的方法为
      Object readObject()
      该方法可以从流中读取字节转换为对应的对象

      在这里有个有个Serializable接口需要注意,ObjectOutputStream在对对象进行序列化时需要序列化对象所属的类必须实现Serializable接口,实现该接口不需要重写任何方法,其只是作为可序列化的标志。

transient关键字
    对象在序列化后得到的字节序列往往比较大,有时在对一个对象进行序列化时可以根据需求忽略某些不必要的属性,从而对对象进行"瘦身"
 

示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class Java_IO {
	public static void main(String[] args) throws IOException {
		File file = new File("C:/Users/Administrator/Desktop",
				"2020-12-31/java");//声明一个目录
		file.mkdirs();//创建该目录
		File fi=new File("C:/Users/Administrator/Desktop/" +
				"2020-12-31/java/text1.txt");//声明一个TXT文件
		fi.createNewFile();//判断TXT文件是否存在,若不存在则原地创建
//		System.out.println(fi.exists());
//		//file.delete();
		FileOutputStream fos =new FileOutputStream(fi,true);//根据文件路径实例化一个输出流对象
		String str1="一人有一个梦想,两人热爱渐迷惘";//输入要写入的字符串
		byte[] date=str1.getBytes();//把String转换成byte数组
		int i=0;//定义一个变量用来控制写入次数
		while(true){
		fos.write(date);//把byte数组输出
//		if(fos!=null){
//			fos.close();
		i++;
		if(i>=10){
			fos.close();//关流
			break;
		}
		fos.write('\n');//换行
		}
		FileInputStream fis =new FileInputStream (fi);//实例化一个输入流对象
		int size=fis.available();//得到流中的byte字节数
		byte[] date1=new byte[size];//根据字节数建立一个Byte数组
		fis.read(date1);//读取字符串
		str1=new String(date1);//将byte数组新建一个字符串
		System.out.println(str1);//读出字符串
		fis.close();//关流
		System.out.println(fi.length());//文件所占字节量
		System.out.println("结束");
	}
	
}

      由于天气原因只敲了文件流部分的代码,IO流这块稍微有一点难理解,需要多练习多动手敲敲代码才能真正的掌握它,我后面也要多去练练,这块迷得很。溜了溜了回宿舍了,图书馆冷的一批QAQ,祝大家元旦happy,早日发财!

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值