I/O流输入和输出

I/O流输入和输出

输入(input)与输出(output)是任何语言都不能够避免的,比如:标准输入输出,文件操作,网络上的数据流,字符串流,对象流等
在JAVA中使用流机制来解决输入输出的问题
流的概念:
我们可以这样理解流:数据源~~~~~~~~(管道)~~~~~~~~目的地
我们把中间的传输理解为一个管道,而我们要做的就是搭建这个管道,在JAVA中,JDK已经给我们提供多个这样的管道来使用,我们需要根据需求来分辨使用哪一种管道。
我们对常用的流进行了分类,它们分别适用各种不同的需求

流分类

1、首先我们根据管道的方向分类:所有的管道均分为输入流和输出流。注意:这里的输入和输出都是站在程序端的立场上,我们以后也要一直站在程序端的立场来判断这些输入和输出

2、通过传输数据的最小单位进行分类:
(1)字节流 ,以byte为单位,一般二进制数据我们采用字节流(比如:图片、音乐)
(2)字符流,以char为单位,一般文本数据使用字符数据;
他们主要区别,我们可以用文本打开这个文件,如果乱码就用字节流,如果正常显示就用字节流。

3、通过流的功能进行划分:
(1)、节点流
(2)、操作流(注意:操作流不能单独使用)

我们以流的功能来分类说一下这些常用的流

节点流:(全是抽象父类)
	Inputstream(字节输入流):	
	Outputsteam(字节输出流)	  
	Reader(字符输入流)
	writer(字符输出流)
它们每个都有很多的子接口继承于它们
比如:FileInputstream(确定数据源来自于与一个文件)
看子接口名字的前面代表了输入流的数据源/输出流的目的地

下面我们具体来看看:分为四步考虑
首先我们来写文件

   //1、确定选择管道:
 

     String out = “床前明月光,疑是地上霜”
		//确定是输入流还是输出流
		//确认数据类型;
		//根据上面2步的分析确认四个父类的中的哪一个;
		//根据目的地的类型,选择父类中的哪一个子类
    **// 2、搭建管道**
           //只要有输出和输入操作,就一定会有编译时异常需要处理。所以我们用try-catch
            Filewriter fw = null;
            try{
            fw = new Filewiter("pome.txt")
     **//3、操作管道** 
   		fw.write()        //操作管道,所有的输出流,操作管道都是调用write方法。
         }catch (IOException){
   e.printStackTrace();
**// 4、关闭管道**      
 }finally{
  	 if( fw != null)
	   try{
     fw.close()}
 	  }catch (IOException){
   e.printStackTrace();
   }

读文件:

**//1、选择管道**
	//读取刚刚的存的文件
	(1)、选择FileReader
  string str = “”
	**//2、搭建管道**
 FileReader fr = null
 try{
  fr = new FileReadder(“popem.txt”)	
  int b = 0
  while((b=fr.read()) != -1){
   char c = (char)b}
  str +=c;
	**//3、操作管道**	
	}catch(FileNotFoundException e){
   e.printStackTrace();
		}catch (IOException){
   e.printStackTrace();
  }finally{
  if( fw != null)
  try{
   fw.close()}
  }catch (IOException){
   e.printStackTrace();
  }
操作流(对象流)

操作流又叫对象流,是对象的序列化
序列化::就是把程序中的JAVA对象,以二进制流的形式输出。
对象的反序列化: 将输入的二进制流直接转化成一个对象。
注意上面两段的叙述中,都没有输出到哪去,或者从哪里输入,也就是说对象的序列化/反序列化与文件操作无关。

所有的操作流都只负责操作流,输入或输出到哪里还是以节点流来确定
一个标准的JAVA类,应该要有序列化。
这里我们说说常用的对象流:

ObjectInputstream  //对象的反序列化: 将输入的二进制流直接转化成一个对象。
 ObjectOutputsteam    //对象的序列化:就是把程序中的JAVA对象,以二进制流的形式输出。

