1.BigDecimal/BigInteger
1.1概述
BigDecimal:常用来解决精准的浮点数运算
BigInteger:常用来解决超大的整数运算
1.2创建对象
BigDecimal(double val)
将double转化成为BigDecimal,后者是都变了的二进制浮点值,十进制表示形式,有坑
BigDecimal(String val)
将String类型字符串的形式转化为BigDecimal
1.3常用方法
Add(BigDecimal bd) : 做加法运算
Substract(BigDecimal bd): 做减法运算
MultiplyMultiply(BigDecimal bd) : 做乘法运算
Divide(BigDecimal bd) : 做除法运算,除不尽时会抛异常
Divide(BigDecimal bd,保留位数,舍入方式) : 除不尽时使用
setScale(保留位数,舍入方式) : 同上
pow(int n) : 求数据的几次幂
1.4练习
2.IO简介
2.1继承结构
In/Out相对于程序而言的输入(读取)/输出(写出)的过程
在java中,更具处理的数据单位不同,分为字节流和字符流
字节流:针对二进制
字符流:针对文本文件,读写容易出现乱码的现象,在读写时,最好指定编码集为UTF-8
File
字节流:针对二进制文件
InputStream
--FileInputStream
--BufferedInputStream
--ObjectInputStream
OutputStream
--FileOutputStream
--BufferedOutputStream
--ObjectOutputStream
字符流:针对文本文件
Reader
--FileReader
--BufferedReader
--InputStreamReader
Writer
--FileWriter
--BufferedWriter
--OutputStreamWriter
--PrintWriter一行行写出
2.2Stream流的概念
- 数据的读写可以抽象成数据在管道中流动
- 流只能单向流动
- 输入流用来读取—>in
- 输出流用来写出---->out
- 数据只能从头到尾的顺序读写一次
3 File文件流
3.1概述
封装一个磁盘路径字符串,对这个路径可以执行一次操作
可以封装文件路径\文件夹路径\不存在的路径
3.2创建对象
File(String pathname)通过将给定路径名的字符串转化为抽象路径来创建一个新的File实例
new File(“d://abc/a.txt”);
new File(“d://abc”,“a.txt”)
3.3常用方法
练习:测试常规用方法
package cn.File;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class Test_File {
public static void main(String[] args) throws Exception {
File file = new File("D:\\ready\\900.txt");
System.out.println(file.length());
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
System.out.println(file.getName());
System.out.println(file.getAbsolutePath());
System.out.println(file.getParent());
file = new File("D:\\ready\\23.txt");
System.out.println(file.createNewFile());
file = new File("D:\\ready\\n");
System.out.println(file.mkdir());
file = new File("D:\\ready\\n\\r\\c");
System.out.println(file.mkdirs());
String[] list = file.list();
System.out.println(Arrays.toString(list));
System.out.println(list[0].length());
}
}
3.5练习3: 递归求目录总大小
需求:递归求目录总大小,分析:
1.列出文件夹当中的所有资源----listFiles()—>File[]
2.判断,当前资源是文件还是文件夹—文件夹大小为0,文件大小需要累加
—是文件,求文件的字节量大小length(),累加就行
—是文件,继续列出文件夹下的所有资源—listFiles()—>File[]
—判断,是文件,求文件的字节量大小length(累加就行)
—判断,是文件夹,再一次列出文件夹下的所有资源
----重复操作
也就是说:规律就是—只要是文件夹,就需要重复步骤1,2
上代码:
package day12;
import java.io.File;
public class Test3_FileSumRecursion {
public static void main(String[] args) {
/**本类用递归来求总目录的大小*/
File file = new File("D:\\ready");
long total = size(file);
//3.接受结果并打印
System.out.println(total);
}
private static long size(File file) {
//1.列出所有资源
File[] fs = file.listFiles();
//2.遍历数组,求和每个file对象
long sum = 0;
for (int i = 0; i < fs.length; i++) {
File f = fs[i];
if (f.isFile()){
sum = sum + f.length();
}else if (f.isDirectory()){
sum = sum +size(f);
}
}
return sum;
}
}
## `4.字节流读取
字节流是由字节组成的,字符流是由字符组成的
Java里字符是由两个字节组成的,字节流是基本,主要用在处理二进制数据。
流式传输主要指的是将整个音频和视频以及三维媒体等多媒体文件经过特殊的压缩方式解析成一个个压缩包,由视频服务器向用户计算机顺序或者实时传送。在采用流式传输的系统中,用户不必像采用下载方式那样等到整个文件全部下载完成,而是只需要经过几秒或者几十秒的延时启动即可在用户的计算机上利用解压设备对压缩的A/V 3D等多媒体文件解压后进行观看,此时多媒体文件的剩余部分将在后台的服务器内继续下载。
### 4.1InputStream抽象类
此抽象类是表示字节输入流的所有超类、抽象类,不可以创建对象哦~
常用方法:
abstract int read() 从输入流当中读取数据的下一个字节
int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
int read(byte[] b,int off ,int len)将输入流中最多len个数据字节读入byte数组,off表示存时的偏移量
void close()关闭此输入流并释放与该流相关的所有系统资源
### 4.2 FileInputStream 子类
直接插在文件上,直接读取文件数据
创建对象:
FileInputStream(File-file)-直接传文件对象
通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统的File对象file指定FileInputStream(String pathname)传递路径,通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。
### 4.3BufferedInputStream子类
bufferedInputStream为另外一个输入流添加一些功能,即缓冲输入以及支持mark和reset方法的能力。在创建BufferedInputStream时,会创建一个内部缓冲区数组(默认8k)的大小,在读取或者跳过流中的字节时候,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
创建对象:
BufferedInputStream(InputStream in)
创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用。
### 4.4练习:字节流读取案例
```java
package day12;
import java.io.*;
/**
* 本类用于测试文件的读取
*/
public class Test4_In {
public static void main(String[] args) {
//method();
method2();
}
public static void method2() {
InputStream in = null;
try {
in = new FileInputStream("D:\\ready\\4.txt");
int b;
while ((b = in.read()) != -1) {
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void method() {
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream("D:\\ready\\4.txt"));
int b;
while((b= in.read())!=-1){
System.out.println(b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5 字符流读取
5.1Read抽象类
用于读取字符流的抽象类
常用方法:
int read()读取单个字符
int read(char[]cbuf)将字符读入数组
abstract int read(char[]cbuf,int off,int len)將字符读入数组的某一部分
int read(charBuffer target)试图将字符读入指定的字符缓冲区
abstract void close()关闭该流并释放与之关联的所有资源
5.2FileReader子类
用来读取字符文件的便捷类。此类的构造方法默认字符编码和默认字节缓冲区大小都是适当的,要自己制定这些值,可以先在FileInputStream上构造一个InputStreamReader。
创建对象
FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新的FileReader。
FileReader(File file)在给定从中读取数据的File的情况下创造一个新的FileReader
5.3BufferedReader子类
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
创建对象
BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
5.4练习:字符流读取案例
package day12;
import java.io.*;
/**
* 本类用于测试字符读取流
*/
public class Test6_In2 {
public static void main(String[] args) {
method1();
method2();
}
public static void method2() {
try {
Reader in = new FileReader(new File("D:\\4.txt"));
int b;
while((b = in.read())!=-1){
System.out.println(b);
}
in.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void method1() {
try {
Reader in = new BufferedReader(new FileReader("D:\\4.txt"));
int b;
while ((b= in.read())!=-1){
System.out.println(b);
}
in.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
4.拓展
舍入方式解析
Round_HALF_UP四舍五入,如结算结果是4.4结果是4,计算结果是4.5结果是5
Round_HALF_DOWN五舍六入,五不入,如计算结果是4.5,结果是4,计算结果是4.6结果是5
ROUND_HALF_EVEN公平舍入:靠近5就舍弃成5,靠近6就进位成6
ROUND_UP直接进位,不管是0.1还是0.9直接进位
ROUND_DOWN直接舍弃,不管是0.1还是0.9直接舍弃
ROUND_CEILING(天花板),向上取整,取实际值的大值。朝着正方向round如果为正数,行为和Round up一样,负数和round down一样
ROUND_FLOOR(地板),向下取整,取实际值的小值。朝着正反向round如果为整数,行为和Round down一样,负数和round up一样