1.IO流的分类
参照物是内存,可以理解为是当前的应用程序(demo) I input 输入 从硬盘读取数据存入到了内存中,这叫输入 O output 输出 从内存中写入数据到硬盘中,这叫输出 输入流(读)和输出流(写) 两种处理方式: 字节流: 按照字节为单位,处理当前文件 字符流: 首先按照字节读取或者写入数据,但是在操作过程中会有一个解码过程。如果解码不成功,就意味着咱们读取数据和写入数据失败了。容易失败 java给咱们提供了 输入字节流 InpuStream 它有一个子类 FileInputStream 输出字节流 OutputStream 他有一个子类 FileOutputStream 输入字符流 Reader 输出字符流 Writer
3.1字符输入流
import java.io.*;
import com.sun.org.apache.bcel.internal.generic.NEW;
//字符输入流 Reader
//和字节输入流的功能类似,但是中间多了一个解码的过程,有可能会出现问题
//从磁盘上面读取一个文件里面的内容到内存中
public class Demo1 {
public static void main(String[] args) throws Exception {
//1.创建file对象
File file = new File("c:/aaa/2.txt");
//2.创建一个字符输入流对象
FileReader fr = new FileReader(file);
//3.创建一个字符缓冲流,因为FileReader不具备缓冲功能的,
//需要使用字符缓冲流来对FileReader进行缓冲的
BufferedReader br = new BufferedReader(fr);
//4.读取文件到内存中
//int read();读取一个字符
//int read(char[] chars);缓冲数组,将数据读取到这个缓冲数组中
//String readLine();读取一行数据
char[] cbuf = new char[1024];
int length = br.read(cbuf);
System.out.println(new String(cbuf));//只是单纯的象借助于String类打印一下char数组中的东西看一下而已
br.close();
fr.close();
}
}
import java.io.*;
//字符输出流
//将内存的数据写入到磁盘上面
public class Demo2 {
public static void main(String[] args) throws IOException {
//1. 创建一个FIle对象
File file = new File("c:/aaa/3.txt");
//2.创建字符输出流对象
FileWriter fw = new FileWriter(file);
//3.创建缓冲字符输出流
BufferedWriter bw =new BufferedWriter(fw);
//4.写入字符到文件中
//bw.write("立秋了,大家夜里要盖被子,不然特殊情况非常危险");
//写入字符串的一部分
//bw.write("今天我感冒了,会不会被拉走啊", 1, 4);
bw.write("天气凉爽");
bw.newLine();//换行写数据
bw.write("的数据南京");
//5.关闭资源
bw.flush();
bw.close();
}
}
字符流一般不会用作图片 音频 视频的读写操作!!!有可能在转码的时候出现问题
图片 音频 视频的读写操作都是使用字节流
特别是以后文件上传的时候,比如上传头像,绝对不能使用字符流
今天你们试一下音频 图片,是哟领字符流看看能不能复制???
2.常用类
2.1StringBuffer
和String类似的,是专门处理字符串的。StringBuffer是线程安全,
可变的字符序列
public class Demo2 {
public static void main(String[] args) {
//这个以后在开发中标非常常用
//sql 会经常进行字符串的拼接,可以使用
StringBuffer sb = new StringBuffer();
//System.out.println(sb);
sb.append(1);
sb.append(true);
//System.out.println(sb);
//sb就是同一个对象。在内存地址里面,可以在这字符序列对象中随时加入其它数据
sb.append("你好");
sb.append('a');
sb.insert(1, 'p');
System.out.println(sb);
}
}
StringBuild 自己学习,看着官方手册
因为有一个面试题:简单介绍一下String StringBuffer StringBuild这三个类
String是一个不可改变的序列字符 StringBuffer是可改变的序列字符,线程安全的,效率低 StringBuild也是可以改变的序列字符,线程不安全,效率高
2.2枚举
enum:枚举
public static final int DEFAULT_CAPACITY = 10;//静态常量
上面这种写法也可以使用枚举的写法。静态常量,不可改变量,而且在这个类都可以使用
枚举可以使用switch-case这个语句中
但是现在开发中一般都是写枚举,而不是写静态常量,因为枚举看着高大上!!!
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
//之前写类的时候 public class 类名
//现在写枚举 public enum 枚举名字
public enum Week {
//定义的枚举是一个常量
//类名.常量 打印的就是常量
//Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
//Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
MON,TUE,WEN,THUR, FRI,SAT,SUN
}
2.3包装类
八大基本数据类型
整型:int short byte long所对应的包装类 Integer Short Byte Long
其中Integer最为常用,其他三个不用
浮点类型: float double所对应的包装类 Float Double
字符型: char 所对应的包装类 Character
布尔型:boolean 所对应包装类 Boolean
总结:除了int和char 包装类特殊以外,其他的包装类都是首字母大写的情况
每一个基本数据类型都有与之对应的包装类
包装类的目的:对咱们的基本数据类型进行包装,让其拥有更多的方法和常量,说白了就是让其功能变的更加强大。
//包装类
public class Demo1 {
public static void main(String[] args) {
//int short byte long
int i = 10;
System.out.println(i);
//int类型所对应的包装类叫Integer
Integer i1 = 10;
System.out.println(i1);
//只不过在内存中存储的空间不一样而已
//为什么要包装?
//是因为int类型的数据java给咱们提供的常量和方法比较少
//所以干脆对int类型的数据进行包装,让他变成一个类,
//那么这个包装类就可以封装很多方法和常量
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
//构造方法
//Integer(int value)
//构造一个新分配的 Integer对象,该对象表示指定的 int值。
Integer i2 = new Integer(10);
System.out.println(i2);
//short 的包装类 Short
//byte 的包装类 Byte
//long 的包装类 Long
}
}
public class Demo2 {
public static void main(String[] args) {
float f1 = 3.278f;
Float float1 = new Float(8.9);
System.out.println(float1);
double d1 = 9.0992;
Double double1 = new Double(38030.28920);
//char;类型的包装类
char ch1 = 'a';//栈区
Character character = new Character('a');//真实的值在堆区
System.out.println(ch1);
System.out.println(character);
//boolean 类型的包装类 Boolean
boolean b1 = true;
Boolean boolean1 = new Boolean(true);
System.out.println(b1);
System.out.println(boolean1);
//String 的包装类 String
String string = "jsajnmj";
String str1 = new String("jskmsakmklm");
}
}
包装类下面的一些方法
包装类给咱们提供了一些构造方法和常用的方法
1.除了Character这个包装类以外,其他的包装类都是支持与之对应的基本数据类型作为字符串的参数构造方法。
2.将引用数据(包装类)类型转为基本数据类型比如 Integer转为int类型 ,使用***Value(); 比如intVlaue () byteValue() shortValue()
3.toString方法,将基本数据类型转为字符串类型的数据
4.parse***();将字符串转为基本数据类型,Character除外
5.valueOf方法;将基本数据类型转为包装类
6.自动装箱和拆箱
装箱:将基本数据类型转为包装类对象
拆箱:将包装类对象转为基本数据类型
java为了简单省事,咱们有两个方法叫***Value()和 valueOf这两个方法,目的是装箱和拆箱,但是调用方法太麻烦,所以就进行封装,自动拆箱和装箱。不用调用上面两个函数,自己就可以完成了。JDK 1.5+
2.4Math类
JAVA是面向对象思想的,专门的类做专门的事
Math这个类是专门处理数学方法面的一个类
Math类下面的方法全部是静态方法
绝对值
最大值
最小值
向上取整
向下取整
四舍五入
随机数
//专门处理数学的类Math
//都是静态方法,就意味着你直接使用类名直接调用
public class Demo1 {
public static void main(String[] args) {
System.out.println(Math.abs(-3.4));//求绝对值 3.4
System.out.println(Math.max(6, 9));//只能比较两个数的最大值
System.out.println(Math.max(4, Math.max(5, Math.max(7, 8))));
System.out.println(Math.min(3, 4));//最小值
System.out.println(Math.ceil(3.4));//向上取整 4
System.out.println(Math.floor(5.6));//向下取整 5
System.out.println(Math.round(3.6));//四舍五入
System.out.println(Math.random());//[0,1]
System.out.println((int)(Math.random() *100));//[0,100]
}
}
2.5Random
提供了更为丰富的随机数的方法
import java.util.Random;
//Random随机生成数一个类
public class Demo1 {
public static void main(String[] args) {
//官方手册里面有构造方法,所以可以直接实例化
Random random = new Random();
//随机生成的是布尔类型的数据,没有规律的
System.out.println(random.nextBoolean());
System.out.println(random.nextInt());//随机生成int类型的数据
System.out.println(random.nextDouble());//0-1之间的数 16位小数点
System.out.println(random.nextFloat());//0-1之间的数 8位小数点
System.out.println(random.nextLong());
}
}
2.6System
System类系统的,给咱们提供了一些静态的方法和静态常量
import java.util.Properties;
//System是系统类
public class Demo1 {
public static void main(String[] args) {
//out是标准输出
System.out.println("不换行输出");
System.out.println("再来一次");//标准正常输出
System.err.println("错误输出");//错误输出,是红色的字体
//获取当前的时间
//在1970年1月1日UTC之间的当前时间和午夜之间的差异,以毫秒为单位。
System.out.println(System.currentTimeMillis());//时间戳, 获取当前的时间
System.gc();//垃圾回收机制,会自动进行垃圾回收。然后写了这个代码
//如果写了这个代码就代表让jvm强制回收一些东西。
//所有课程结束以后,专门来学习垃圾回收机制,你现在的水平达不到
//在开发中需要用到?不用,但是面试用,用各种垃圾回收的算法,看你的知识面
//可以获取当前系统属性的
Properties properties = System.getProperties();
System.out.println(properties.get("os.name"));//系统名字Windows 7
System.out.println(properties.get("os.version"));//6.1
System.out.println(properties.get("user.name"));//wangbo
System.out.println(properties.get("user.dir"));//C:\Users\wangbo\eclipse-workspace\day20_wb
System.out.println(properties.get("java.version"));//1.8.0_241
}
}
2.7Runtime
Runtime这个类不能被实例化,是通过getRunTime这个方法来获取的
这个类是专门提供了java在运行时候的信息
import java.io.IOException;
//Runtime这个类提供了java在运行时候的信息
public class Demo1 {
public static void main(String[] args) throws IOException {
//不能直接实例化
Runtime runtime = Runtime.getRuntime();
System.out.println(runtime.maxMemory()/1024/1024);// 636MB//java 运行时候最大的内存,以字节
System.out.println(runtime.freeMemory()/1024/1024);//空闲内存39M
System.out.println(runtime.totalMemory()/1024/1024);//内存总量
//可以使用runtime执行电脑安装好的应用程序
//通过java代码可以打开咱们的应用程序
Runtime.getRuntime().exec("C:\\Program Files (x86)\\Notepad++\\notepad++.exe");
}
}