[API]十六进制缩写二进制补码File及File方法(五)
什么是二进制:逢2进1的计数规则。计算机中的变量/常量都是按照2进制来计算的
-
2进制:
-
规则:逢2进1
-
数字:0 1
-
基数:2
-
权:128 64 32 16 8 4 2 1
-
-
如何将2进制转换为10进制:
-
正数:将二进制每个1位置的权相加
-
public class BinaryDemo {public static void main(String[] args) {int n = 45; //编译时会被编译为: 101101System.out.println(Integer.toBinaryString(n)); //101101,以2进制输出System.out.println(n); //45,以10进制输出n++; //将101101增1----101110System.out.println(Integer.toBinaryString(n)); //101110,以2进制输出System.out.println(n); //46,以10进制输出}
}
十六进制:逢16进1的计数规则
-
16进制:
-
规则:逢16进1
-
数字:0 1 2 3 4 5 6 7 8 9 a b c d e f
-
基数:16
-
权:4096 256 16 1
-
-
用途:因为2进制书写太麻烦,所以常常用16进制来缩写2进制
-
如何缩写:将2进制从低位开始,每4位2进制缩为1位16进制
权: 8 4 2 1
2进制: 0001 1011 1110 1010 0101
16进制: 1 b e a 5------------0x1bea5权: 8 4 2 1
2进制: 0010 1111 1101 0100 0111 1011
16进制: 2 f d 4 7 b-------0x2fd47b权: 8 4 2 1
2进制: 0010 1001 0101 1010 1011 1001
16进制: 2 9 5 a b 9-------0x295ab9
public class HexDemo {public static void main(String[] args) {/*16进制:缩写2进制1)0x为16进制字面量前缀2)0b为2进制字面量前缀,可以加下划线---一般不用,一般都是16进制缩写3)计算机内部没有10进制,也没有16进制,只有2进制4)Integer.toHexString()可以将16进制数返回显示16进制:System.out.println(Integer.toHexString(n));*//*int n = 0x2fd47b; //0x表示16进制int m = 0b10_1111_1101_0100_0111_1011; //0b表示2进制System.out.println(Integer.toBinaryString(n)); //按2进制输出System.out.println(Integer.toBinaryString(m));System.out.println(Integer.toHexString(n)); //按16进制输出System.out.println(Integer.toHexString(m));System.out.println(n); //按10进制输出System.out.println(m);*//*8进制: 以0开头------------平时不用1)规则:逢8进12)数字:0 1 2 3 4 5 6 73)基数:84)权:512 64 8 1*/int a = 067; //以0开头的表示8进制System.out.println(a); //55(6个8+7个1)/*小面试题:int a = 068; 正确吗?答:编译错误,因为0开头的表示8进制,8进制最大数字为7*/}
}
补码:
-
计算机处理有符号数(正负数)的一种编码方式
-
以4位2进制为例讲解补码的编码规则:
-
计算机的时候如果超出4位则高位自动溢出舍弃,保持4位不变
-
将4位2进制数分一半作为负数
-
最高位称为符号位,高位为1是负数,高位为0是正数
-
-
规律数:
-
0111为4位补码的最大值,规律是1个0和3个1,可以推导出
-
32位补码的最大值:1个0和31个1---------(01111111111111111111111111111111)
-
-
1000为4位补码的最小值,规律是1个1和3个0,可以推导出
-
32位补码的最小值:1个1和31个0---------(10000000000000000000000000000000)
-
-
1111为4位补码的-1,规律是4个1,可以推导出
-
32位补码的-1:32个1--------------------------(11111111111111111111111111111111)
-
-
-
深入理解负值:
-
记住32位2进制数的-1的编码:32个1
-
负值:用-1减去0位置的权
-
1)11111111111111111111111111111111 = -1
2)11111111111111111111111111111101 = -1-2 = -3
3)11111111111111111111111111111010 = -1-1-4 = -6
4)11111111111111111111111111110111 = -1-8 = -9
5)11111111111111111111111111110101 = -1-2-8 = -11
6)11111111111111111111111111010011 = -1-4-8-32= -45
public class ComplementDemo {public static void main(String[] args) {/*//规律数:int max = Integer.MAX_VALUE; //int的最大值int min = Integer.MIN_VALUE; //int的最小值System.out.println(Integer.toBinaryString(max)); //0111111...System.out.println(Integer.toBinaryString(min)); //1000000...System.out.println(Integer.toBinaryString(-1)); //111111...*/int n = -45;System.out.println(Integer.toBinaryString(n)); //2进制显示System.out.println(n); //10进制显示}
}
File:
-
File类的每一个实例可以表示硬盘中的一个文件或目录,但实际上它只表示一个抽象路径而已,只不过这个路径在硬盘上是真实存在的。
-
使用File可以做到:
-
访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等
-
创建和删除文件或目录
-
-
访问一个目录中的子项
注意:File不能访问文件数据
File的常用方法:
-
getName():获取文件或目录的名称
-
length():获取文件或目录大小
-
isHidden():获取文件或目录是否为隐藏的
-
canRead():获取文件或目录是否为可读的
-
canWrite():获取文件或目录是否为可写的
public class FileDemo {public static void main(String[] args) {//绝对路径:从盘符开始,不利于跨平台(你的硬盘不一定有)//File file = new File("C:/Users/TEDU/IdeaProjects/jsd2302/demo.txt");//相对路径:相对于某个位置开始,有利于跨平台//常用的相对路径有: 1)"./"表示当前目录 2)类加载路径(后期讲)//"./"在Idea执行程序时表达的是当前类所在的项目目录,此处指jsd2302这个目录的位置File file = new File("./demo.txt");String name = file.getName(); //获取file表示的文件或目录的名字System.out.println("name:"+name);//长度为0有两种情况: 1.路径无效 2.确实文件没有内容long len = file.length(); //获取file表示的文件或目录的长度(大小)System.out.println("length:"+len);boolean ih = file.isHidden(); //文件是否是隐藏的boolean cr = file.canRead(); //文件是否可读boolean cw = file.canWrite(); //文件是否可写System.out.println("是否隐藏:"+ih); //falseSystem.out.println("是否可读:"+cr); //trueSystem.out.println("是否可写:"+cw); //true}
}
-
exists():获取文件或目录是否为已存在的
-
createNewFile():创建新文件
public class CreateNewFileDemo {public static void main(String[] args) throws IOException {/*//在当前目录下创建10个文件,名字为test1.txt---test10.txtfor(int i=1;i<=10;i++){File file = new File("./test"+i+".txt");if(!file.exists()){file.createNewFile();}}System.out.println("创建完毕!");*/File file = new File("./test.txt");//判断当前file表示的路径是否存在了对应的文件或目录,若已经存在则返回ture,否则返回falseif(file.exists()){System.out.println("文件已存在");}else{//将file表示的文件真实的创建出来,注意:若要创建文件的目录不存在,则会发生异常//该方法要求处理异常:将光标留在方法上,然后alt+回车,选第一项add exceptionfile.createNewFile();System.out.println("该文件已创建!");}}
}
- mkdir()/mkdirs():创建新目录
public class MkDirDemo {public static void main(String[] args) {//File dir = new File("./a/b/c");File dir = new File("./demo");if(dir.exists()){System.out.println("该目录已存在");}else{//该方法要求你创建的目录所在的目录必须存在,若不存在不会报错,但是也不会进行创建(相当于不执行)//dir.mkdir(); //将File对象表示的目录实际创建出来dir.mkdirs(); //该方法创建目录时会连同将所有不存在的父目录一同创建出来(推荐使用)System.out.println("该目录已创建");}}
}
- delete():删除文件或目录
public class DeleteFileDirDemo {public static void main(String[] args) {//File f = new File("./test.txt"); //文件//File f = new File("./demo"); //删除demo//File f = new File("./a/b/c"); //删除a下的b下的cFile f = new File("./a"); //a目录中有内容,所以不能直接被删除if(f.exists()){f.delete(); //删除file所表示的文件或目录,只能空目录时才能正确删除System.out.println("该文件或目录已删除");}else{System.out.println("该文件或目录不存在");}}
}
-
isFile():获取File对象表示的是否为一个文件且存在
-
isDirectory():获取File对象表示的是否为一个目录且存在
-
listFiles():获取一个目录中的所有子项
public class ListFilesDemo {public static void main(String[] args) {File dir = new File("."); //"."表示当前目录(当前项目路径)/*boolean isFile()判断当前file对象表示的是否为一个文件且已存在boolean isDirectory()判断当前File对象表示的是否为一个目录且已存在*/if(dir.isDirectory()){File[] subs = dir.listFiles(); //获取当前目录下的所有子项System.out.println("当前项目目录下共有"+subs.length+"个子项");for(File sub : subs){System.out.println(sub.getName()); //输出每个子项的名称}}}
}
public class ListFilesDemo2 {public static void main(String[] args) {//仅获取当前项目目录下的所有文本文件(文件名以".txt"结尾)File dir = new File(".");if(dir.isDirectory()){ //如果是一个目录FileFilter filter = new FileFilter() {//重写accept方法就是定义过滤器的接收条件//重写原则:当参数file对象是该过滤器接收的元素时返回true,否则返回falsepublic boolean accept(File file) {String name = file.getName();return name.endsWith(".txt"); //判断是否是以".txt"结尾}};//返回目录中所有满足过滤器要求的子项File[] subs = dir.listFiles(filter);for(File sub : subs){System.out.println(sub.getName());}}}
}
public class ListFilesDemo3 {public static void main(String[] args) {File dir = new File(".");if(dir.isDirectory()){File[] subs = dir.listFiles(file -> file.getName().endsWith(".txt"));for(File sub : subs){System.out.println(sub.getName());}}}
}