• 输入输出流


    1.InputStream

      BufferedInputStream内部维护了一个8KB的byte数组,通过减少读文件次数来提高读数据效率。BufferedInputStream方法本身不具备读文件能力,所以需要传入一个FileInputStream来读取文件的数据,同样,关闭输入流时关闭的也是FileInputStream,因此不需要关两次。

    2.OutputStream

      当文件不存在时,会自动创建一个,但是创建不了多级目录。

      使用write(int b)方法,虽然接收的是int类型参数,但是write 只能向输出流写入一个字节。要写入的字节是参数 b 的八个低位,b 的 24 个高位将被忽略。

    常见码表

    ASCII:美国标准信息交换码。用一个字节的7位可以表示。

    ISO8859-1:拉丁码表。欧洲码表,用一个字节的8位表示。又称Latin-1(拉丁编码)或“西欧语言”。ASCII码是包含的仅仅是英文字母,并且没有完全占满256个编码位置,所以它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入192个字母及符号,藉以供使用变音符号的拉丁字母语言使用。从而支持德文,法文等。因而它依然是一个单字节编码,只是比ASCII更全面。

    GB2312:英文占一个字节,中文占两个字节.中国的中文编码表。

    GBK:中国的中文编码表升级,融合了更多的中文文字符号。

    Unicode:国际标准码规范,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode。

    UTF-8: 最多用三个字节来表示一个字符。

    3.Reader

      FileReader默认维护了一个1024的char数组。

    4.Writer

      FileWriter只有在写满缓冲区、调用flush或close的时候才会写出信息。

    5.SequenceInputStream

      切割、合并mp3

        public void test7()throws IOException{
            File file = new File("e:/5 Seconds of Summer.mp3");
            File dir = new File("e:/music");
            FileInputStream inputStream = new FileInputStream(file);
            byte[] buf = new byte[1024*1024];
            int length =0;
            int i=1;
            while((length=inputStream.read(buf))!=-1)
            {
                FileOutputStream outputStream = new FileOutputStream(new File(dir, i + ".mp3"));
                outputStream.write(buf,0,length);
                outputStream.close();
                i++;
            }
            inputStream.close();
    
            File[] files = dir.listFiles();
            Vector<FileInputStream> inputStreams = new Vector<>();
            for(File f:files)
            {
                if(f.getName().endsWith(".mp3"))
                    inputStreams.add(new FileInputStream(f));
            }
            SequenceInputStream sequenceInputStream = new SequenceInputStream(inputStreams.elements());
            FileOutputStream outputStream = new FileOutputStream(new File("e:/out.mp3"));
            while((length=sequenceInputStream.read(buf))!=-1)
            {
                outputStream.write(buf,0,length);
            }
            outputStream.close();
            sequenceInputStream.close();
    
        }

    6.ObjectOutputStream、ObjectInputStream

       将对象的信息写到硬盘,叫对象的序列化。对象所属的类必须实现Serializable接口。Serializable接口不包含任何方法,只作为一种标识。

      对象的反序列化创建对象并不会调用构造方法(对象的克隆也不会调用构造方法)。

      使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。

      对于不应该序列化的属性,可以用transient修饰。

      如果一个类维护了对另外一个类的引用,那么另外一个类也需要实现Serializable接口。

    7.Properties

       Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。相反,应该使用 setProperty 方法。

      如果配置文件含有中文,使用store写出文件时只能使用字符流。

    8.PrintStream

      打印流可以打印任何类型的数据,而且打印数据之前都会把数据转换成字符串再进行打印。

    9.InputStreamReader

      将字节流转换成字符流。

  • 相关阅读:
    c++ 的几种强制转换的讨论
    观察者模式
    epoll实现linux进程通信
    vim 实现 go to definition的功能
    svn 的使用
    makefile文件的技术
    [转]epoll技术
    [转]poll技术
    Linux重定向的理解
    避免僵死进程的方法
  • 原文地址:https://www.cnblogs.com/juaner767/p/5668383.html
Copyright © 2020-2023  润新知