java基础--IO流中的其它流和其它类

来源:互联网 发布:2016淘宝详情尺寸大小 编辑:程序博客网 时间:2024/05/16 19:28

 JAVA 基础--IO流中的其它流和其它类

前言:凡是能和文件相关的流对象,都是比较重要的

IO 包中的其他类:

|--操作基本数据类型

DataInputStream 和 DataOutputStream

|--操作字节数组

ByteArrayInputStream 和 ByteArrayOutputStream

|--操作字符数组

CharArrayReader 和 CharArrayWriter

|--操作字符串数组

StringReader 和 StringWriter

一、IO中的其它流

1、打印流:该流提供了打印方法,可以将各种数据类型的数据原样打印。

2、字节打印流:PrintStream

构造函数可以接收的参数类型:

1、file 对象。File

2、字符串路径。String

3、字节输出流。OutputStream 

4、字符打印流:PrintWriter

构造函数可以接收的参数类型:

1、file 对象。File

2、字符串路径。String

3、字节输出流。OutputStream 

4、字符输出流。Writer

5、合并流SequenceStream用于多个文件流的合并

6、管道流

二、Properties

1、Properties 是 hashTable 的子类。也就是说它具备 map 集合的特点,而且它里面存储的键值对都是字符串。是集合和IO技术相结合的集合容器。那么 map + IO 就是 Properties。

2、该对象的特点:可以用于键值对形式的配置文件。那么在加载数据时候,需要数据有固定格式:键=值。

3、优点:配置文件可以实现应用程序数据的共享。该配置文件使用键值对的形式,这样便于阅读与操作数据。

4、练习:

需求:用于记录应用程序运行次数。如果使用次数已经达到限制,那么提示注册。

很容易想到的是计数器:

可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行了自增。可是,随着该应用程序的退出,该计数器也在内存中消失了。下一次再次启动该程序,计数器又重新开始从0计数,这样不是我们想要的程序。

我们想要的:程序即使结束,该计数器的值也还是存在,下一次程序启动,会先加载该计数器的值并且,加一后再重新存储起来。所以,要建立一个配置文件,用于记录该软件的使用次数。

Code:

package study.part2.day015.iostudy;import java.util.*;import java.io.*;public class PropertiesDemo2 {public static void main(String[] args) throws IOException {propertiesFile();}/** * 创建配置文件方法一:通过这个方法,我们发现,一个安装的软件,只需要删除配置文件,就能 * 达到继续使用的效果。而不是删除软件再重新安装。但是,有些软件把配置文件的使用次数,期 * 限,存放着 system32 的某个系统配置文件中。 */public static void propertiesFile() throws IOException{Properties prop = new Properties();//所以,把配置文件封装在 File 文件对象中,方便对文件的判断是否存在等。File f = new File("D:\\IOStudyTest\\Properties.ini");//如果不存在该文件if(!(f.exists())){//创建该文件f.createNewFile();}//因为流无法对判断配置文件是否存在。FileInputStream fis = new FileInputStream("D:\\IOStudyTest\\Properties.ini");prop.load(fis);int count = 0;String value = prop.getProperty("time");if((value)!=null){count = Integer.parseInt(value);if(count>=5){System.out.println("您好,免费使用次数已到达上。限请注册吧。");return;}}count++;prop.setProperty("time", count+"");//把存储完的信息存入 File 中FileOutputStream fos = new FileOutputStream("D:\\IOStudyTest\\Properties.ini");prop.store(fos, "");fos.close();fis.close();}public static void config(){/** * XML 的文件封装格式 * name=zhanglin * age=26 * <persons> * <person id="1001"> * <name>zhanglin</name> * <age>26</age> * <addr>北京</addr> * </person> * </persons> */}}

三、字节数组的流对象。用流的读写思想来操作数据。

ByteArrayInputStream:在构造的时候,需要接收数据源,而且数据源是一个字节数组。

ByteArrayOutputStream:在构造的时候,不用定义数据目的。因为该对象中已经内部。
字节数组封装了可变长度的字节数组。这就是数据目的地。

因为这两个流对象都是操作数组,并没有使用系统资源,所以不用关闭 close 方法。

流操作规律讲解:

源设备:

键盘 System.in硬盘 FileStream  内存 ArrayStream

目的设备:

控制台 System.out  硬盘 FileStream 内存 ArrayStream

 

四、对象流 ObjectInputStream 和 ObjectOutputStream

持久化:就是将对象保存到硬盘中

没有方法的接口:通常称为标记接口

序列化 {@link Serializable}静态的成员变量是不能被序列化的如果非静态变量也不想被序列化,就加 Transient。保证了成员变量只能在堆内存中存在,不能再文本中存在。

使用了 ObjectInputStream 存储,只能使用 ObjectOutputStream 才能读取出来。

 

五、编码

1、ASCII:美国标准信息交换码。用一个字节的7位可以表示。

2、ISO8859-1:拉丁码表,欧洲码表。用一个字节的

3、GB2312:中国的中文编码。

4、GBK:中国的中文编码表升级,融合了更多的中文文字字符。

5、Unicode:国际标准码。融合了多种文字。所有文字都用两个字节来表示,java 语言使用的就是 Unicode

6、UTF-8:最多用三个字节来表示一个字符。

7、特殊汉字:联通

六、 IO 包中的其他类:管道流

|--RandomAccessFile

1、随机访问文件,自身具备读写的方法。

2、通过 skipByte(int x),seek(int x)来达到随机访问。

|--管道流:

1、PipedInputStream 和 PipedOutputStream。输入输出可以直接进行连接,通过结合线程使用。

重要知识

1、RandomAccessFile:随机访问文件。该类不算是 IO 体系中的子类。而是直接继承自 Object但是它是 IO 包中的成员,因为它具备读和写的功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过 getFilePointer 获取指针位置,同时可以通过 seek 改变指针的位置。

2、其实,完成读写的原理就是内部封装了字节流的输入和输出流。通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读 r ,读写 rw 等。如果模式为只读 r 。不会创建文件,回去读取一个已经存在的文件,如果该文件不存在,则会出现异常。如果模式为读写 rw 。那么操作的文件不存在,则会自动创建,如果存在则不会覆盖。

RandomAccess以用来实现多线程的下载,随机读写访问。IO 中,只有它可以实现多线程的读写。

 

0 0
原创粉丝点击