黑马程序员——io之第四部分

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

终于把io流全部看完,写完了。

1:对象的序列化

ObjectInputStream ObjectOutputStream 对象的持久化储存

2:管道流的应用:PipedOutputStream PipedInputStream connect()方法

相关联到的技术 多线程(Runnable)

3:随机访问文件流:RandomAccessFile(“”)

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

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

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

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

4:数据流:DataInputStream DataOutputStream 操作数据的流

5:编码之转换流的应用:

5.1:编码:把字符串转成byte数组 string.getBytrs();

5.2:解码:把byte数组转成字符串 new String(byte[]by);

6:关于对象的排序

6.1:强行反转排序

Comparator com= Collections.reverseOrder();

树杈集合

Set set=new TreeSet(com);

package com.theima.www;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

import com.itheima.entity.Employee;

/**
 * @author myluo
 *
 */
public class IOObject {

    public static void main(String[] args) throws IOException {
          //对象的写入
         //  writeObj();
           //对象的读取
        //   readobj();
           //管道流的应用
           // pipedMethod();
        //随机访问文件的读取和写入
        //randomMethod();
        //操作基本数据类型的流
    //  dataMethod();

        //io中内存为源的一些操作
        //arrayMethod();

        //转换流中的编码 gb2312  gbk   utf-8   如果中文件乱码的结果是? 那么一定是   gbk编的码  用utf-8解的码
        //如果是中文件乱码    ,  那麽一定是      utf-8编得码    gbk解的码
    //  unicodeMethod();

        //编码:就是把字符串变成byte数组           解码:  把byte数组变成字符串
        //      str.getBytes();                    String   str=new   String(bt,0,len);
        //unicodeGBK();

        //编码之联通
        //unicodeUTF();

        //键盘录入学生姓名,语数外成绩,排完序写入文件保存
        studentMethod();

    }

    //键盘录入学生姓名,语数外成绩,排完序写入文件保存
    private static void studentMethod() throws IOException {
        // TODO Auto-generated method stub
        //强行反转排序(比较器)
        Comparator<Student>   com=Collections.reverseOrder();

            //获取排完序的集合
             Set<Student>   set= utilMethod(com);
             //把集合中的对象写入文件中
             writeSet(set);
    }

     //把集合中的对象写入文件中
    private static void writeSet(Set<Student> set) throws IOException {
        // TODO Auto-generated method stub
         BufferedWriter  bw=new  BufferedWriter(new  FileWriter(new  File("e:/abc/6.txt")));
        for(Student   ss:set){
                         bw.write(ss.toString());
                         bw.newLine();
                         bw.flush();
              }

    }

     //获取排完序的集合
    private static Set<Student> utilMethod(Comparator<Student>com) throws IOException {
        // TODO Auto-generated method stub
        //键盘录入
        BufferedReader   br=new  BufferedReader(new InputStreamReader(System.in));

        //保存到集合(内存中),Set  <Student>   set=new  TreeSet<Student>();
        //反向比较器  Set  <Student>   set=new  TreeSet<Student>(com);   带上比较器的集合
        Set  <Student>   set=new  TreeSet<Student>(com);

        String   len=null;

        while((len=br.readLine())!=null){
                     if("over".equals(len)){
                         break;
                     }
                     String  []   str= len.split(",");
                     //把录入的数据封装到对象中
                     Student  stu=new  Student(str[0],Integer.parseInt( str[1]), Integer.parseInt( str[1]), Integer.parseInt( str[1]));
                     //把对象添加到集合
                     set.add(stu);
        }
                if(br!=null){
                    br.close();
                }

                return   set;
    }

