黑马程序员-java基础 io其他类

---------------------- android培训java培训 、期待与您交流! ----------------------

 

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

字节打印流 :
PrintStream 类
构造函数可以接受的参数类型
1 file对新。   File
2 字符串路径。 String
3 字节输出流。 outputStream


字符打印流:
PrintWriter 类
构造函数可以接受的参数类型 ,当接受的参数为流对象的时候,还可以再设置一个参数
,当这个参数为true时,则println,printf或format方法将刷新输出流缓冲区。

1 file对新。   File
2 字符串路径。 String
3 字节输出流。 outputStream
4 字符输出流。 Wreter


SequenceInput 类  合并流
可以把多个流合成一个流。需要在构造的时候传入Enumeration对象
方法1:
1 创建一个流类型的 vector
2 把需要合成的流放进集合
3 用集合对象的elements();创建一个Enumeration
4 把创建的Enumeration对象 传入到SequenceInput的构造函数里面

方法2:   比方法1效率高
1 创建一个流对象的ArrayList
2 把需要合成的流放进集合
3 用集合的iterator()方法  创建一个Iterator 对象
4 用匿名内部类方式创建一个Enumeration对象 ,重写其方法。
5 把创建的Enumeration对象 传入到SequenceInput构造函数里面

 

切割文件
方法:
1 创建输入流和要切割的文件建立关联
2 创建零时字节数组存储输入的数据
3 创建循环,每次循环的时候,创建新的输出流,把零时字节数组的里面的内容存到新的文件里面,
  记得在循环里面输出流每次都需要关闭。

 

操作对象的流:

ObjectInputStream  
readObject();反序列化

ObjectOutputStream
writeObject(对象); 对对象进行序列化

想要实现序列化的类,必须实现Serializable接口,这个接口没有方法,只是一个标记性接口
静态成员不能序列化
如果非静态成员不想序列化,在成员前面加 transient 关键字


管道流 
可以直接连接输入输出流 单线程使用可能死锁,不建议单线程使用
PipedInputStream

PipedOutputStream

PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out);//连接 输入输出流


RandomAccessFile 类
随机访问文件,自身具备读写的方法
该类不是IO体系中 类,而是字节继承自Object

但是他是IO包中的成员,因为他具备读和写功能,其内部封装了一个数组,而且通过指针对数组元素进行
操作,可以通过getFilePointer获取指针位置。同时可以通过Seek改变指针的位置。

其读和写的原理就是 它内部封装了字节输入流和输入流。
通过构造方法可以看出,该类只能操作文件,且只能按照指定模式

模式
r    只读模式  不会创建文件,会去读取一个已存在的文件,如果文件不存在,则会出现异常
rw 读写模式  如果不存在,会自动创建,如果存在不会覆盖。
rws
rwd

write();写入一个字节;
writeInt(); 可以直接写入int类型
seek(int);调整指针
skipBytes(int ); 忘后跳过指定字节数

public class Test {
 
 public static void main(String[] args) throws IOException {
  RandomAccessFile raf = new RandomAccessFile("d:/wenxue/a.txt", "rw");
 
  String s =null;
  raf.seek(2);//设置指针位置
  while((s=raf.readLine())!=null){
   System.out.println(s);
  }
  raf.write("hhhhhhh".getBytes());
  
  raf.writeInt(35);//写入int类型
  raf.close();
    
 }

}

 

DataInputStream 和DataOutputStream
用于操作基本数据类型的流对象
WreteUTF(String); 使用UTF-8 编码 将一个字符串写入到输出流
readUTF();
注意: 先存的数据先读,后存的数据后读。不然读出的数据不对


ByteArrayInputStream 和ByteArrayOutputStream
用于操作字节数组的流对象,不需要关闭,因为数据都存储在它们内部封装的数组中。即使关闭也可以用

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

ByteArrayOutputStream:在构造的时候不需要接受数据源,因为其内部封装了一个可变床度的字节数组。就是数据目的地

writeTo(OutputStream); 把数据写到输出流中去

 


字符编码
编码表: 计算机只能识别二进制数据(早期由来是电信号)。为了方便计算机应用,让它识别各个国家的文字
,就用各个国家的文字用数字来表示,并一一对应,形成一张表。这就是编码表。

ASCII: 美国标准信息交换码。 用一个字节的7位表示
ISO8859-1: 拉丁码表、欧洲哦码表。 用一个字节的8位表示
GB2312: 中国的中文编码表。
GBK: 中文编码表升级,融合了更多的中文字符
Unicode: 国际标准吗,融合了多种文字。所有文字都用两个字节来表示,java语言使用的就是unicode
UTF-8: 最多用三个字节来表示一个字符

编码: 字符串变成字节数组
解码: 字节数组变成字符串


public class Test {

 public static void main(String[] args) throws IOException {
  String s = "你好";
  //对s进行GBK编码
  byte[] b = s.getBytes("GBK");

  //对b进行iso8859-1 解码
  String s1=new String(b,"iso8859-1");

  //对s1进行iso8859-1再编码
  byte[] b1 = s1.getBytes("iso8859-1");

  //对b1进行GBK解码
  String s2 = new String(b1,"GBK");

  System.out.println(s2);
  
 }

}


 

 

 

---------------------- android培训java培训 、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值