zoukankan      html  css  js  c++  java
  • I/O复习

    I/O流之字符流

    问题:字节流和字符流区别?

    java1.0只提供了字节流,分为输出流(Inputstream)和输入流(Outputstream),

    以字节为单位来读取或写入数据,以二进制来处理数据(8位),但无法处理Unicode字符。

    java1.1版本增加了字符流Reader(输入流)和Writer(输出流),可以解决16位的

    Unicode字符。

    所以最好用字符流

    (Unicode字符:可以在二进制和字符间相互转换的一种编码机制或准则)

    //读取文件并复制文件
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class FileWriteTest{
    
        public static void main(String[] args) {
    
            try{
                FileReader finput=new FileReader("桌面\递归");//产生输入流
                FileWriter Foutput=new FileWriter("桌面\递归副本");//产生输出流
    
                int i=0;
                while((i=finput.read())!=-1){
                    System.out.print((char)i);
                    Foutput.write(i);
                }
                finput.close();
    
                Foutput.flush();
                 //**注意,Foutput,调用flush()方法来强制写出所有缓冲区的数据,清空缓冲区
                Foutput.close();
    
            }catch(FileNotFoundException e){
                e.printStackTrace();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /*运行结果:无法找到文件,为什么?
    java.io.FileNotFoundException: 桌面递归 (No such file or directory)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at java.io.FileReader.<init>(FileReader.java:58)
        at FileWriteTest.main(FileWriteTest.java:11)
    */

    说明:如果要输出流写数据,需要在写入操作完成后,调用flush()方法来强制写出所有缓冲区的数据

     

    I/O原理

    数据源———输入流——>java程序读取数据

     

    java程序写入数据———输出流——>数据源(存储媒介)

     

    说明:

    数据源:比如文件、内存、网络连接

     

    流的分类:

    数据流:输入流和输出流(读取和输出)

    数据传输单位:字节流 (InputStream和OutputSteam)和字符流(Writer和Reader)

    按功能分:过滤流(直接操作数据源的流)和节点流(对已存在的流进行读写和封装,为通过更强大的读写功能)

     

     

    缓冲流和对象流

    缓冲流的应用场景?(读大文件时,可以增加读写效率,用BufferReader来读)

    当文件大的时候,肯定用字符流读会很不便捷,则需要用过滤流,也叫处理流,即对一个已存在的流进行连接和封装,并为了扩展其读写功能。而缓冲流就是其中一种。

     

    缓冲流:直接操作一个数据源的节点流的一个包装。

     

    例如把

    FileReader finput=new FileReader("桌面\递归");//产生输入流

    改为

    BufferReader finput=new BufferReader("桌面\递归");

    此时读取的效率会更高

     

    对象流的应用场景?

    对象流也是过滤流的一种,主要有ObjectOutputStream类和ObjectInputStream类,用于存和读基本类型数据或对象的过滤流,特点是把java中的对象写到数据源中(序列化,即写入或者理解为存),也能把对象从数据源中还原出来(反序列化,解析或者读取)。

     

    说明:

    1.对象流不能序列化static或transit修饰的成员变量。

    2.序列化的对象所对应的类那必须实现Java.io.Serializable接口。

     

    比如:

    import Java.io.Serializable;

    public class Student implements Serializable{

    ……

    }

     

    问题:

    什么是不可序列化的对象呢?是不是这个对象本身就已经被写出来了呢?

     static是修饰静态变量时,只要类加载即可,不需要读到数据源(文件、内存、网络连接)当中,即不需要序列化。

     

    随机存储存取文件流和File类

     

    1.随机存储存取文件流

    RandomAccessFile是一种特殊的流类,它在文件任何地方读取或写入数据。

    RandomAccessFile能在文件里随意地前后移动,它是一个直接继承于Object的类。

    简单概括:文件内容可跳读、可间断下载(不连续)、储存

     

    一般RandomAccessFile的工作方式是吧DataInputStream和DataOutputStream

    结合起来,再加上一些自己的方法。

    常用方法:

    long getFilePointer();   //用于得到当前文件指针

    void seek(long pos);    //用于移动文件指针到指定的位置

    int   skipBytes(int n);   //使文件指针向前移动指定的n个字节,即跳过的字节数

     

    2.File类

    应用场景是什么?

    操作某个文件夹或设置某个文件夹的属性或代表文件的概念,以及存储一些对于文件

    的基本操作。

    说明:其定义了一系列与操作系统平台无关的方法来操作文件和目录。

    (查看API文档关于java.File类)

    File文件或目录的生成

    File类的对象可代表一个文件路径

    File f1=new File(“d:\test\1.txt”);

     //把以往的笔记看看,其实你之前花时间学过IO流的,不懂的位置参看一下蓝白书的例子,另外把红黄书的后面的题目做一下,宝典的对应的内容复习一下。

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    Python自动化之面向对象进阶
    Python自动化之pickle和面向对象初级篇
    Python自动化之常用模块
    剑指offer 顺时针打印矩阵
    剑指 offer 树的子结构
    剑指offer 合并两个排序的链表
    剑指offer 调整数组顺序使奇数位于偶数前面
    剑指offer 数值的整数次方
    变态跳台阶
    剑指offer 重建二叉树
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8379701.html
Copyright © 2011-2022 走看看