美文网首页
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)——处理流和重定向

    本节内容1.文件IO方式2.缓冲流和重定向3.对象序列化4.RandomAccess 一、文件IO方式1.标准I/...

  • IO流

    # Java 流式输入 输出原理 # Java 流的分类 # 输入 输出 流 类 # 常见的节点流 和 处理流 #...

  • Java编程基础(8)

    Java基础知识:Java字符串的处理(3) 11.Java查找字符串(indexOf()、lastlndexOf...

  • IO系统

    内容梗概: Java流式输入/输出的原理 Java流类的分类 输入/输出流类 常见的节点流和处理流 文件流 缓冲流...

  • java IO入门笔记

    1.java IO流的概念,分类,类图 1.1. java IO 流的概念 java的io是实现输入和输出的基础,...

  • Java IO详解

    1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的...

  • java基础--集合和流

    1.Map()重写equal同时重写hashCode()方法 Object类中的equal()和==是相同的 S...

  • 2021-01-18 文章收藏

    1. Java基础 1.1 Java基础语法 Java 8 数据流问题[https://mp.weixin.qq....

  • java中的I/O流系统详解

    Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符...

  • Spring MVC 表单处理

    表单处理 静态页面返回和页面重定向

网友评论

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

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