一编码问题
计算机的编码问题
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"));
}
}
运行结果: