JavaSE入门学习42:文件传输基础之I/O流(一)

时间:2023-02-15 00:26:21

       一编码问题

       计算机的编码问题

       1)在一个IO文件下建立三个文本文件,第一个文件名是联想,内容也是联想;第二个文件名是联通,内容也是联

通;第三个文件名是联,内容也是联。

JavaSE入门学习42:文件传输基础之I/O流(一)

       2)依次打开三个文件,会发现名称叫做联的文件和名称叫做联通的文件中的内容都是乱码,而名称叫做联想的文

件中的内容却是正常显示。

JavaSE入门学习42:文件传输基础之I/O流(一)

      3)我们在建立文本文件的时候并没有指定编码格式,而是采用默认的编码格式,一般计算机系统采用的默认编码

格式是ANSI编码,也有其他的编码格式,比如GB2312和UTF-8,都是我们常用的编码格式。我们可以从这点下手,

找到上述三个文件在保存时都是以何种编码格式存储的,我们发现乱码的两个文件的编码格式为

UTF-8,而正常显示的编码格式为ANSI编码格式。

JavaSE入门学习42:文件传输基础之I/O流(一)

JavaSE入门学习42:文件传输基础之I/O流(一)

       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编码的规则
        */
    }
}

       运行结果:

JavaSE入门学习42:文件传输基础之I/O流(一)

       5)因此我们得出了,中文操作系统下,ANSI编码代表GBK编码,gbk编码中文占用2个字节,英文占用1个字节;

utf-8编码中文占用3个字节,英文占用1个字节;这样的话,我们可以查看创建的文本文件的字节大小。

JavaSE入门学习42:文件传输基础之I/O流(一)

       二File类的使用

       java.io.File类用于表示文件(或者目录),File类只用于表示文件(或者目录)的信息(名称、大小等),不能用于文件内

容的访问。

       File类中的字段有:

JavaSE入门学习42:文件传输基础之I/O流(一)

       File类的构造方法有:

JavaSE入门学习42:文件传输基础之I/O流(一)

       File类的方法有:

JavaSE入门学习42:文件传输基础之I/O流(一)

JavaSE入门学习42:文件传输基础之I/O流(一)

JavaSE入门学习42:文件传输基础之I/O流(一)

JavaSE入门学习42:文件传输基础之I/O流(一)

       (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());
	}
}

        运行结果:

        运行之前:

JavaSE入门学习42:文件传输基础之I/O流(一)

         运行之后:

JavaSE入门学习42:文件传输基础之I/O流(一)

         (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"));
   }
}

         运行结果:

JavaSE入门学习42:文件传输基础之I/O流(一)

        实例代码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"));
   }
}

        运行结果:

JavaSE入门学习42:文件传输基础之I/O流(一)