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(); }
- JAVA【IO一】IO流
- Java-IO-java的IO流
- java IO 流
- JAVA之IO流
- java IO(字符流)
- java的io流
- JAVA之IO流(
- JAVA 基础IO流
- JAVA 中的IO流
- Java IO 流学习
- JAVA 中的IO流
- Java IO流操作方法。。
- java io流总结
- 转]JAVA IO流
- JAVA IO流
- Java中的IO流
- JAVA IO 流操作
- 详述JAVA IO流
- 第35章:使用xml文件定义菜单(Menu)并设置监听事件
- PupopWindow第一次弹出后点击触发外框触发其他控件事件
- 免费DUMP分析服务
- win7 便签损坏
- viewPage notifyDataSetChanged无刷新解决方案之一
- JAVA IO流
- HDU 2523 hash排序
- 设置某一个Activity为单例模式无法接收到onActivityResult
- package.path和package.cpath
- Unity3D NGUI屏幕摇杆
- Android Overview Screen -- 概览界面
- hdu 5420 Victor and Proposition(强连通+线段树建图)
- HDU 1872 排序
- Ubuntu Server配置wireless连接WPA2网络(interfaces)