一编码问题
计算机的编码问题
1)在一个IO文件下建立三个文本文件,第一个文件名是联想,内容也是联想;第二个文件名是联通,内容也是联
通;第三个文件名是联,内容也是联。
2)依次打开三个文件,会发现名称叫做联的文件和名称叫做联通的文件中的内容都是乱码,而名称叫做联想的文
件中的内容却是正常显示。
3)我们在建立文本文件的时候并没有指定编码格式,而是采用默认的编码格式,一般计算机系统采用的默认编码
格式是ANSI编码,也有其他的编码格式,比如GB2312和UTF-8,都是我们常用的编码格式。我们可以从这点下手,
找到上述三个文件在保存时都是以何种编码格式存储的,我们发现乱码的两个文件的编码格式为
UTF-8,而正常显示的编码格式为ANSI编码格式。
4)实例代码:
public class EncodeDemo{ public static void main(String[] args) throws Exception{ String s="IT行业"; //转换成字节序列用的是项目默认的编码ANSI byte[] bytes1=s.getBytes(); for(byte b:bytes1){ //把字节转换成了int以16进制的方式显示 System.out.print(Integer.toHexString(b & 0xff)+" "); } System.out.println(); byte[] bytes2=s.getBytes("gbk"); //gbk编码中文占用2个字节,英文占用1个字节 for(byte b:bytes2){ System.out.print(Integer.toHexString(b & 0xff)+" "); } System.out.println(); byte[] bytes3=s.getBytes("utf-8"); //utf-8编码中文占用3个字节,英文占用1个字节 for(byte b:bytes3){ System.out.print(Integer.toHexString(b & 0xff)+" "); } //Java是双字节编码utf-16be System.out.println(); byte[] bytes4=s.getBytes("utf-16be"); //utf-16be编码中文占用2个字节,英文占用2个字节 for(byte b:bytes4){ System.out.print(Integer.toHexString(b & 0xff)+" "); } System.out.println(); /*当你的字节序列是某种编码时,这个时候想把字节序列变成字符串 *也需要用这种编码方式,否则会出现乱码 */ String str1=new String(bytes4); System.out.print(str1); String str2=new String(bytes4,"utf-16be"); System.out.print(str2); /*文本文件就是字节序列,可以是任意编码的字节序列 *如果我们在中文机器上直接创建文本文件,那么该文本文件只认识ANSI编码 *联通、联这是一种巧合,它们正好符合了utf-8编码的规则 */ } }
运行结果:
5)因此我们得出了,中文操作系统下,ANSI编码代表GBK编码,gbk编码中文占用2个字节,英文占用1个字节;
utf-8编码中文占用3个字节,英文占用1个字节;这样的话,我们可以查看创建的文本文件的字节大小。
二File类的使用
java.io.File类用于表示文件(或者目录),File类只用于表示文件(或者目录)的信息(名称、大小等),不能用于文件内
容的访问。
File类中的字段有:
File类的构造方法有:
File类的方法有:
(1)创建目录
实例代码:
import java.io.*; public class FileDemo { public static void main(String[] args) { //了解构造函数的情况查帮助 File file = new File("E:\\Java\\JavaSE\\IO\\File"); //判断文件是否存在,不存在立即创建;存在的话立刻删除 if(!file.exists()){ file.mkdir(); //file.mkdirs(); }else{ file.delete(); } //是否是一个目录,如果是目录返回true,如果不是目录或者目录不存在返回的是false System.out.println(file.isDirectory()); //是否是一个文件 System.out.println(file.isFile()); //File file2 = new File("E:\\Java\\JavaSE\\IO日记1.txt"); File file2 = new File("E:\\Java\\JavaSE\\IO","日记1.txt"); if(!file2.exists()){ try{ file2.createNewFile(); }catch(IOException e) { e.printStackTrace(); } }else{ file2.delete(); } //常用的File对象的API System.out.println(file);//file.toString()的内容 System.out.println(file.getAbsolutePath()); System.out.println(file.getName()); System.out.println(file2.getName()); System.out.println(file.getParent()); System.out.println(file2.getParent()); System.out.println(file.getParentFile().getAbsolutePath()); } }
运行结果:
运行之前:
运行之后:
(2)遍历目录
实例代码1:
import java.io.*; //列出File的一些常用操作,比如过滤、遍历等操作 public class FileUtils{ public static void listDirectory(File dir) throws IOException{ //列出指定目录下(包括其子目录)的所有文件 if(!dir.exists()){ throw new IllegalArgumentException("目录:"+dir+"不存在"); } if(!dir.isDirectory()){ throw new IllegalArgumentException(dir+"不是目录"); } //打印文件名称 //返回的是字符串数组,直接是子目录的名称,不包含子目录下的内容 String[] filenames= dir.list(); for(String string:filenames){ System.out.println(string); } System.out.println(); //打印绝对路径 for(String string:filenames){ System.out.println(dir+"\\"+string); } } public static void main(String[] args) throws IOException{ FileUtils.listDirectory(new File("E:\\Java\\JavaSE\\IO")); } }
运行结果:
实例代码2:
import java.io.*; //列出File的一些常用操作,比如过滤、遍历等操作 public class FileUtils{ public static void listDirectory(File dir) throws IOException{ //列出指定目录下(包括其子目录)的所有文件 if(!dir.exists()){ throw new IllegalArgumentException("目录:"+dir+"不存在"); } if(!dir.isDirectory()){ throw new IllegalArgumentException(dir+"不是目录"); } //如果想要遍历子目录下的内容就要构造成File对象做递归操作,File提供了直接返回File对象的API File[] files=dir.listFiles();//返回的是直接子目录(文件)的抽象 if(files!=null&&files.length>0){ for(File file:files){ if(file.isDirectory()){ //递归操作 listDirectory(file); }else{ System.out.println(file); } } } } public static void main(String[] args) throws IOException{ FileUtils.listDirectory(new File("E:\\Java\\JavaSE\\IO")); } }
运行结果: