IO 流浅谈


根据传入或者输出数据的不同,流分为两类,一类是 字符流,一类是字节流。

操作文字数据时使用字符流,操作文字数据之外的数据使用字节流,因为字符流中自带一套编码,能解析汉字,而字节流中没有此编码,若用字符流操作除文字数据以外的数据,容易出现丢字节,最终导致文件无法打开。

另外,字符流中,一个数据占两个单位,字节流中一个数据占一个单位,而一个汉字需要占据两个单位。

 

如果通过输入和输出来划分,IO流可分为两类,一类是输入,另一类是输出。输入包含,inputStream和Reader,输出包含outputStream和Write。Reader和write用来操作文字,inputStream 和outputstream 则相反。

记忆方法,reader在英文中的意思为读,可以理解为读报纸,writer在英文中的意思为写,可以理解为写作。Reader和write 分别对应,输入和输出。inputStream,可以理解为进去取,outputstream,可以理解为拿出来。inputStream,outputstream,分别对应输入和输出。

Write 是所有以write这个单词为结尾类的老大,他子类中比较常用的有Filewrite ,file在英文中的意思是文件,顾名思义这个类 可以用来,用来写入(输出)文字类的文件。

outputStream是所有以stream为结尾类的老大,他子类中比较常用的有FileIntputStream,这个类可以用来写入(输出)文字类之外的文件。

 

printWrite的构造方法中,可以接受四种类型的参数,分别是,File(这里指具体的文件,而不是路径)、write、outputstream以及字符串(字符串中代表一个具体的文件)。

printStream的构造方法中,可以接受三种,跟printwrite相比,少了write类型的。

printWrite,因为是以write为结尾,在输出时,必须要刷新(flush),否则数据无法进入指定目的地,(文件、System.out),如果不想用刷新,可以使用构造函数的重载方法,在流后面,加上一个true,就可以自动完成刷新。printWrite因为功能十分强大,在开发中常用。

 

System.out意为输出,也是控制台,如果不修改目的地,数据会打印在屏幕上,在某种意义上来说,System.out 等同于printStream ,因为在system 这个类的源代码中,out拥有对prinstream的引用。因此system.out拥有很多便捷之处,当某个函数需要outputstream或者printStream 作为参数时,可以用system.out进行替代,因为system.out在某种意义上来说代表着上面两个。  但与outputstream或者printStream不同的是,system.out 拥有某种特权,可以直接将数据打印到屏幕。

 

System.setout() 可以对打印目的地进行修改,并且只能修改,为outputstream所连接的目的地。

System.in  等同于inputstream ,System.in拥有特权,可以直接接收从键盘传来的数据,原理和System.out差不多,

System.setin() 可以对来源进行修改,并且只能修改为,outputstream所连接的目的地。

 

InputstreamReaderoutpustreamwrite   只能接收stream

Printwrite和printstream  这四种属于包装类

可以将类进行转换,转成函数所需要的类型。

 

 

Properties是一个集合类,对应着映射关系,拥有map集合所有的方法,其中的setproperty 方法等同于集合中的put方法,getproperty等同于集合中的get,stringfilenames 等同于 keyset,都返回一个set集合

不清楚为什么要用自带的方法而不用父类的方法,是为了便于观看??????

 

最重要的是他拥有两个特别牛逼的方法,仅仅用一个方法,就可以以键值对的形式,与硬盘相连接,一个是load(加载),一个是store(存储) 。若硬盘里的一个文件中,有着

“age”=“1”,可以通过方法直接加载进集合,这个方法的原理是用了BufferedReader中的readline方法,返回了一个string,然后又以“=”为切割点,使用spilt方法,讲字符串分为两节,用arr[0],arr[1],存入集合。

值得注意的是,properties中的键值对,均是String类型的,这点非常重要。

 

 

Load()的括号中,传入一个流,这个流可以是stream类型的,也可以是reader类型的,

Store()的括号中,可要传入一个流,可以是stream类型的,也可以是reader。和load()不同的是,在传参时,还需要传一个字符串。字符串中存储的是注释文件,如果不想写可以用“”代替,(传入一个空字符串)。

 

 

拥有readerline(读一行)方法的只有bufferedreader 和其子类 linenumberreader,其他类型的流文件,如果想要拥有这个方法,必须转换成该类,如果是以stream为结尾的可以通过Inputstreamreader转换,以reader为结尾的可以直接放入,bufferedreader的参数中。

 

拥有newline(换行)方法的只有bufferedWrite方法,其使用方法和bufferedreader一致,想要使用,也需要转换。

 

在reader中,Read()方法的返回值是一个数字,可以将这个数字通过强行转换,转成char,或者String ,用write写入目的地。

read(arr)方法返回值是一个char数组,可以直接用write写入目的地,也可以转换成,String再写入目的地,

 

在stream中,如果写入,只能写入int byte 和byte[],当写入int类型的数据时,stream中的write方法会自动   取后八位,将int转换成byte,(int 占32个单位,byte占8个单位),这样做的原因是为了防止-1的出现。

如果读取,可以用read(),read(arr),返回值分别是int,和int,为了便于区分,将两个int分别命名为,int1,和int2,  arr中储存的是所需要byte[]类型的数据,int2代表这个数组中有效数据的个数。   Int1表面上,看上去是一个Int类型的数据,实际上是一个byte型的数据,因为在调用read()方法时,返回的byte数据会&255,(&255会将一个占八个单位的byte转换成一个占32个单位的int),这样做是因为byte类型很容易出现11111111,8个1在计算机语言中,代表-1,一旦结果为-1程序就会停止,所以要进行类型转换。

 

File 既可以代表一个具体的文件,也可以代表一个路径(可以是一个文件夹,也可以是多个层叠的文件夹),当他为“xx.xx”时他代表一个具体的文件,其他的则相反。当然,“xx.xx”也能代表一个文件夹,也就是一个路径,这里要小心。

File类中有几个常用的方法,isFile 用于判断是否是一个文件,isDirectory用于判断是否是一个路径(文件夹)。List()方法,需要传入一个路径,返回值是string []arr,arr中装的是所有的文件名。

ListFiles()方法,同样需要传入一个路径(文件夹),返回值是file [] arr,arr中装的是这个传入的文件夹中,所有的file(文件)和file(文件夹)。

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值