Java-JavaSE-IO

Posted wonewo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-JavaSE-IO相关的知识,希望对你有一定的参考价值。

  • 输入输出流是相对内存来说的
  • * Windows的换行:
  • * 键盘输入
    • InputStream in = System.in;
      • System.in这个流不需要关闭,不然本次程序无法再次使用此流
  • IO的一些使用规律
    • 转换流:
      • InputStreamReader:字节流转字符流,解码
      • OutputStreamWriter:字符流转字节流,编码
    • 明确源和目的
      • 源:InputStream Reader(文本)
      • 目的:OutputStream Writer(文本)
    • 明确具体设备
      • 源:
        • 硬盘:FileInputStream FileReader
        • 键盘:System.in
        • 内存:数组
        • 网络:Socket流
      • 目的:
        • 硬盘:FileOutputStream FileWriter
        • 控制台:System.out
        • 内存:数组
        • 网络:Socket流
  • 字节流
    • 2个抽象基类:InputStream/OutputStream
    • InputStream
      • 子类
        • BufferedInputStream
        • FileInputStream
          • 方法
            • int available()
              • 返回待操作文件的大小
    • OutputStream
      • write()方法直接写到目的地,不用flush(),但是要close()
      • 子类
        • BufferedOutputStream
        • FileOutputStream
          • 子类
            • PrintStream
              • 永不抛IOException
              • print()
                • 提供许多可以打印多种数据类型的方法,会保持数据的表示形式
    • ObjectInputStreamObjectOutputStream
      • 被操作的对象需要实现Serializable
      • 非瞬态,非静态数据才会被序列化
        • transient修饰,不会被序列化
      • 强烈建议,给需要序列化的类显示声明serialVersionUID
    • RandomAccessFile
      • 支持对随机访问文件的读取和写入
      • 不会清空原文件的内容,会在原有内容上进行覆写
      • 可以多个线程,同时往一个文件中写入数据
      • 内部维护了一个byte数组
      • 将字节输入流和输出流进行了封装
      • 源和目的只能是文件
      • 可以获取指针位置,或者设置指针位置,以便操作任意位置的数据
    • PipedInputStreamPipedOutputStream
      • 结合多线程,某个线程通过PipedInputStream读取数据,另一个线程通过PipedOutputStream将数据写出
      • PipedInputStream提供PipedOutputStream需要的数据
    • DataInputStreamDataOutputStream
      • 操作基本数据类型、
    • ByteArrayInputStreamByteArrayOuputStream
      • 关闭这个流是无效的,此类的方法在关闭后仍可以使用
      • 源和目的都是内存
  • 字符流
    • 2个抽象基类:Reader/Writer
    • 其实是字节流+编码表,读到字节之后,先查表,再转成字符
    • Reader
      • 方法
        • int read()
          • read a single character,返回读到的字符的int表示,没读到,返-1
        • int read(char[] c)
          • 将读到的字符存入c中,返回读到的字符个数(只要读到,就返回!),当读到末尾后,返回-1
          • 简单应用:
            • while( (length=r.read( c ))!=-1){ System.out.print(new String(c , 0, length);}
      • 子类
        • BufferedReader
          • 构造方法
            • BufferedReader(Reader in)
          • 方法
            • String readLine()
              • 直接读一行,返回字符串,读完,返回null,而非-1
          • 子类
            • LineNumberReader
              • 同属于装饰类
              • 用于需要操作行号的情况
        • InputStreamReader
          • 字节流向字符流转换的桥梁
          • 可以指定码表
          • 小应用
            • BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
          • 子类
            • FileReader
              • 使用默认的码表
    • Writer
      • 方法
        • abstract void close()
          • closes the stream, flushing it first
        • abstract void flush()
        • void write(char[]intString x)
      • 子类
        • OutputStreamWriter
          • 字符流通往字节流的桥梁
          • 可以指定码表
          • FileWriter
            • 使用默认的码表
            • FilleWriter fw =new FileWriter("filename");
              • //若文件不存在,就创建,若存在,则覆盖原文件
              • 所以最好在写入之前一步才写这句话!不然会将原有的文件覆盖
            • fw.write("abc");
              • 写入临时存储缓冲区
            • fw.flush();
            • fw.close();
              • //关闭前会自动调用flush()方法
            • 异常处理
              • FileWriter fw= null;
              • try{
              • fw=new FileWriter("xxx.txt");
              • fw.write("a");
              • }catch(IOException e){}
              • finally{
              • if(fw!=null)
              • try{
                • fw.close();
                • catch(IOException e){}
              • }}
        • BufferedWriter
          • 构造函数
            • BufferedWriter(Writer out)
          • method
            • write()
              • 将数据放在缓冲区
            • flush()
              • 将缓冲区中的东西写入外设
            • close()
              • 缓冲区关闭后,关闭前会先flush(),流也就关了
            • void newLine()
              • 写入一个与平台相关的换行符
        • PrintWriter
          • 保证打印数据的表示形式
          • 构造函数的参数
            • 字符串路径
            • File对象
            • 字节输出流
            • 字符输出流
        • 序列流
          • SequenceInputStream
            • 构造器参数有Enumeration<xx>
              • 所以要创建Vector对象存储多个流,来创建Vector的Enumeration
  • RandomAccessFile
    • 实例支持对随机文件的读和写
    • 内部维护了byte类型的数组,且有指针可以操作数组中的元素
    • 若目的文件存在则不创建,要写的话,则将原来的数据覆盖,若不存在,就创建
    • getFilePointer()
    • seek(1*8)
      • 将指针设置到角标是8的位置,每一个角标存储1个字节的数据
      • 读和写都是从角标位置开始的
    • writeInt()

以上是关于Java-JavaSE-IO的主要内容,如果未能解决你的问题,请参考以下文章