一、文件的编码

 1 package com.study.io;
 2 
 3 
 4 /**
 5  * 测试文件编码
 6  */
 7 public class EncodeDemo {
 8 
 9     /**
10      * @param args
11      * @throws Exception 
12      */
13     public static void main(String[] args) throws Exception {
14         String s="好好学习ABC";
15         byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是项目默认的编码(这里为UTF-8)
16         for (byte b : bytes1) {
17             //把字节(转换成了int)以16进制的方式显示
18             System.out.print(Integer.toHexString(b & 0xff)+" ");//& 0xff是为了把前面的24个0去掉只留下后八位
19         }
20         System.out.println();
21         /*utf-8编码中中文占用3个字节,英文占用1个字节*/
22         byte[] bytes2 = s.getBytes("utf-8");//这里会有异常展示,我们就throw这个异常
23         for (byte b : bytes2) {
24             System.out.print(Integer.toHexString(b & 0xff)+" ");
25         }
26         System.out.println();
27         /*gbk编码中文占用2个字节,英文占用1个字节*/
28         byte[] bytes3 = s.getBytes("gbk");//这里会有异常展示,我们就throw这个异常
29         for (byte b : bytes3) {
30             System.out.print(Integer.toHexString(b & 0xff)+" ");
31         }
32         
33         System.out.println();
34         /*utf-16be编码中文占用2个字节,英文占用2个字节*/
35         byte[] bytes4 = s.getBytes("utf-16be");//这里会有异常展示,我们就throw这个异常
36         for (byte b : bytes4) {
37             System.out.print(Integer.toHexString(b & 0xff)+" ");
38         }
39         
40         System.out.println();
41         /*当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码*/
42         String str1=new String(bytes4);//这时会使用项目默认的编码来转换,可能出现乱码
43         System.out.println(str1);
44         //要使用字节序列的编码来进行转换
45         String str2=new String(bytes4,"utf-16be");
46         System.out.println(str2);
47     }
48 }

分析:

* 1. “& 0xff”的解释:
* 0xFF表示的是16进制(十进制是255),表示为二进制就是“11111111”。
* 那么&符表示的是按位数进行与(同为1的时候返回1,否则返回0)

* 2.字节byte与int类型转换:
* Integer.toHexString(b & 0xff)这里先把byte类型的b和0xff进行了运算,然后Integer.toHexString取得了十六进制字符串
* 可以看出b & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b);,将byte强转为int不行吗?答案是不行的.
* 其原因在于:1.byte的大小为8bits而int的大小为32bits;2.java的二进制采用的是补码形式
* Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位。。。。。。
* 所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。

* 3.utf-8编码:中文占用3个字节,英文占用1个字节
* gbk编码:中文占用2个字节,英文占用1个字节
* Java采用双字节编码(就是Java中的一个字符占两个字节)是utf-16be编码。中文占用2个字节,英文占用2个字节
*
* 4.当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码

* 5.文本文件 就是字节序列。可以是任意编码的字节序列。
* 如果我们在中文机器上直接创建文本文件,那么该文件只认识ANSI编码(例如直接在电脑中创建文本文件)

文件传输基础——Java IO流

二、File类的使用

 1 package com.study.io;
 2 
 3 import java.io.File;
 4 
 5 /**
 6  * File类的使用
 7  */
 8 public class FileDemo {
 9     /*java.iO.File类表示文件或目录
10     File类只用于表示文件或目录的信息(名称,大小等),不能用于文件内容的访问。*/
11     public static void main(String[] args) {
12         File file=new File("D:\\111");//创建文件对象时指定目录需要用双斜杠,因为“\”是转义字符
13         /*目录的中间的分隔符可以用双斜杠,也可以用反斜杠,也可以用File.separator设置分隔符*/
14 //        File file1=new File("d:"+File.separator);
15 //        System.out.println(file.exists());//exists()判断文件或文件夹是否存在
16         if(!file.exists()){//如果文件不存在
17             file.mkdir();//创建文件夹mkdir(),还有mkdirs()创建多级目录
18         }else{
19             file.delete();//删除文件或文件夹
20         }
21         //判断是否是一个目录isDirectory,如果是目录返回true,如果不是目录或者目录不存在返回false
22         System.out.println(file.isDirectory());
23         //判断是否是一个文件isFile
24         System.out.println(file.isFile());
25         
26         File file2=new File("D:\\222","123.txt");
27         //常用API:
28         System.out.println(file);//打印的是file.toString()的内容
29         System.out.println(file.getAbsolutePath());//获取绝对路径
30         System.out.println(file.getName());//获取文件名称
31         System.out.println(file2.getName());
32         System.out.println(file.getParent());//获取父级绝对路径
33         System.out.println(file2.getParentFile().getAbsolutePath());
34     }
35 }

运行结果:

