参考廖雪峰
学习文件会和C++里面的简单对比下
File
代表了文件这一存储概念
File file = new File("/data/data/com.example.myapplication");
传递给File的路径可以存在可以不存在
可以传递目录
可以使用listFiles得到当前目录、子目录下的所有文件
可以主动使用file.createNewFile()创建文件,file.delete()删除文件
使用File操作一些文件的路径获取,名称获取等操作
InputStream 读取文件
java文件操作一般都要考虑异常出现,当读取文件或者操作文件产生异常,也要保证打开的文件能够被关闭
使用 try catch finally,在finally里面进行文件的关闭,即使catch里面有return,finally还是会被执行
###常用方法 读取文件
InputStream input = null;
try{
input = new FileInputStream("aa.txt");
}
catch (FileNotFoundException e) {
System.out.println("File Name is Null");
}
这里面传入File和直接传入路径都是可以的,内部实现都是一样的
###读单个字节
int n = 0;
try{
while((n = input.read()) != -1) {
System.out.println(n);
}
}
catch (IOException e) {
System.out.println("input.read() error");
}
finally {
try{
if (input != null)
{
input.close();
}
}
catch (IOException e) {
System.out.println("input.close() error");
}
}
注意异常的处理,read内部操作是使用byte数组实现的,所以读取的就是一个一个字节
读取多个字节
int read(byte[] b):读取若干字节并填充到byte[]数组,返回读取的字节数
int read(byte[] b, int off, int len):指定byte[]数组的偏移量和最大填充数
同样的返回为-1,代表读取结束
偏移量指的是从byte数组的第几个开始填充,注意这个偏移量针对传入的byte数组而言的,从byte的哪里开始写
read()是同步方法,阻塞的
当我们写了一个操作文件的一系列函数
可以通过
InputStream input = null;
byte[] data = { 72, 101, 108, 108, 111, 33 };
input = new ByteArrayInputStream(data);
然后正常读写操作,可以用这种方式,模拟一个文件读取
写文件
###打开文件
OutputStream input = null;
try{
input = new FileOutputStream("/data/data/com.Test.test/aa.txt");
}
catch (FileNotFoundException e) {
System.out.println("File Name is Null");
}
当文件不存在,创建一个文件
###写
注意的是写也是字节为单位,如果你使用int但是超过了byte,那么取的也是int的最后一个字节,使用 xx&0xFF
说一个flush方法,这个是强制把缓冲区内容写入文件中,不同系统有针对内存的不一样处理,方式,不缓存、行缓存、页缓存,只有缓存区满了才会把内容写入文件,一般不用
对于网络聊天,这个强制就有用了,因为接收方要时时看到内容
使用缓冲区的目的为了效率
InputStream读字节,也会把一部分内容读取到一个缓存区,然后指针指向这个缓存区,每次read就移动指针,同样为了效率
写一个字节
try {
output.write('a');
}
catch (IOException e) {
System.out.println("IOException is Error");
}
finally {
try {
output.close();
}
catch (IOException e) {
System.out.println("IOException is Error");
}
}
写多个字节,字符串
output.write("Hello".getBytes("UTF-8"));
ByteArrayOutputStream使用方法和上面的类似,也可以当作实验
write也是阻塞的
如果想要一开始在末尾写入呢
input = new FileOutputStream("/data/data/com.Test.test/aa.txt");
可以有第二个参数,append为true,就是从末尾开始写入
input = new FileOutputStream("/data/data/com.Test.test/aa.txt", true);