IO流之InputStream详解

1 IO

  • BigDecimal/BigInteger

概述 :

  • BigDecimal:常用来解决精确的浮点数运算。
  • BigInteger:常用来解决超大的整数运算。

创建对象:

  • BigDecimal.valueOf(2);
  • 常用方法: add(BigDecimal bd): 做加法运算
  • substract(BigDecimal bd) : 做减法运算
  • multiply(BigDecimal bd) : 做乘法运算
  • divide(BigDecimal bd) : 做除法运算
  • divide(BigDecimal bd,保留位数,舍入方式):除不尽时使用
  • setScale(保留位数,舍入方式):同上
  • pow(int n):求数据的几次幂
public class Test2_BigD {
       public static void main(String[] args) {
              double a = new Scanner(System.in).nextDouble();
              double b = new Scanner(System.in).nextDouble();
              System.out.println(a+b);
              System.out.println(a-b);
              System.out.println(a*b);
              System.out.println(a/b);//不精确              
              System.out.println(===上面的除法不精确===);
              BigDecimal bd1 = BigDecimal.valueOf(a);
              BigDecimal bd2 = BigDecimal.valueOf(b);
              BigDecimal bd3;
              bd3=bd1.add(bd2);
              System.out.println(bd3.doubleValue());              
              bd3=bd1.subtract(bd2);
              System.out.println(bd3.doubleValue());              
              bd3=bd1.multiply(bd2);
              System.out.println(bd3.doubleValue());
              
//           bd3=bd1.divide(bd2);//报错除不尽
              //保留位数和舍入方式
              bd3=bd1.divide(bd2,5,BigDecimal.ROUND_HALF_UP);
              bd3=bd3.setScale(2, BigDecimal.ROUND_HALF_UP);//保留两位
              System.out.println(bd3.doubleValue());              
       }
}
  • IO简介

继承结构:

  • in/out相对于程序而言的输入(读取)和输出(写出)的过程。
  • 在Java中,根据处理的数据单位不同,分为字节流和字符流
    File

字节流:针对二进制文件

> InputStream 
> --FileInputStream
> --BufferedInputStream 
> --ObjectInputStream OutputStream
> --FileOutputStream
> --BufferedOutputStream
> --ObjectOutputStream

字符流:针对文本文件。读写容易发生乱码现象,在读写时最好指定编码集为utf-8

>  Writer
>   	-- BufferedWriter
>    	-- OutputStreamWriter Reader
>     	-- BufferedReader
>      	-- InputStreamReader
>       	-- PrintWriter/PrintStream
  • 流的概念
  • 数据的读写抽象成数据,在管道中流动。
  • 流只能单方向流动
  • 输入流用来读取in
  • 输出流用来写出Out
  • 数据只能从头到尾顺序的读写一次

  • File文件流

概述:

  • 封装一个磁盘路径字符串,对这个路径可以执行一次操作。 可以用来封装文件路径、文件夹路径、不存在的路径。

创建对象:

  • File(String pathname)
  • 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

常用方法:

  • 文件、文件夹属性 length():文件的字节量
  • exists():是否存在,存在返回true
  • isFile():是否为文件,是文件返回true
  • isDirectory():是否为文件夹,是文件夹返回true
  • getName():获取文件/文件夹名
  • getParent():获取父文件夹的路径
  • getAbsolutePath():获取文件的完整路径

创建、删除:

  • createNewFile():新建文件,文件夹不存在会异常,文件已经存在返回false
  • mkdirs():新建多层不存在的文件夹\a\b\c
  • mkdir():新建单层不存在的文件夹\a
  • delete():删除文件,删除空文件夹

文件夹列表:

  • list():返回String[],包含文件名
  • listFiles():返回File[],包含文件对象

字节流读取:

  • 字节流是由字节组成的,字符流是由字符组成的
  • Java里字符由两个字节组成.字节流是最基本的,所有InputStream和OutputStream的子类都是,主要用在处理二进制数据。

流式传输主要指将整个音频和视频及三维媒体等多媒体文件经过特定的压缩方式解析成一个个压缩包,由视频服务器向用户计算机顺序或实时传送。在采用流式传输方式的系统中,用户不必像采用下载方式那样等到整个文件全部下载完毕,而是只需经过几秒或几十秒的启动延时即可在用户的计算机上利用解压设备对压缩的A/V、3D等多媒体文件解压后进行播放和观看。此时多媒体文件的剩余部分将在后台的服务器内继续下载。

字符流读取:

  • 常用于处理纯文本数据。
  • Reader抽象类
  • 用于读取字符流的抽象类。
   常用方法:
    -- int read() :读取单个字符。 
    -- int read(char[] cbuf) :将字符读入数组。 
    -- abstract  int read(char[] cbuf, int off, int len) :将字符读入数组的某一部分。 
    -- int read(CharBuffer target) :试图将字符读入指定的字符缓冲区。 
    -- abstract  void close() :关闭该流并释放与之关联的所有资源。

文件的读取

public class tt {
    public static void main(String[] args) throws Exception {
       method1();// 字节读取
       method2();//字符读取
    }
     
    private static void method2() throws Exception {
       //字符流读图片乱码
//     BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:\\teach\\1.jpg"))));

       BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:\\teach\\a\\1.txt"))));
//     System.out.println(in.readLine());
//     System.out.println(in.readLine());//null读到/n/r       
       String line = "";
       while((line = in.readLine())!=null) {//一行一行读
           System.out.println(line);
       }       
       in.close();
    }
 
    private static void method1() throws Exception {
       long s = System.currentTimeMillis();
       InputStream in = new FileInputStream("D:\\teach\\1.jpg");

       int b = 0;
       while ((b = in.read()) != -1) {
           // System.out.println(b);
       }

       s = System.currentTimeMillis() - s;
       System.out.println(s + "--");// 7515

       long ss = System.currentTimeMillis();
       InputStream in2 = new BufferedInputStream(new FileInputStream("D:\\teach\\1.jpg"));
       int b2 = 0;
       while ((b2 = in2.read()) != -1) {
           // System.out.println(b2);
       }

       ss = System.currentTimeMillis() - ss;
       System.out.println(ss + "==");// 32
       
       in.close();
       in2.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章