文件传输基础——Java IO流

说明:

java.iO.File类表示文件或目录
File类只用于表示文件或目录的信息(名称,大小等),不能用于文件内容的访问。
常用的API:
1.创建File对象:File file=new File(String path);注意:File.seperater();获取系统分隔符,如:“\”.
2.boolean file.exists();是否存在.
3.file.mkdir();或者file.mkdirs();创建目录或多级目录。
4.file.isDirectory()判断是否是目录
file.isFile()判断是否是文件。
5.file.delete();删除文件或目录。
6.file.createNewFile();创建新文件。
7.file.getName()获取文件名称或目录绝对路径。
8.file.getAbsolutePath()获取绝对路径。
9.file.getParent();获取父级绝对路径。

 ❤❤1、遍历目录

 1 package com.study.io;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 
 6 /**
 7  * File工具类
 8  * 列出File类的常用操作,比如:过滤、遍历等操作
 9  */
10 public class FileUtils {
11     /**
12      * 列出指定目录下(包括其子目录)的所有文件
13      * @param dir
14      * @throws IOException
15      */
16     public static void listDirectory(File dir) throws IOException{
17         if(!dir.exists()){//exists()方法用于判断文件或目录是否存在
18             throw new IllegalArgumentException("目录:"+dir+"不存在");
19         }
20         if(!dir.isDirectory()){//isDirectory()方法用于判断File类的对象是否是目录
21             throw new IllegalArgumentException(dir+"不是目录");
22         }
23         /*String[] fileNames = dir.list();//list()方法用于列出当前目录下的子目录和文件(直接是子目录的名称,不包含子目录下的内容),返回的是字符串数组
24         for (String string : fileNames) {
25             System.out.println(string);
26         }*/
27         
28         //如果要遍历子目录下的内容就需要构造成File对象做递归操作,File提供了直接返回File对象的API
29         File[] listFiles = dir.listFiles();//返回的是直接子目录(文件)的抽象
30         if(listFiles !=null && listFiles.length >0){
31             for (File file : listFiles) {
32                 /*System.out.println(file);*/
33                 if(file.isDirectory()){
34                     //递归
35                     listDirectory(file);
36                 }else{
37                     System.out.println(file);
38                 }
39             }
40         }
41     }
42 }

测试类:

1 public class FileUtilsTest1 {
2     public static void main(String[] args) throws IOException {
3         FileUtils.listDirectory(new File("D:\\ioStudy"));
4     }
5 }

运行结果:

文件传输基础——Java IO流

三、RandomAccessFile类的使用

RandomAccessFile:java提供的对文件内容的访问,既可以读文件,也可以写文件。
RandomAccessFile支持随机访问文件,可以访问文件的任意位置。

注意 Java文件的模型:

文件传输基础——Java IO流

示例代码:

 1 package com.study.io;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.io.RandomAccessFile;
 6 import java.util.Arrays;
 7 
 8 
 9 /**
10  * RandomAccessFile
11  */
12 public class RandomAccessFileDemo {
13     public static void main(String[] args) throws IOException{
14         File demo = new File("demo");
15         if(!demo.exists()){
16          demo.mkdir();
17         }
18         File file = new File(demo,"raf.dat");
19         if(!file.exists()){
20          file.createNewFile();
21         }
22         
23         RandomAccessFile raf = new RandomAccessFile(file, "rw");
24         //指针的位置
25         System.out.println(raf.getFilePointer());
26         
27         raf.write('A');//只写了一个字节
28         System.out.println(raf.getFilePointer());
29         raf.write('B');
30         
31         int i = 0x7fffffff;
32         //用write方法每次只能写一个字节,如果要把i写进去就得写4次
33         raf.write(i >>> 24);//高8位
34         raf.write(i >>> 16);
35         raf.write(i >>> 8);
36         raf.write(i);
37         System.out.println(raf.getFilePointer());
38         
39         //可以直接写一个int
40         raf.writeInt(i);
41         
42         String s = "中";
43         byte[] gbk = s.getBytes("gbk");
44         raf.write(gbk);
45         System.out.println(raf.length());
46         
47         //读文件,必须把指针移到头部
48         raf.seek(0);
49         //一次性读取,把文件中的内容都读到字节数组中
50         byte[] buf = new byte[(int)raf.length()];
51         raf.read(buf);
52         
53         System.out.println(Arrays.toString(buf));
54            for (byte b : buf) {
55          System.out.println(Integer.toHexString(b & 0xff)+" ");
56         }
57            raf.close();
58     }
59 }

运行结果:

0
1
6
12
[65, 66, 127, -1, -1, -1, 127, -1, -1, -1, -42, -48]
41 
42 
7f 
ff 
ff 
ff 
7f 
ff 
ff 
ff 
d6 
d0 
View Code

相关文章: