实例:当每次打开软件就在配置文件中记录该软件打开的次数,到达5次时,提示不能在使用。
File confile = new File("count.properties");
if(!confile.exists()) {
confile.createNewFile();
}
FileInputStream fis = new FileInputStream(confile);
Properties prop = new Properties();
prop.load(fis);
String value = prop.getProperty("time");//从集合中通过键获取次数
int count = 0;//定义计数器,记录获取到的次数
if(value!=null) {
count = Integer.parseInt(value);
if(count>5) {
throw new RuntimeException("使用次数已达到上线,请注册");
}
}
count++;
prop.setProperty("time", count+"");
FileOutputStream fos = new FileOutputStream(confile);
prop.store(fos,"");
fis.close();
fos.close();
IO包中的其他流
打印流:PrintStream
1.提供了打印方法可以对多种数据类型值进行打印,并保证数据的表现形式。
2.不抛IOException
构造函数接收三种类型值:
1.文件名字符串。2.File类对象。3.输出流对象。
PrintStream out = new PrintStream("print.txt");
out.write(610);//只写最低八位
out.print(97);//先将97变成字符保持原样将数据打印到目的地
字符打印流:PrintWriter
构造函数参数:1.字符串路径. 2.File对象。3.字节输出流。4.字节输出流。
SequenceInputStream(能将多个流组装成一个流)
SequenceInputStream sis = new SequenceInputStream(Enumeration en);//参数为枚举类型,可以将多个流封装到一个枚举对象中。
实例:将多个文件合并成一个文件。
Vector<FileInputStream> v = new Vector<FileInputStream>();//换成ArrayList能提高效率
v.add(new FileInputStream("1.txt"));
v.add(new FileInputStream("2.txt"));
v.add(new FileInputStream("3.txt"));
Enumeration<FileInputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("4.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len = sis.read(buf))!=-1) {
fos.write(buf,0,len);
}
sis.close();
fos.close();
操作对象的流:ObjectInputStream,ObjectOutputStream
作用:将对象(实现Serializable)持久化到硬盘。
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.object"));
oos.writeObject(new Person("小强", 22));//对象的序列化
oos.close();
RandomAccessFile类(不是IO体系中的子类)
特点:1.该对象即能读,又能写。2.该对象内部维护了一个byte数组,并通过指针可以操作数组中的元素。3.可以通过getFilePointer方法获取指针的位置,和通过seek方法设置指针的位置。4.其实该对象就是将字节输入流和字节输出流进行了封装。5.该对象的源或目的只能是文件,通过构造函数就可以看出。
RandomAccessFile raf = new RandomAccessFile("rance.txt", "rw");
raf.seek(3*8);
raf.write("哈哈".getBytes());
raf.writeInt(108);
raf.close();
管道流:PipedInputStream, PipedOutputStream(管道流与多线程相结合)
数据流:DateOutputStream,DateInputStream(操作基本数据类型的流)
操作字节数组:ByteArrayInputStream,ByteArrayOutputStream(包含一个内部的缓冲区)
操作字符数组:CharArrayReader,CharArrayWriter
操作字符串:StringReader,StringWriter
编码表:记录二进制与生活中文字的对应关系。
ASCII:美国标准信息交换码
ISO8859-1:拉丁码表,欧洲码表(一个字母8位表示)
GBK:中国中文编码表升级,融合了多种符号。
Unicode:国际标准码表,融合多种文字。
UTF-8:最多用三个字节来表示一个字符。(如果一个字符,可以使用一个字节装下就是用一个字节去装,反之,就使用两个字节去装)
字符串---》字符数组:编码
字符数组---》字符串:解码
编解码出现的问题
String str = "你好";
byte[] buf = str.getBytes("gbk");
String s1 = new String(buf,"iso8859-1");
注意:在编码和解码不使用同一张码表时容易产生乱码;