• Java IO学习笔记(三)转换流、数据流、字节数组流


    转换流

    1、转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和BufferedWriter,并使用它们的readLine 和 newLine方法。
    2、有两种转换流:InputStreamReader、OutputStreamWriter
     
    练习小程序1:
    package test.io.transfer;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    public class OutputStreamWriterTest {
         public static void main(String args[]){
               FileOutputStream fos = null;
               FileOutputStream fos1 = null;
               OutputStreamWriter opsw = null;
               try {
                    fos = new FileOutputStream("E:/技术学习/java/test/Socket/test4.txt");
                    fos1 = new FileOutputStream("E:/技术学习/java/test/Socket/test5.txt");
                    opsw = new OutputStreamWriter(fos);
                    opsw.write("转换流练习");
                    System.out.println(opsw.getEncoding());//获取编码格式
                    opsw.flush();
                    opsw.close();
                    opsw = new OutputStreamWriter(fos1,"GBK");
                    opsw.write("转换流练习转换流练习");
                    System.out.println(opsw.getEncoding());//获取编码格式
                    opsw.flush();
               } catch (IOException e) {
                    e.printStackTrace();
               }finally{
                    try {
                         fos.close();
                         opsw.close();
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
               }
         }
    }
     
    练习小程序2:
    package test.io.transfer;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class InputStreamReaderTest {
         public static void main(String args[]){
               InputStreamReader isr = new InputStreamReader(System.in);//System.in是inputstream的子类
               BufferedReader bf = new BufferedReader(isr);
               String ss = null;
               try {
                    while((ss=bf.readLine()) != null){
                         if(ss.equals("exit")){
                               break;
                         }
                         System.out.println(ss);
                    }
               } catch (IOException e) {
                    e.printStackTrace();
               }finally{
                    try {
                         isr.close();
                         bf.close();
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
               }
         }
    }
     
    数据流、字节数组流
    1、数据流:一般的字节流只能读写byte[]类型的数据,只能写int、byte、byte[]类型的数据 ;字符输入流只能读char[]类型的数据,字符输出流只能写char、char[]、int、String类型的数据。如果想要读写long、double、boolean等其他类型的数据,就需要用到数据流。
    2、数据流是一种处理流,有两种数据流:DataInputStream、DataOutputStream,分别继承于InputStream和OutputStream。他们需要套在InputStream和OutputStream类型的字节流上操作,下图中截取一些,具体方法见帮助文档。
     
    DataInputStream:

     

    DataOutputStream:

     

     
    DataInputStream的构造方法:DataInputStream(InputStream in)
    DataOutputStream 的构造方法:DataOutputStream(OutputStream out)
    3、字节数组流(字节流):
    ByteArrayInputStream: 字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中,从字节数组中读数据。
    ByteArrayOutputStream:创建字节数组输出流的同时,内存会为该输出流创建一个默认大小的字节数组,用于存储写入的字节内容。
    4、字节数组流的构造方法:
    ByteArrayInputStream(byte[] buf);
    ByteArrayInputStream(byte[] buf, int offset, int length);
    ByteArrayOutputStream(); 创建字节输出流的同时内存中会创建一个byte[]字节数组,默认大小。
    ByteArrayOutputStream(int size); 创建字节输出流的同时内存中会创建一个大小为size的byte[]字节数组。
    在使用的时候,可以用byte[] b = byteArrayOutputStream.toByteArray()返回流中的字节数组,然后创建ByteArrayInputStream bai = new ByteArrayInputStream(byte[] b)来将输入流接入到字节数组上。
     
    练习小例子:
    package test.io.data;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    public class DataByteArrayStreamTest {
         public static void main(String args[]){
               ByteArrayOutputStream baos = new ByteArrayOutputStream();
               DataOutputStream dos = new DataOutputStream(baos);
               ByteArrayInputStream bais = null;
               DataInputStream dis = null;
               try {
                    dos.writeDouble(Math.random());
                    dos.writeBoolean(true);
                    dos.flush();
                    bais = new ByteArrayInputStream(baos.toByteArray());
                    dis = new DataInputStream(bais);
                    System.out.println(dis.available());
                    //先进先出,先写先读,如果这里是先读的Boolean,则会自动找到存入的double数据的第一个字节,当做boolean类型读出来
                    System.out.println(dis.readDouble());
                    System.out.println(dis.readBoolean());
               } catch (IOException e) {
                    e.printStackTrace();
               }finally{
                    try {
                         if(baos != null){
                               baos.close();
                         }
                         if(dos != null){
                               dos.close();
                         }
                         if(bais != null){
                               bais.close();
                         }
                         if(dis != null){
                               dis.close();
                         }
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
               }    
         }
    }
     
    控制台输出结果:
    9
    0.02241410199042526
    true

     

  • 相关阅读:
    两数交换
    排序算法总结
    mysql 完整性约束
    mysql 数据类型
    python 学习_第四模块 并发编程(多线程)
    python 学习_第四模块 并发编程(多进程)
    第二章 mysql用户管理
    第一章 mysql源码安装
    python 学习_第三模块网络编程入门
    python 学习_第三模块 面向对象(中级)
  • 原文地址:https://www.cnblogs.com/bjh1117/p/6385570.html
Copyright © 2020-2023  润新知