黑马程序员Java基础__IO(下)




一、序列化 ObjectOutputStream与ObjectInputStream)

一)ObjectOutputStream:

1、构造方法:

1)  protected  ObjectOutputStream() :为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。


2) ObjectOutputStream(OutputStream out) : 创建写入指定 OutputStream 的 ObjectOutputStream。


2、 常用方法:

1)void | writeObject(Object obj) :将指定的对象写入 ObjectOutputStream。

  

 

 二) ObjectInputStream:

 1、  构造方法:

1)protected  ObjectInputStream() :为完全重新实现 ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。


2)ObjectInputStream(InputStream in) :创建从指定 InputStream 读取的 ObjectInputStream。


  2、 常用方法:

1) Object | readObject() :从 ObjectInputStream 读取对象。


---------------------------------------------------------------------

二、管道流

PipedInputStream与PipedOutputStream)


一)概述

  输入输出可以直接进行连接,通过结合线程使管道输入流连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。

通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。
 

二)构造方法:

1) PipedInputStream() :创建尚未连接的 PipedInputStream。


2)PipedInputStream(int pipeSize) : 创建一个尚未连接的 PipedInputStream,并对管道缓冲区使用指定的管道大小。


3)PipedInputStream(PipedOutputStream src) :创建 PipedInputStream,使其连接到管道输出流 src。 


4)PipedInputStream(PipedOutputStream src, int pipeSize) : 创建一个 PipedInputStream,使其连接到管道输出流 src,并对管道缓冲区使用指定的管道大小。


   
 
三)常用方法:

1)void | connect(PipedOutputStream src) : 使此管道输入流连接到管道输出流 src。:

示例1:

import java.io.*;  
  
class Read implements Runnable//多线程  
{  
 private PipedInputStream in;//将PipedInputStream私有  
 Read(PipedInputStream in)  
 {  
  this.in = in;//初始化  
 }  
 public void run()//覆盖run方法  
 {  
  try  
  {  
   byte[] buf = new byte[1024];//建立缓冲  
  
   System.out.println("读取前。。没有数据阻塞");  
   int len = in.read(buf);  
   System.out.println("读到数据。。阻塞结束");  
  
   
  
   String s= new String(buf,0,len);  
  
   System.out.println(s);  
  
   in.close();  
  
  }  
  catch (IOException e)  
  {  
   throw new RuntimeException("管道读取流失败");  
  }  
 }  
}  
  
class Write implements Runnable  
{  
 private PipedOutputStream out;  
 Write(PipedOutputStream out)  
 {  
  this.out = out;  
 }  
 public void run()  
 {  
  try  
  {  
   System.out.println("开始写入数据,等待6秒后。");  
   Thread.sleep(6000);//等待6秒  
   out.write("piped lai la".getBytes());//将字符串转成字节数组  
   out.close();  
  }  
  catch (Exception e)  
  {  
   throw new RuntimeException("管道输出流失败");  
  }  
 }  
}  
  
class  PipedStreamDemo  
{  
 public static void main(String[] args) throws IOException  
 {  
  
  PipedInputStream in = new PipedInputStream();//管道流  
  PipedOutputStream out = new PipedOutputStream();  
  in.connect(out);//两个流连接上  
  
  Read r = new Read(in);//传入in  
  Write w = new Write(out);  
  new Thread(r).start();//开启线程  
  new Thread(w).start();  
 }  
} 


---------------------------------------------------------------------


三、RandomAccessFile 类

一)概述

1、RandomAccessFile称之为随机访问文件的类,自身具备读写方法。

2、该类不算是IO体系中的子类,而是直接继承Object,但是它是IO包成员,因为它具备读写功能,内部封装了一个数组,且通过指针对数组的元素进行操作,同时可通过seek改变指针的位置。

3、可以完成读写的原理:内部封装了字节输入流。


二)mode的含意

1)"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。 

2)"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 

3)"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。

4)"rwd"   打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。


三)构造方法:

 1)RandomAccessFile(File file, String mode) : 创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。


 2)RandomAccessFile(String name, String mode) :创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。 

四)常用方法:

1)  void writeInt(int v) :按四个字节将 int 写入该文件,先写高字节。

 

2) void seek(long pos):设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。

 

3) int skipBytes(int n) :尝试跳过输入的 n 个字节以丢弃跳过的字节。 


示例2:

import java.io.*;  
class RandomAccessFileDemo   
{  
 public static void main(String[] args) throws IOException  
 {  
  //writeFile_2();  
  //readFile();  
  
  //System.out.println(Integer.toBinaryString(258));  
  
 }  
  
