IO流和网络编程

1.BufferedReader和BufferedWriter

BufferedReader是Reader的子类,可以高效的读取!
1.构造方法
     public BufferedReader(Reader in)创建默认的缓冲区大小的字符缓冲输入流(推荐第一个,足够大了)
     public BufferedReader(Reader in,int sz):创建字符缓冲输入流对象,指定的缓冲大小
2.成员方法:
   public int read() throws IOException:一次读一个字符
public String readLine() throws IOException: 读取一行内容
BufferedWriter:字符缓冲输出流,可以针对字符串的高效写入
1.构造方法
  BufferedWriter(Writer out) :创建默认缓冲大小的,字符缓冲输出流对象(推挤)
     底层构造方法,还是调用下面这个带两个参的构造方法
  BufferedWriter(Writer out, int sz)  :指定的缓冲区大小的字符输出流对象
2.成员方法:
  特有功能:

2.使用BufferedWriter和BufferedReader

针对文本文件读写复制的特有方式
步骤:
1.封装源文件:使用字符缓冲输入流对象来操作
    BufferedReader br = new BufferedReader(new FileReader("BufferedReaderDemo2.java")) ;
2.封装目的地文件:使用字符缓冲输出流对象来操作
    
3.读写复制
  利用readLine()以及newLine()
    String line = null ;
    while((line=br.readLine())!=null){
            //读一行,写一行
            bw.write(line) ;
            //换行
            bw.newLine();
            //刷新
            bw.flush();
        }
4. 释放资源
  bw.close();
  br.close();
​

3.SequenceInputStream合并流

SequenceInputStream:可以操作多个文件,
SequenceInputStream表示其他输入流的逻辑级联。
  构造方法:
     public SequenceInputStream(InputStream s1,InputStream s2)
         
 //创建两个文件字节输入流对象
FileInputStream fis1 = new FileInputStream("BufferedReaderDemo2.java") ;
FileInputStream fis2 = new FileInputStream("Teacher.java") ;
​
//创建合并流对象
//public SequenceInputStream(InputStream s1,InputStream s2)
SequenceInputStream sis = new SequenceInputStream(fis1,fis2) ;
​
//创建字节缓冲输出流对象或者使用文件字节输出流对象
FileOutputStream fos = new FileOutputStream("D:\\EE_2113\\day29\\code\\My.java") ;
​
//一次读取一个字节数组
byte[] bytes  = new byte[1024] ;
int len = 0 ;
while((len=sis.read(bytes))!=-1){
    //写
    fos.write(bytes,0,len);
}
​
//释放资源
fos.close();
sis.close();       
合并流的第二个构造方式:
   public SequenceInputStream(Enumeration<? extends InputStream> e):操作两个或者两个以上的或者更多的文件
       
//创建一个Vector集合,里面存储的类型InputStream
 Vector<InputStream> v = new Vector<>() ;
//创建三个字节输入流对象
  InputStream in1 = new FileInputStream("BufferedReaderDemo2.java") ;
  InputStream in2 = new FileInputStream("SequenceInputStreamDemo.java") ;
  InputStream in3 = new FileInputStream("Teacher.java") ;
//添加到Vector集合中
        v.add(in1) ;
        v.add(in2) ;
        v.add(in3) ;
//  List集合中子实现类Vector<E>--->特有的迭代器的遍历方式Enumeration<E>  elements()--->类似于Collection的迭代器 Iterator iterator()
  Enumeration<InputStream> enumeration = v.elements();
//创建合并流对象: public SequenceInputStream(Enumeration<? extends InputStream> e)
    SequenceInputStream sis  = new SequenceInputStream(enumeration) ;
 //创建字节缓冲输出流对象,进行读写复制
    BufferedOutputStream bos = new BufferedOutputStream(newFileOutputStream("SequenceCopy.java")) ;
 //一次读取一个字节数组
      byte[] bytes = new byte[1024] ;
        int len = 0 ;
        while((len=sis.read(bytes))!=-1){
              bos.write(bytes,0,len) ;
              bos.flush();
        }
 //关闭流资源
    bos.close();
    sis.close();

4.序列流

1.序列化流ObjectOutputStream

ObjectOutputStream: 将一个Java对象的原始数据----->流数据(可以在网络中传输)
前提条件:Java对象所在的类必须实现一个
    java.io.Serializable :序列化接口
构造方法:
   public ObjectOutputStream(OutputStream out) throws IOException: 创建序列化流对象
成员方法:
   public final void writeObject(Object obj) throws IOException
       
eg.
private static void myWrite() throws Exception {
//创建一个序列化流对象
// public ObjectOutputStream(OutputStream out) throws IOException: 创建序列化流对象
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")) ;
// public final void writeObject(Object obj) throws IOException
 //创建一个Person类对象
        Person p = new Person("高圆圆",42) ;
        oos.writeObject(p);
//释放资源
        oos.close();
    }