    //解释“联通”两字乱码问题,记事本默认gbk编的码,但是联通两字符合utf-8的编码格式,所以没查到
/*  11000001
    10101010
    11001101
    10101000*/
    private static void unicodeUTF() {
        // TODO Auto-generated method stub
                   String   str="联通";
                   //编码
                   try {
                    byte  []   by=str.getBytes("gbk");
                    System.out.println(Arrays.toString(by));
                    System.out.println(new  String(by,"gbk"));
                    for(int  i=0;i<by.length;i++){
                                 System.out.println(Integer.toBinaryString(by[i]&255));
                    }

                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    }

    //编码与解码问题
    private static void unicodeGBK() {
        // TODO Auto-generated method stub
           String   str="好人";
           //开始编码,默认是gbk编码
           try {
            byte  []  bt=str.getBytes("utf-8");
            //打印编码
            System.out.println(Arrays.toString(bt));
            //开始解码
            String   str2=new  String(bt,"iso8859-1");
            System.out.println(str2);
            //如果解码错误,再编一次,在解码
            byte  []   bt2=str2.getBytes("iso8859-1");
            System.out.println(Arrays.toString(bt2));

            //对bt2进行解码
            String   str3=new   String(bt2,"utf-8");
            System.out.println(str3);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //转换流之编码问题
    private static void unicodeMethod() {
        // TODO Auto-generated method stub
                //  outMethod();
                  inMethod();
    }

    //转换流读取,gbk是两个字节一个字,utf-8是三个字节一个字
    private static void inMethod() {
        // TODO Auto-generated method stub
        InputStreamReader   isr=null;
           try {
         isr=new  InputStreamReader(new  FileInputStream("e:/abc/4.4.txt"),"gbk");

         char  []  bt=new  char[1024];

         try {
            int  len=isr.read(bt);

            System.out.println(new  String(bt,0,len));

            isr.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

           } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //转换流写入
    private static void outMethod() {
        // TODO Auto-generated method stub
        OutputStreamWriter   osw=null;
           try {
            try {
                osw=new  OutputStreamWriter(new   FileOutputStream("e:/abc/4.4.txt"),"utf-8");
            } catch (UnsupportedEncodingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {
                osw.write("你好");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                osw.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //操作字节数组的流   ByteArrayInputStream   ByteArrayOutputStream   ,此流不需要close
    private static void arrayMethod() {
        // TODO Auto-generated method stub
         //字节数组读取流
          ByteArrayInputStream   bals=new  ByteArrayInputStream("中国人".getBytes());
        //字节数组写入流
          ByteArrayOutputStream  baos=new  ByteArrayOutputStream();

          int   len=0;
          while((len=bals.read())!=-1){
                   baos.write(len);
          }

          System.out.println("size=="+baos.size());
          System.out.println("baos=="+baos.toString());

    }

    //DataInputStream    DataOutputStream()
    private static void dataMethod() {
        // TODO Auto-generated method stub
            //  wMethod(); 

            rMethod();
    }

    private static void rMethod() {
        // TODO Auto-generated method stub
        DataInputStream   dls=null;
        try {
        dls=new   DataInputStream(new   FileInputStream("e:/abc/3.txt"));

        try {
            int  num=dls.readInt();
            double  dou=dls.readDouble();
            boolean  boo=dls.readBoolean();
            byte  []  bt=new  byte[1024];

            int   len   =dls.read(bt);

            String   str=new  String(bt,0,len);

            System.out.println(num+":"+dou+":"+boo+":"+str);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private static void wMethod() {
        // TODO Auto-generated method stub
        DataOutputStream   dos=null;
                 try {
                    dos=new  DataOutputStream(new   FileOutputStream("e:/abc/3.txt"));

                    try {
                        dos.writeInt(100);
                        dos.writeDouble(100.235);
                        dos.writeBoolean(false);
                        dos.write("翟哦".getBytes());
                        dos.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    }

    //随机访问文件的读取和写入
    private static void randomMethod() {
        // TODO Auto-generated method stub
              readMethod();
            //   writeMethod();
    }

    //随机访问文件的写入
    private static void writeMethod() {
        // TODO Auto-generated method stub
               /**
                * 前一参数:File 对象
                * 后一参数:模式
                * 值
 含意

"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd"   打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。  

                *
                *
                */
        RandomAccessFile   raf=null;

               try {
                raf=new  RandomAccessFile("e:/abc/1.txt","rw");
                try {
                    raf.write("你好 ".getBytes());
                    raf.writeInt(18);
                    raf.write("我好 ".getBytes());
                    raf.writeInt(20);
                    raf.close();

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

    //随机访问文件的读取
    private static void readMethod() {
        // TODO Auto-generated method stub
        RandomAccessFile  raf=null;
           try {
            raf=new  RandomAccessFile(new  File("e:/abc/1.txt"),"r");
            try {
                raf.seek(8*1);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            byte  []  bt=new  byte[4];
            try {
                int  len=raf.read(bt);
                int  num=raf.readInt();

                System.out.println("值"+new   String(bt,0,len));
                System.out.println("age="+num);

                raf.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //管道流的应用
    private static void pipedMethod() {
        // TODO Auto-generated method stub
               //管道流对象
               PipedInputStream   pls=new   PipedInputStream();
               PipedOutputStream  pos=new  PipedOutputStream();

               //连接管道流
               try {
                pls.connect(pos);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

               Read   ren=new  Read(pls);
               Write   wri=new  Write(pos);

               //开启线程
               new  Thread(ren).start();
               new  Thread(wri).start();

    }

    // 读取持久化对象  ObjectInputStream   与   ObjectOutputStream  都是成对存在的
    private static void readobj() {
        // TODO Auto-generated method stub
        ObjectInputStream   ois=null;
           try {
            ois=new  ObjectInputStream(new  FileInputStream("e:/abc/xx.txt"));

            try {
                Employee  emp=(Employee)ois.readObject();

                System.out.println(emp);

                ois.close();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //对象的持久化存储
    private static void writeObj() {
        // TODO Auto-generated method stub
        ObjectOutputStream  oos=null;
           try {

        oos=new  ObjectOutputStream(new  FileOutputStream("e:/abc/xx.txt"));

        oos.writeObject(new  Employee("jack", "123"));

        oos.close();

        System.out.println(oos);

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

//多线程与io相结合
class   Read   implements   Runnable{

    //管道读取流
    private  PipedInputStream  pls;

    public Read(PipedInputStream pls) {
        super();
        this.pls = pls;
    }

    //必修实现run方法
    public void run() {
        // TODO Auto-generated method stub

            byte  []   bt=new  byte[1024];
            int   len=-1;
            try {
                len=pls.read(bt);
                  System.out.println("读取到:"+new  String(bt,0,len)); 

            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

                if(pls!=null){
                        try {
                            pls.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                }

    }

}

class   Write  implements   Runnable{

    //管道写入流
    private  PipedOutputStream  pos;

    public Write(PipedOutputStream pos) {
        super();
        this.pos = pos;
    }

    public void run() {
        // TODO Auto-generated method stub
              try {
                pos.write("我的是管道流写入的".getBytes());

                pos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

}

//学生类
class   Student    implements   Comparable<Student>
{
             private   String   name;  //名字
             private   int   ma,cn,en;  //语数外
             private  int   sum;  //总分

             public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public int getMa() {
                return ma;
            }

            public void setMa(int ma) {
                this.ma = ma;
            }

            public int getCn() {
                return cn;
            }

            public void setCn(int cn) {
                this.cn = cn;
            }

            public int getEn() {
                return en;
            }

            public void setEn(int en) {
                this.en = en;
            }

            public int getSum() {
                return sum;
            }

            public void setSum(int sum) {
                this.sum = sum;
            }

            public   String    getName(String  name){
                       return   this.name=name;
             }

      public Student(String name, int ma, int cn, int en) {
                super();
                this.name = name;
                this.ma = ma;
                this.cn = cn;
                this.en = en;
                this.sum = ma+cn+en;
            }

    @Override
    public String toString() {
        return "Student [name=" + name + ", ma=" + ma + ", cn=" + cn + ", en="
                + en + ", sum=" + sum + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + sum;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (sum != other.sum)
            return false;
        return true;
    }

    //比较的方法
    public int compareTo(Student arg0) {
        // TODO Auto-generated method stub
        //用对象总分和名字比较,如果总分相等
             int    num=  new  Integer(this.sum).compareTo(new  Integer(arg0.sum));
             //如果
             if(num==0){
                    return   this.name.compareTo(arg0.name);
        }

        return num;
    }

}

我命由我,不由天。

时间: 2024-10-25 08:14:18

黑马程序员——io之第四部分的相关文章

黑马程序员——IO篇

------- android培训.java培训.期待与您交流! ---------- IO(Input Output)流 1.IO流用来处理设备之间的数据传输 2.Java对数据的操作是通过流的方式 3.Java用于操作流的对象都在IO包中 4.流按操作数据分为两种:字节流与字符流 . 字符流的数据字节流其实都能处理,因为无论什么在计算机上最后都是以字节存在的,但是其中有一部分数据它是以文本形式存在的,所以为了方便有了字符流,字符流里融合了编码表,而只有文字用到了编码表,所以字符流用来处理文本

黑马程序员------IO(五)

黑马程序员------IO(五) 1.1  操作对象(示例1)ObjectInputStream与ObjectOutputStream 被操作的对象需要实现Serializable. Serializable:用于给被序列化的类加入ID号,用于判断类和对象是否是同一个版本 类通过实现java.io.Serializable接口以启用序列化功能,Serializable只是一个标记接口. 1 示例1: 2 import java.io.*; 3 4 class ObjectStreamDemo 5

黑马程序员 IO流 文件的分割与合并

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------package cn.itcast.IO; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;

黑马程序员——IO流总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 什么是IO流? IO流是用来处理设备之间的数据传输 有哪些流? 流按操作数据的种类分为:字符流和字节流 流按流的方向分:输入流和输出流 字节流的基类:InputStream和OutputStream 字符流的基类:Writer和Reader 常用写字符流:FileWriter,BufferedWriter,OutputStreamWriter,PrinterWriter 常用读字符流  : F

黑马程序员-IO流其他流与File类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 1:其他的流 1: DataOutputStream ;多了一些操作基本数据类型的功能 DataInputStream:读取文件. 用DataOutputStream流写进去的数据,就用DataInputStream流来读取. 1 imp

黑马程序员——IO流

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- IO流 IO流概述 IO流用来处理设备之间的数据传输.Java对数据的操作是通过流的方式.Java用于操作流的对象都在IO包中. 流按照流向分为两种:输入流和输出流. 输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入.将内存的数写入到外设中:输出. 流按照操作数据分为两种:字节流和字符流. 字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字.再对这个文字

黑马程序员—IO(一)流概述、字符流、字节流、流操作规律

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:Inp

黑马程序员——IO流概述、字符流、字节流、流操作规律(一)

第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:InputStream和OutputStream 2)字符流的抽象基流:Reader和Writer 注:此四个

黑马程序员——IO流(一)

package IO; import java.io.FileWriter; /*IO(Inout Output)流 * Io流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的对象都在Io包中 * 流按操作数据分为两种:字节流与字符流 * 流按流向分为:输入流,输出流 * * IO流常用基类 * 字节流的抽象基类 * InputStream OutputStream * 字符流的抽象基类 * Reader Writer * 由这四个类派生出来的子类的名