您的位置:首页 > 编程语言 > Java开发

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: