• Java的IO流


    流的应用很多,其中一个就是Socekt(包括TCP和UDP),需要结合学习

    一、基础概念

    1.流是什么?

       用于程序和设备之间数据传输的管道,这个管道上有很多按钮,用不同的按钮实现不同的功能

    2.流的分类?

     (1)按照流的方向:输入流、输出流

     (2)按照传输的数据类型:字节流、字符流

     (3)按照功能的不同:原始流(节点流)、包裹流(处理流)

    3.一些流的区别

     (1)四大基本流:InputStream,OutputStream,Reader,Writer是原始流

                方法注意:所有的输出流中有flush方法,而输入流中并没有

     (2)文件流:FileInputStream,FileOutputStream,FileReader,FileWriter是包裹流。

               其中字节流可用来完成所有格式的文件的复制,但是字符流只能完成文本文件的复制;

               另外,字节流在处理输入输出时不会用到缓存,但是字符流会用到缓存(主要区别);

               将文本文件的内容输入电脑并显示出来时,字符流可以,但是字节流因为读入的是字节,输入到显示屏时以字符输出便会产生乱码!

    (3)缓冲流:BufferInputStream,BufferOutputSream,BufferReader,BufferWriter是包裹流

            特点:可以减少对IO的访问次数,从而保护计算机硬盘

           BufferInputStream和BufferOutputStream可以完成大容量文件的复制,这比单纯使用InputStream和OutputStream要快得多

           需要注意:bis,read(buf,0,1024)是从bis所关联的的文件中读取数据,并将其写入bis自己默认的缓冲区中,然后将缓冲区的内容写入buf数组中,

                      每次最多写入1024个字节,返回实际写入buf数组的字节个数,若到尾,则无法再向buf数组中写数,返回-1

         BufferedReader流中有个非常重要有用的方法readLine,可提高读写速度。

         也要注意readLine()方法遇到换行就停止,但是会将读取的换行符自动丢弃,所以一般需要自己再newLine();

    (4)数据流:DataInputStream,DataOutputStream,是包裹流;没有DataReader,DataWriter

            特点就是其中包含的可以读取或写出任意基本类型的数据的方法,比如dos.writeLong(n)     另外还有readBoolean  readInt readChar readFloat readUTF其实是读取String类

          也要注意,DataOutputStream流中的writeLong(Long n)是把n变量的内存中的二进制代码写入该流所关联的设备中

    (5)转换流:InputStreamReader,OutputStreamWriter

              实例:将键盘输入的字符显示

    (6)Print流:PrintStream,PrintWriter

              特点:用于不同数据类型的格式化输出(将一个数据用其字符串格式输出)(区别数据流)

              PrintStream只能封装OutputStream类的字节流,而PrintWriter不仅能封装OutputStream还能封装Writer.另外PrintWriter中的println具有跨平台性

              其中两种用法:System.setOut(psOut);//

                                 System.setErr(psError);//将错误信息输出到关联设备显示屏中

    (7)Object流,也叫做对象序列化

           特别注意,这里对象序列化也就是把一个object类对象直接转换成字节流,然后把字节流直接写入本地硬盘或网络。

                         必须实现serializable接口,是一个标识接口,里面没有任何的方法

                  用transient修饰的方法不被序列化

    文本文件的复制,用字符流比字节流好

    package fileCopyTest;
    import java.io.*;
    
    public class TestFileReaderWriterCopy {
        public static void main(String[] args){
            try{
                FileReader fr=new FileReader("F:\test.text");//此处应该抛异常
    
                FileWriter fw=new FileWriter("F:/result.text");//此处应该抛异常
                int ch;
                ch=fr.read();//没有fr.read(ch);
                while (-1!=ch){
                    fw.write(ch);
                    ch=fr.read();
                }
                fw.flush();
                fr.close();
                fw.close();
            }
            catch (Exception e){
                System.out.printf("aaaa");
    
            }        
        }
    }

    一般用缓冲流来实现文件的读取,速度较快

  • 相关阅读:
    【洛谷P3804】【模板】后缀自动机 (SAM)
    【洛谷P3321】序列统计
    【洛谷P4929】【模板】舞蹈链(DLX)
    【洛谷P3703】树点涂色
    Kubernets二进制安装(5)之私有仓库harbor搭建
    忘记Mysql的root用户密码处理方法(以mysql 5.5.33为例)
    编译安装MySQL 5.5.33
    Kubernets二进制安装(4)之Docker安装
    Kubernets二进制安装(3)之准备签发证书环境
    Kubernets二进制安装(2)之Bind9安装
  • 原文地址:https://www.cnblogs.com/xiaoxiaohui2015/p/5426651.html
Copyright © 2020-2023  润新知