java之文件操作

参考廖雪峰

学习文件会和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);
posted @ 2020-06-11 16:15  make_wheels  阅读(240)  评论(0)    收藏  举报