JAVA IO流

来源:互联网 发布:选择网络项目的标准 编辑:程序博客网 时间:2024/05/23 01:23

JAVA IO流

本文属于自己学习记录,本人新人一枚,欢迎纠正错误和参与讨论
创建于2015年8月24日

1、文件的编码
编码的格式有很多种,比如最常见的ANSI、Unicode、UTF-8、GBK、UTF-16be等等。每种不同的编码都有自己不同的规则。

在JAVA中字符的编码格式是UTF-16be

我们来看看不同的编码格式的字节储存形式

1.1、先定义一个String类型字符串(GBK)

String s = "天气好ABC";

1.2、把s放入字节数组,因为字符串s是有多个字节组成,所以放在字节数组中保存

byte[] byte1 = s.getBytes();//转换成字节序列用的是项目默认的编码GBK

也可以手动设置存储编码格式

byte[] byte1 = s.getBytes("GBK");//转换成字节序列用的是项目默认的编码GBK

1.3、循环输出字节数组的内容

for(byte b:byte1){            //把字节(转换成了int类型)以16进制的方式显示            //与0xff相与,保留了低八位,也就是一个字节            System.out.print(Integer.toHexString(b & 0xff) + " ");        }

可以看出“天气好ABC”在这里占用了9个字节,平均分配的话每个汉字是占用了两个字节,英文则占用一个字节。也就是说GBK编码中文占两个字节,英文占一个字节。

2.1、同样定义一个String类型字符串(UTF-8)

String s = "天气好ABC";

2.2、把s放入字节数组,以UTF-8的格式放入字节数组

byte[] byte3 = s.getBytes("utf-8");

2.3、循环输出字节数组的内容

for(byte b:byte3){            System.out.print(Integer.toHexString(b & 0xff) + " ");        }

2.4、以GBK格式输出和以UTF-8格式输出都会出现什么情况

        String str3 = new String(byte3);//默认为GBK,运行会乱码        String str4 = new String(byte3,"utf-8");//修改为utf-8        System.out.print(str3 + "   ");        System.out.println(str4);
运行结果:澶╂皵濂紸BC   天气好ABC

可以看出“天气好ABC”在这里占用了12个字节,平均分配的话每个汉字是占用了三个字节,英文则占用一个字节。也就是说GBK编码中文占三个字节,英文占一个字节。并且,以什么编码写入字节数组就必须以相同的编码写出,否则会乱码。

2、File类的使用
在JAVA中File既可以表示文件夹,又可以表示一个文件。

判断一个文件或文件夹是否存在方法:
1.1、new一个File对象并指定其目录名或文件名

        //File可以是文件,可以是文件夹        //必须用双\,这里的第一个\表示 转义字符        File file = new File("C:\\javaio");

1.2、判断文件或者文件是否存在,存在则创建目录,不存在则删除目录

        //file.exists()判断文件/文件夹是否存在        //如果文件不存在,则创建目录,否则删除目录        if(!file.exists()){            file.mkdir();        }else{            file.delete();        }

1.3、判断

        //判断是否是一个目录,是则true,否则false,目录不存在也返回false        System.out.println(file.isDirectory());        //判断是否是一个文件,是则true,都则false,文件不存在也返回false        System.out.println(file.isFile());
运行结果:truefalse

2.1、new一个File对象并指定其目录名或文件名,然后判断等等,过程与上一个没区别

        File file2 = new File("C:\\javaio\\1.txt");        if(!file2.exists()){            file2.createNewFile();        }else{            file2.delete();        }
    //常用对象API        System.out.println(file);//打印的是file.toString()的内容        System.out.println(file.getAbsolutePath());//打印的是抽象路径        System.out.println(file.getName());//打印目录名        System.out.println(file.getParent());//获取当前对象的父目录        System.out.println();        System.out.println(file2);//打印的是file.toString()的内容        System.out.println(file2.getAbsolutePath());//打印的是抽象路径        System.out.println(file2.getName());//打印文件名        System.out.println(file2.getParent());//获取当前对象的父目录

3、查找当前文件夹下的所有的文件,包括子目录中的文件

public static void listDirectory(File dir)throws IOException{        //判断文件或文件夹是否存在        if(!dir.exists()){            throw new IllegalArgumentException("目录:"+ dir + "不存在。");        }        //判断是否是目录        if(!dir.isDirectory()){            throw new IllegalArgumentException(dir + "不是目录。");        }        //list()方法用于列出当前目录下的子目录和文件 //      String[] filenames = dir.list();//返回字符串数组 返回的是子名称,不包含子目录下的内容//      for(String s:filenames){//          System.out.println(s);//      }        //如果要遍历子目录下的内容就需要构造成File对象做递归操作,File提供了直接返回对象的API        File[] file = dir.listFiles();//返回的是直接子目录(文件)的抽象        //此循环意在找出所有目录下的所有文件        //判断file数组不为空,数组的长度大于0,也就是判断数组里是否存在文件夹或文件        //如果满足条件往下走        if(file != null && file.length > 0){            //循环所有的File对象            for(File f:file){                //判断当前file是否是一个目录,如果是,则递归调用自己                if(f.isDirectory()){                    listDirectory(f);                }else{                    //否则直接输出文件名                    System.out.println(f);                }            }        }    }

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

RandomAccessFile五大要点
(1)JAVA文件模型
在硬盘上的文件是以byte byte byte形式存储的,是数据的集合

(2)打开文件
有两种模式 ①”rw”(读写) ②”r”(只读)
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
文件指针,打开文件时指针在开头 pointer = 0;

(3)写方法
raf.write(int)–>只写一个字节(后8位),同时指针指向下一个位置,准备 再次 写入

(4)读方法
int b = raf.read()–>读一个字节

(5)文件读写完以后一定要关闭,否则会出现意想不到的问题,至于是什么,三个字, 不知道(Oracle官方说明)

RandomAccessFile读写的具体操作

public static void main(String[] args)throws IOException {        //定义一个目录        File demo = new File("demo");//如果是相对路径则会在项目中创建文件或者文件夹        //如果此demo不存在,则创建出来        if(!demo.exists()){            demo.mkdir();        }        //定义一个文件        File file = new File(demo,"raf.txt");        if(!file.exists()){            file.createNewFile();        }        RandomAccessFile raf = new RandomAccessFile(file, "rw");        //指针的位置        System.out.println(raf.getFilePointer());        raf.write('A');//写入的是char类型,char占两个字节,但是这个地方只写入了一个字节,写入了后8位        System.out.println(raf.getFilePointer());        raf.write('B');//写入的是char类型,char占两个字节,但是这个地方只写入了一个字节,写入了后8位        System.out.println(raf.getFilePointer());        int i = 0x7fffffff;        //用write方法每次只能写入一个字节,如果要把i写进去那就得写四次        raf.write(i >>> 24);//写入了32位到25位        raf.write(i >>> 16);//写入了24位到17位        raf.write(i >>> 8);//写入了16位到9位        raf.write(i);//写入了8位到1位        System.out.println(raf.getFilePointer());        //可以直接写一个int类型        raf.writeInt(i);        System.out.println(Integer.toString(i));        //写入一个中文        String s = "中";        byte[] byte1 = s.getBytes("GBK");        raf.write(byte1);        System.out.println(raf.getFilePointer());        //读文件,必须把指针移到头部        raf.seek(0);        //一次性读取,把文件中的内容都读到字节数组中        byte[] buf = new byte[(int)raf.length()];        raf.read(buf);        System.out.println(Arrays.toString(buf));        String s1 = new String(buf,"GBK");        System.out.println(s1);        raf.seek(10);        byte[] buf1 = new byte[2];        raf.read(buf1);        System.out.println(Arrays.toString(buf1));        String s2 = new String(buf1,"GBK");        System.out.println(s2);        raf.close();    }
1 0
原创粉丝点击