而 反序列化是第二种产生对象的方式;第一种是new一个对象
注意:
要可序列化就要在对象类当中必须先实现Serializable(序列化接口)标识接口,并且一个类要想参与序列化,除了该类本身要实现Serializable接口以外,它所有的属性所属的类也必须实现Serializableu接口
补充:如果一个类需要参与序列化,但又不想让某个属性参与,那么在该属性的申明出应该叫上transient关键字

Serializableu接口只是一个标识接口,不提供任何行为,只是相当于给实现类打上一个标记,从而运行执行某个执行操作;
在JDK当中,几乎所有的数据类型,包括集合类型都实现了Serializable接口
它的出现丰富了我们对接口设计的认知,接口有两种设计理由
1、为没有继承关系的类提供共有行为;这种接口一定会有抽象方法,关注的是抽象方法的重写
2、类似于Serializable接口,只是为了实现打标记,关注的是有没有这个接口,并不提供抽象方法。

我们前面说了,所有的操作类都不能单独使用,它必须配合节点流来使用:
按照上面的对流的理解,咱们可以这样来理解

数据源{~~~~~~~~~~~(对象流管道)~~~~~~~~~~}{~~~~~~~~~~~(节点流管道)~~~~~~~}目的地

就是让两个流管道进行对接,然后再输出或输入
示例:

 studenBean stu = new studenBean("张三",24);
 ObjectOutputStream oos = null; //操作流--负责完成传输过程中的数据操作
 FileOutputSteam fos = null;	 //节点流--负责完成对接目的地的地节点
 try{
 //操作流在设计的时候,天生就必须对接一个节点流管道
	//而Java在设计他们的时候采用了一种叫做“装饰器”的设计模式,
	//所以在代码级别表现出来,都是在new操作流管道的同时,传入对接管道的对象
 oos = new ObjectOutputStream( new FileOutputSteam("stu.data"))
 }catch(FileNotFoundException e){
   e.printStackTrace();
		}catch (IOException){
   e.printStackTrace();
  }finally{
  if( oos != null)
  try{
			oos.close()}
  }catch (IOException){
   e.printStackTrace();
  }

这里补充一个文件类File
File可以对文件进行操作
FIle类(文件)是JDK当中专门用来表示文件的常用类型
注意:File对象不仅仅能表示文件,也能表示文件夹,

创建File实例

File file = new File(“K:/416作业.txt”)	//表示文件
File director = new File(“K:/JOB”)	//表示文件夹

文件行为:

file.exists()	//返回这个文件是否存在
file.length	//返回文件的字节大小,lang类型的
file.lastModified()	//文件上一次的修改时间,返回的是Lang类型毫秒数
file.canWritr()	//文件是否可写
file.canRead()	//文件是否可读
file.delete()		//删除文件
file.deleteOnExit()	//如果文件存在则删除
file.isHisdden()	//判断是否是隐藏文件
file.createNewFile()	//创建一个新的空白文件

文件夹行为

director.exists()	//返回这个文件夹是否存在
director.length	//返回文件夹的字节大小,lang类型的
director.lastModified()	//文件夹上一次的修改时间,返回的是Lang类型毫秒数
director.canWritr()	//文件夹是否可写
director.canRead()	//文件夹是否可读
director.delete()	//删除文件夹
director.deleteOnExit()	//如果文件夹存在则删除
director.mkdir()	//创建一个新的空白文件夹
director.isFile()	//判断是否是文件
director.isDirectory	//判断是否是文件夹
可以遍历文件夹下面的子文件或者子文件夹
director.list();		//以String数组的形式返回,下面的子文件/文件夹名
director.listFiles()	//以file对象的形式返回,下面的子文件或文件名
director.getAbsolutePath()	//获取子文件的文件路径





// 所有的文件或文件操作,一定会涉及到以个东西,分隔符。
    //在不同的操作系统中,分隔符是不一样的。Windows中“/”,Unix中"\"
    string path =“data/****.data”;//这个只有在Windows中有效,一旦发布到服务器(服务器一般不用windows)
    //程序需要改这个分隔符
    string path1 = “data”+file.separator+"****.data"	//用这个表示分隔符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值