- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
--<java.util>--Properties
Map
|--Hashtable
|--Properties:用于属性配置文件,键和值都是字符串类型。
Properties的特点:
1.可以持久化存储数据。
2.键和值都是字符串。
3.一般用于配置文件。
|--load():将流中的数据加载进集合。
原理:其实就是将读取流和指定文件相关联,并读取一行数据,因为数据是规则的key=value,所以获取一行后,通过=对数据进行切割,左边是键,右边是值,将键值存
储到properties中。
|--store():写入各个项后,刷新输出流。
|--list():将集合的键值数据列出到指定的目的地。
--<java.io.OutputStaeam>--PrintStream
打印流的特点:
1.提供了更多的功能,比如打印方法,可以直接打印任意类型的数据。
2.它有一个自动刷新机制,创建该对象,指定参数,对于指定方法可以自动刷新。
3.它使用本机默认的字符编码。
4.该流的print方法不抛出IOException.
PrintStream可以操作的目的:1.File对象 2.字符串路径 3.字节输出流
前两个都是在JDK1.5版本后出现的,而且在操作文本文件时,可以指定字符编码了。
PrintStream
打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用PrintWriter 类。
PrintWriter:具备了PrintStream的特点的同时,还具备自身的特点:
该对象可以操作的目的有四个:1.File对象 2.字符串路径 3.字节输出流 4.字符输出流
故开发时尽量使用PrintWriter.
--<java.io>--SequenceInputStream
序列流:作用就是将多个读取流合并成一个读取流,实现数据的合并。
SequenceInputStream
表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。这样做,可以更方便的操作多个读取流,其这个序列流内部会有一个有序的集合容器,用于存储多个读取流对象。
该对象的构造函数参数是枚举类型,想要获取枚举类型,需要使用Victor集合,但不高效。需要用到ArrayList,但ArrayList中没有枚举,只有自己去创建枚举对象。因为枚举操作的是具体的对象,所以无法具体实现,但是枚举和迭代器是功能一样的,所以可以使用迭代来代替枚举。如一下代码:
<pre name="code" class="java">import java.io.*;
import java.util.*;
class SequenceDemo
{
public static void main(String[] args) throws IOException
{
//splitFile();
merge();
}
public static void merge()throws IOException//文件的合并
{
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for(int x=1; x<=3; x++)
{
al.add(new FileInputStream("c:\\splitfiles\\"+x+".part"));
}
final Iterator<FileInputStream> it = al.iterator();
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
{
public boolean hasMoreElements()
{
return it.hasNext();
}
public FileInputStream nextElement()
{
return it.next();
}
};
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("c:\\splitfiles\\0.bmp");
byte[] buf = new byte[1024];
int len = 0;
while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
public static void splitFile()throws IOException//文件的分割
{
FileInputStream fis = new FileInputStream("c:\\1.bmp");
FileOutputStream fos = null;
byte[] buf = new byte[1024*1024];
int len = 0;
int count = 1;
while((len=fis.read(buf))!=-1)
{
fos = new FileOutputStream("c:\\splitfiles\\"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
}
fis.close();
}
}
--<java.io>--RandomAccessFile
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过方法读取,并通过方法设置。
特点:
1.该对象既可以读取,又可以写入。
2.该对象中定义了一个大型的byte数组,通过指针来操作这个数组。
3.可以通过该对象的getFilePointer()来获取指针的位置,通过seek()方法设置指针的位置。
4.该对象操作的源和目的必须是文件。
5.该对象内部封装了字节读取流和字节写入流。
--<java.io>--管道流
管道读取流和管道输入流可以像管道一样对接上,管道读取流就可以读取管道写入流写入的数据。
注意:需要加入多线程技术,因为单线程,先执行read,会发生死锁,因为read方法是阻塞式的,没有数据的时候,read会让线程等待。
<pre name="code" class="java">class PipedDemo
public static void main(String[] args)
{
PipedInputStream pipin=new PipedInputStream();
span>PipedOutputStream pipout=new PipedOutputStream();
pipin.connect(pipout);
new Thread(new Input(pipin)).start();
new Thread(new Output(pipout)).start();
}
----对象的序列化
目的:将一个具体的对象进行持久化,写入到硬盘上。
注意:静态数据不能被序列化,因为静态数据不再堆内存中,是存储在静态方法区中。
如果对非静态的数据不进行序列化,可以在变量前添加transient关键字修饰。
Serializable:用于启动对象的序列化功能,可以强制让指定的类具备序列化功能,该接口中没有成员,这是一个标记接口,这个标记接口用于给序列化类提供UID。这个UID是依据类中成员的数字签名进行运行获取的。如果不需要自动获取一个UID,可以在类中手动指定一个名称为serialVersionUID号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的类都进行手动显示的UID的指定。
编码:字符串变成字节数组
String-->byte[]:str.getBytes(charsetName);
解码:字节数组编程字符串
byte[]-->String:new String(byte[],charsetName);
当开发时发现有乱码时,先将乱码用“导致乱码的解码表”(及不正确的码表)重新再编码一次,再将编码后的字节用正确的码表解析出来。(其中不正确的码表多为IOS-8859-1,而原码表为gbk,如果不正确的码表为UTF-8时,上述方法就奏效,因为UTF-8中也识别中文,里面包涵一份与gbk不同的解析中文的码表)
DataOutputStream,DataInputStream:专门用于操作基本数据类型的流对象
ByteArrayInputStream:源:内存
ByteArrayOutputStream:目的:内存
这两个是专门用于操作字节数组的流对象,为了便于数组的操作,将数组进行封装,对外提供方法操作数组中的元素。这两个流对象不涉及底层资源的调用,操作的都是内存中的数组,所以不需要关闭。