美文网首页
Java基础(11)——处理流和重定向

Java基础(11)——处理流和重定向

作者: 让时间走12138 | 来源:发表于2020-04-19 11:43 被阅读0次

    本节内容

    1.文件IO方式

    2.缓冲流和重定向

    3.对象序列化

    4.RandomAccess

    一、文件IO方式

    1.标准I/O方式,输入:从操作系统的高速页缓存写到内存的缓存里。输出:从内存的缓存里写到操作系统的高速页缓存里。
    2.直接I/O方式:直接从硬盘里读取,直接写到硬盘里面,不需要中间的高速页缓存。
    3.映射I/O方式:操作系统先把磁盘里的数据读到高速页缓存里面,然后在应用缓存里面开辟一个一样大的空间指向这个数据,读取的时候就通过这个高速页缓存读取即可,不需要将它写入到应用缓存里面。同理,输入也是一样的,在高速页缓存里面有一个映射关系,就减少了拷贝的过程。速度就很快。
    4.处理流:①访问管道线程通信:线程A下载数据,线程B展示数据,这个时候就需要一个管道将他们连接起来,而且只能是单方向的 ②转换流:把字节转换为字符 ③推回输入流:数据读多了,要将其推回去。

    二、缓冲流和重定向

    1.处理流:BufferedInputStream/Reader BufferedOutputStream /Writer 注意:当使用处理流读取和输出时,需要使用fllush来刷新流
    2.虽然使用处理流比较快,但是它还是要经过以下步骤 ①使用节点流从磁盘将数据读取到内存的缓冲区 ②将内存缓冲区的数据读到处理流对应的缓冲区 ③处理流从处理流的缓冲区将数据读取到对应的地方去
    注:当一个文件存在,写入数据时会把之前的删除然后从头开始写。如果你想要从某个位置开始写,那么可以试一试RandomAccess(详情见以下第四大点)
    3.所以创建输入流的时候,我们首先要创建 FileInputStream类的对象,然后再创建 InputStreamReader类对象,然后再创建 BufferedReader类的对象,每一个括号里的内容就是前一个创建的对象。同理,创建输出流的时候可以类比。
    以下代码为使用处理流来读取数据
          String des="C:\\Users\\86178\\Desktop\\file\\1.txt";
          String src ="C:\\Users\\86178\\Desktop\\1.txt";
       try(//创建输入流
                FileInputStream fr=new FileInputStream(src);
                InputStreamReader isr=  new InputStreamReader(fr);
                BufferedReader br=new BufferedReader(isr);
                //创建输出流
                FileOutputStream fos=new FileOutputStream(des);
                OutputStreamWriter osw =new OutputStreamWriter(fos);
                BufferedWriter bw=new BufferedWriter(osw)) {
                int ch=0;
                while (true){
                    ch=br.read();
                    if(ch==-1){
                        break;
                    }
                    bw.write(ch);
                }
                bw.flush();
            }catch (Exception e){
                e.printStackTrace();
            }
    
    还可以把while循环改写一下
     while ((ch=br.read())!=-1){
                    bw.write(ch);
                }
    
    4.字节缓冲输入流,采用字节数组的方式,让它运行快一点
     public static void Buffered_io_byte(String src,String des){
            try {
                //字节缓冲输入流
                FileInputStream fis = new FileInputStream(src);
                BufferedInputStream bis=new BufferedInputStream(fis);
                //字节缓冲输出流
                FileOutputStream fos= new FileOutputStream(des);
                BufferedOutputStream bbs =new BufferedOutputStream(fos);
    
                byte [] buffer =new byte[1024];
                int len=0;
                while ((len=bis.read(buffer))!=-1){
                    bbs.write(buffer);
                }
                bbs.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    5.输出重定向:System.out一般是打印到终端,那么也可以重定向,让它在我们指定的文件里面打印出来。以下代码中的方法的参数是一个地址,也就是目标文件的地址
     public static void redirect_out(String des){
            try {
             FileOutputStream fos=   new FileOutputStream(des);
                PrintStream ps =new PrintStream(fos);
                System.setOut(ps);
                System.out.println("Hello World!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    经过以上的一系列操作,Hello World就不会显示在我们代码下方的终端里面,而是我们指定的文件里面
    6.输入重定向:从指定的文件输入,不要从终端输入,然后在终端输出,该方法的参数依然是目标文件路径
     public static void redirect_in(String src){
            try {
                FileInputStream fis= new FileInputStream(src);
                Scanner scanner =new Scanner(fis);
                while (scanner.hasNext()){
                    System.out.println(scanner.next());
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    三、对象序列化

    1.保存对象:如果需要将自己定义的类的某个对象使用文件保存,那么这个类必须是实现了Serializable(序列化)接口
    public class Person implements Serializable {
        String name;
        int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
     public static void saveObject(String des){
            try {
                FileOutputStream fos =new FileOutputStream(des);
                ObjectOutputStream oos= new ObjectOutputStream(fos);
                Person p =new Person("jack",23);
                oos.writeObject(p);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    2.读取对象
    public static void ReadObject(String src){
            try {
                FileInputStream fos =new FileInputStream(src);
                ObjectInputStream ois =new ObjectInputStream(fos);
                Person p =(Person)ois.readObject();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    四、RandomAccess

    1.RandomAccess的构造方法的参数有两种组合。①String 和 String mode ② File 和 String mode 注:Mode有 r ,rw, rws,rwd
    2.RandomAccess可以任意访问文件的位置,它可以调用seek()方法来决定从那个位置开始写
    public static void randomAccess(String src){
            try {
                RandomAccessFile raf =new RandomAccessFile(src,"r");
                raf.seek(2);
                byte[] buffer= new byte[50];
                raf.read(buffer);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    它还可以调用writeBytes()写入数据,可以首先定好位置,但是这样就会把原本那个位置的内容覆盖
               raf.seek(7);
                raf.writeBytes("jack");
    
    OK,以上就是我们今天的全部内容了,再见!

    相关文章

      网友评论

          本文标题:Java基础(11)——处理流和重定向

          本文链接:https://www.haomeiwen.com/subject/htgwvhtx.html