黑马程序员--java学习总结(7)

  1. ------<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:目的:内存
这两个是专门用于操作字节数组的流对象,为了便于数组的操作,将数组进行封装,对外提供方法操作数组中的元素。这两个流对象不涉及底层资源的调用,操作的都是内存中的数组,所以不需要关闭。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值