IO处理
编码
GBK编码: 中文占用两个字节,英文占用1个字节
UTF-8编码: 中文占用 3个字节,英文占用1个字节
Java时双字节编码: utf-16be
UTF-16be: 中文占用2个字节,英文占用2个字节
注意:
当你的字节序列时某种编码时,这个时候想把字节序列编程字符串,也需要用这种编码方式,否则会出现乱码
文本文件:就是字节序列
可以是任意编码的字节序列
如果我们在中文机器上直接创建文本文件,那么该文本文件只认识ANSI编码
联通\联这是一种巧合.正好复合utf-8编码规则
File类
java.io.File类用于表示文件(目录)
File类只用于表示文件(目录)的信息(名称,大小等) 不能用于访问文件内容
常用API
fileObj.exist() 判断文件/文件夹是否存在。
fileObj.delete() 删除文件/文件夹。
File.separator 设置分隔符。(\或/)
fileObj.isFile() 判断是否为文件。(若文件不存在,也返回false)
fileObj.createNewFile() 创建文件。
fileObj.getAbsolutePath() 返回绝对路径。
fileObj.getName() 返回文件/目录的名字。
fileObj.getParent() 返回父目录路径。
fileObj.length()获取文件的大小(字节数),如果文件不存在返回0L,如果是文件夹也返回OL
fileObj.lastModified()获取最后一次修改的时间。
fileObj.isHidden()是否是一个隐藏的文件或是否是隐藏的目录。
还有更多API请参考手册!
注意:
相对路径是相对与工程目录,和Java文件位置无关.
Java.io 默认定位到 工程根目录.
列出文件以及文件夹
删除文件
删除文件夹
RandomAccessFile类
Java提供的对文件内容的访问,既可以读文件也可以写文件
可以访问文件的任意位置.
Java文件模型
在硬盘上的文件是 byte byte byte 存储的,是数据的集合
打开文件
model各个参数详解
* r 代表以只读方式打开指定文件
* rw 以读写方式打开指定文件
* rws 读写方式打开,并对内容或元数据都同步写入底层存储设备
* rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备
写数据数据
读取数据
一次性完全读取数据,适用于数据量小:
分开读取,适用于数据量大:
一次读一行
复制文件
IO
概念
IO理解为IN和OUT ,即输入与输出.
所以,IO体系的基本功能就是:读和写
IO流
作用: 读写设备上的数据,硬盘文件,内存,键盘,网络…
字节流与字符流
字节流可以处理所有类型数据,如MP3,图片,文字,视频等,读到一个字节就返回一个字节.
在Java中对应的类都以"Stream" 结尾
字符流仅能够处理文本数据,如TXT文本.在读取时读到一个或多个字节先查找指定的编码表,然后将查到的字符返回.
在Java中对应的类都以 “Reader” 或 “Writer” 结尾
流的分类
(1)按照数据流方向不同分为输出流和输出流
(2)按照处理单位不同,可以分为字节流和字符流
(3)按照功能不同可以分为节点流和处理流
说明:
输入:站在程序的角度,有数据读取到程序中
输出:也是站在程序的角度,有数据从程序中输出
节点流:直接从数据源读写数据的流
处理流:连接在已经存在的流(节点流或者处理流)之上的流,说白了就是包裹在别的流上面的流。
四大抽象流类
java中所有的流,都分别继承自以下四种抽象流类
基本操作方法
InputStream的基本方法
read():读取字节,如果返回-1,说明已经读取完毕
close():关闭流
OutputStream基本方法
void write(int b):写入一个字节数据,该字节数据为参数b的低8位。
void write(byte[] b):写入一个字节数组
close():关闭流
void flush():将输出流中的缓存数据全部全部写出到目的地。应该在close()前,调用一下该方法。
Reader的基本方法
int read():读取一个字符,如果返回-1,则说明读取完毕。
close():关闭流
Writer基本方法
void write(int c):写入一个字符数据
close():关闭流
flush():同理在close之前应该调用一下该方法。
具体自己查看API文档。
流的层次
读取文字
写入文字
复制图片
截取音乐
File file = new File("C:\\\\Users\\\\wangs\\\\Desktop\\\\声音玩具 - 你的城市.mp3");
File file1 = new File("./sywj.mp3");//输入流
InputStream inputStream = new FileInputStream(file);//输出流
FileOutputStream fileOutputStream = new FileOutputStream(file1,true);
//起始位置: 比特率*时间*1024/8 => 320*20*1024/8
//20秒开始int start = 320*20*1024/8;//120秒结束int end = 320*120*1024/8;
byte[] bytes = new byte[1024];
int hasRead = 0;
int readTotal = 0;
//读取
while ((hasRead = inputStream.read(bytes)) > 0){
readTotal += hasRead;
if(readTotal < start){
//小于起始位置就直接重新开始
continue;
}
if (readTotal > end){
//大于结束位置,直接 结束
break;
}
//写入
fileOutputStream.write(bytes,0,hasRead);
}
//关闭
inputStream.close();fileOutputStream.close();