 public static void readFile()throws IOException  
 {  
  RandomAccessFile raf = new RandomAccessFile("ran.txt","r");  
    
  //调整对象中指针。  
  //raf.seek(8*1);  
  
  //跳过指定的字节数  
  raf.skipBytes(8);  
  
  byte[] buf = new byte[4];  
  
  raf.read(buf);  
  
  String name = new String(buf);  
  
  int age = raf.readInt();  
  
  
  System.out.println("name="+name);  
  System.out.println("age="+age);  
  
  raf.close();  
 }  
 public static void writeFile_2()throws IOException  
 {  
  RandomAccessFile raf = new RandomAccessFile("ran.txt","rw");  
  raf.seek(8*0);  
  raf.write("周期".getBytes());  
  raf.writeInt(103);  
  
  raf.close();  
 }  
  
 public static void writeFile()throws IOException  
 {  
  RandomAccessFile raf = new RandomAccessFile("ran.txt","rw");  
  
  raf.write("李四".getBytes());  
  raf.writeInt(97);  
  raf.write("王五".getBytes());  
  raf.writeInt(99);  
  raf.close();  
 }  
} 


---------------------------------------------------------------------


四、操作基本数据类型的流对象 DataInputStream与DataOutputStream)

一)DataOutputStream

1、构造方法:

1)DataOutputStream(OutputStream out) :创建一个新的数据输出流,将数据写入指定基础输出流。

 

2、常用方法:

1)void | writeInt(int v):将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。

 

2)void | writeBoolean(boolean v) :将一个 boolean 值以 1-byte 值形式写入基础输出流。


3)void | writeDouble(double v) :使用 Double 类中的 doubleToLongBits 方法将 double 参数转换为一个 long 值,然后将该 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。


4)void | writeUTF(String str) :以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。

 

二) DataInputStream

1、构造方法:

1)DataInputStream(InputStream in):使用指定的底层 InputStream 创建一个 DataInputStream。


2、常用方法:

1)static String readUTF(DataInput in) :从流 in 中读取用 UTF-8 修改版格式编码的 Unicode 字符格式的字符串;然后以 String 形式返回此字符串。

 

五、 操作数组和字符串

一)操作字节数组的对象:ByteArrayInputStream和ByteArrayOutputStream。

二)构造方法:  

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

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

三)对应的字符数组和字符串:

1)字符数组流对象:CharArrayReader和CharArrayWriter。

2)字符串流对象:StringReader和StringWriter。


示例3:

import java.io.*;  
class ArrayStreamDemo  
{  
    public static void main(String[] args)  
    {  
        //数据源   
        ByteArrayInputStream bais = new ByteArrayInputStream("ABCDEFF".getBytes());  
        //数据目的   
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        int by = 0;  
        //读取和写入数据   
        while((by=bais.read())!=-1)  
        {  
            baos.write(by);  
        }  
        System.out.println(baos.size());  
  
        System.out.println(baos.toString());  
          
        try  
        {  
            //方法,此处抛异常,所以上面需要抛出去   
            baos.writeTo(new FileOutputStream("a.txt"));  
        }  
        catch (IOException e)  
        {  
            throw new RuntimeException("写入文件失败");  
        }  
          
    }  
}


---------------------------------------------------------------------


六、字符编码

一)概述:字符流的出现为了方便操作字符,更重要的是加入了编码的转换,即转换流。

二)常见的编码表:

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

2)IOS8859-1:拉丁码表;欧洲码表。用一个字节的8位表示。

3)GB2312:中国的中文编码表。

4)GBK:中国的中文编码表升级,融合了更多的中文文字字符。打头的是两个高位为1的两个字节编码;为负数。

5)Unicode:国际标准码,融合了多种文字。

6)UTF-8:最多用三个字节表示一个字符的编码表,包括:一位、两位、三位表示的字符。


 示例4:

import java.io.*;  
import java.util.*;  
class EncodeDemo  
{  
 public static void main(String[] args)  
 {  
  String s="老师最漂亮了我爱你";  
  try  
  {  
   byte[] b1=s.getBytes("GBK");  
  
   System.out.println(Arrays.toString(b1));  
  
   String s1=new String(b1,"GBK");  
  
   System.out.println(s1);  
  }  
  catch (UnsupportedEncodingException uue)  
  {  
   throw new RuntimeException("解码错误");  
  }  
 }  
} 

-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值