JAVA IO流
2015-08-25 02:07
489 查看
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());
运行结果: true false
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(); }
相关文章推荐
- 【JavaMail开发总结】注意事项
- import 简化Spring 配置文件
- java字符与对应Ascii码互转
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
- eclipse新建maven web项目流程
- SSH整合配置文件之spring篇
- eclipse引入js总是报错原因
- Spring管理 hibernate 事务配置的五种方式
- spring命名空间
- spring 引用其他bean
- thinkinginjava学习笔记01_导论
- java三元运算符详解
- spring 配置bean的方法及依赖注入发方式
- [Java Concurrency in Practice]第六章 任务执行
- Java泛型总结(转)
- Java 类加载机制 ClassLoder
- Java 类加载机制 ClassLoder
- Java 类加载机制 ClassLoder
- java之 ------ DAO设计模式的【详解】及常见设计模式的【应用】
- Java序列化Serializable和Externalizable