2.反序列化流ObjectInputStream

ObjectInputStream:将 网络中传输的这种流数据----->还原成 对象 (Object)
构造方法:
     public ObjectInputStream(InputStream in) throws IOException
成员方法:
     public final Object readObject()throws IOException,ClassNotFoundException
         
eg.
//反序列化 读
private static void myRead()  throws Exception {
//创建一个反序列化流对象
//public ObjectInputStream(InputStream in) throws IOException
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt")) ;
//将这个文件的存储的Java对象的原始数据 "流数据"---->还原成对象
//public final Object readObject()throws IOException,ClassNotFoundException
        Object o = ois.readObject();
        System.out.println(o);
}

5.问题

问题1: java.io.NotSerializableException: com.qf.objectstream_03.Person  这个类未实现序列化接口
    
Serializable接口:没有成员方法------>标记接口,某个类如果能够实现Serializable接口,表示这个类的对象可变被ObjectOutputStream写入带流中!
    
问题2:直接修改了Person类的内容,然后直接进行反序列化:报错了
   因为每一个一旦进行序列化,类中包含的编码(类的签名信息:类的中的相关的成员)---会产生一个serialVersionUID,序列化版本ID
当直接修改了某个类的成员,不能直接进行反序列化,因为内存中的serialVersionUID不一致!
  InvalidClassException--->类的串行版本与从流中读取的类描述符的类型不匹配 :
   因为内存中的serialVersionUID不一致!

6.属性列表类 Properties

  Properties:属性列表,描述一组属性和属性值, 属性和属性值都是String类型 (Properties可以保存到流中或从流中加载)
没有泛型,继承自Hashtable<K,V>---->implements Map<K,V>接口

特有功能里面的基本的功能:
    添加属性列表中的属性名称和属性值       
--->public Object setProperty(String key,String value)
    遍历获取属性列表中的所有键(属性名称)   
 --->public Set<String> stringPropertyNames()
    通过属性名称获取属性值               
--->public String getProperty(String key)
 
关于属性列表中的实际引用:要和流一块使用
load(Reader reader/InputStream) :加载,将指定某个文件中的内容加载到属性列表中
store(Writer writer/OutputStream, String comments):将属性列表中内容保存到指定的文件中
      参数2:对属性列表在描述信息

7.网络编程

1.网络

不同的地域位置不同的计算机,通过通信线路连接,就形成一种"网络"

2.网络编程

就是某个程序在不同的计算机之间进行数据传输 (数据共享)

3.网络编程的三要素

1.ip地址
    A类ip:前一个号段:网络号段,后面三个号段:主机号段
    B类ip: 前两个号段:网络号段,后面两个号段:主机号段
    C类ip:前三个号段:网络号段,后面这个号段:主机号段(私人地址)
		 点分十进制法---->10.12.156.50
2.port端口号
3.协议

8.UDP协议和TCP协议

1.是否是一种可靠连接
    UDP协议:是一种不可靠连接
    TCP协议:是一种可靠连接
2.是否需要建立连接通道
	UDP协议:不需要建立连接通道
    TCP协议:需要建立连接通道
3.是否发送的数据大小有限制
    UDP协议:有限制,因为UDP发送--->以一种 "数据报包-->DatagramPacket"的方式
    TCP协议:没有限制,连接通道里面-->使用字节流的方式来进行通信(数据写,读)
      客户端--->获取通道的字节输出流--->写数据
      服务端--->获取通道的字节输入流--->读数据
      
UDP协议:是一种不可靠连接,不需要建立连接通道,有限制,因为UDP发送--->以一种 "数据报包-->DatagramPacket"的方式
TCP协议:是一种可靠连接,需要建立连接通道,没有限制,连接通道里面-->使用字节流的方式来进行通信(数据写,读)  

9.InetAddress

java.net.InetAddress:此类表示Internet协议(IP)地址
    
UDP发送端和接收端的代码实现

成员方法:
    public static InetAddress getByName(String host)throws UnknownHostException:
 通过主机名称(计算机的全名)或者ip地址的文本(字符串形式),返回值代表的互联网IP地址
   public String getHostAddress():通过ip地址对象获取ip地址的字符串形式

1.UDP发送端的步骤

UDP发送端的步骤:
1)创建发送端的Socket对象
2)创建一个"数据报包"对象
3)使用UDP发送端的Socket对发送"数据报包"
4)释放资源

2.UDP协议接收端的代码实现

UDP接收端的步骤:
1)创建接收端的Socket对象
2)创建一个"接收容器" 数据报包(数据-->自定义缓冲字节数组 byte[] bytes= new byte[1024]) ,将发送端的数据存储进来
3)接收
4)通过接收端的接收容器:DatagramPacket解析出来的真实数据(数据报包)
5)展示数据
6)释放资源

先运行接收端,然后发送端,而且接收端不能运行多次
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值