IO输入输出文件

1:计算机的存储单位

      位  bit 表示0-1  计算机的最小存储单位是字节Byte 由8位组成    我们存储数据的二进制流的单位就是字节

      由8位组成  0-255  

       KB    MB  GB  TB  进制都是1024

      char 基本数据类型  字符型数据  占用两个字节。 a  c  3  4  汉字  他都是分配两个字节 比较耗费资源

       比如 :文件的读取  不是汉子  这个时候字母数据  一个字节就可以表示    但是汉字必须用两个字节表示

                   如果字节读取就会导致乱码,因为汉字需要两个字节来识别自己     按字节读取会导致字符信息丢失

                   一般图片视频都是字节读取  但是文本读取(自读读起来比较慢)

     

2:File类就是存储介质中的文件和目录   存储介质 硬盘 U盘 光盘 

      File类定义了一系列操作文件和目录的方法, 目录创建  删除

      File file1 = new File(path8, "bbb11");  该api只是创建了一个File对象,他不会直接在介质中    需要调用相关api才可以

      createNewFile 创建文件 mkdir创建文件夹  

       file1.exists()  判断文件对象是否在介质中已经存在   所以我们在创建目录或者文件的时候  一定要先判断其是否已经在介质

      上存在,

      file1.lastModified()  获取文件最后的修改事件  就是所谓的时间戳

      file1.length()    最小单位就是Byte  字节   多少个字节

      String[] strs=file1.list();    返回的就是File的名称的集合

      File[] files=file1.listFiles();  返回的就是File对象的集合

      File.separator  在windows系统为\\  在linux系统是/  实现跨平台所以用它

      file1.delete()   注意File在删除的时候,文件可以直接删除  但是目录   务必注意必须是空目录才可以直接删除

                             所以我们在做删除操作的时候,务必要迭代判断目录是否为空  然后执行删除操作。

       

FilenameFilter  文件过滤器,过滤得到我们想要的File

 

3:流详解

      上面讲了file文件  就类似于水池子  就是一个容器,流就是工具,进水有进水管  出水有出水管     

       进水管和出水管还分很多种   用瓢  盆

       数据流的方向分为  输入流  输出流。

       按传输单位分为字节流 字符流。

       InputStream   OutputStream   Reader  Writer

       

 

 

 

1:流概念

https://blog.csdn.net/Yue_Chen/article/details/72772445

流分类:,输入流  输出流    字节  字符

InputStream   Reader   OutputStream   Writer

Reader 作用就是读文件

Writer作用就是写文件

 字符流只可以处理字符   但是处理字符比较快

字节流 可以处理所有以bit为单位存储的文件,但是在处理字符上速度比不上字符流 

FileInputStream     FileOutputStream

总体详解:

字符编码里面融合了编码表,系统一般使用GBK

字符流一般处理文本数据,字节流处理多媒体数据。

字符流读写注意事项:

1:写入文件后必须要flush()刷新操作

2:用完后流记得要关闭

3:使用流对象要抛io异常

4:创建文件的时候,如果已经存在同名文件将会被覆盖  所以一般要判断是否存在同名文件

5:在读取一个文件的时候要保证该文件是存在的。

字节流:

1:字节流可以不用刷新流操作,

2:InputStream  特有方法,available  返回文件中的字节个数

细节:

1:一般视频音频图片都用字节流

2:一个字节是8位

3:FileInputStream   read()(默认读取一个字节)  read(byte[])(读取多个字节)  

      read(byte[],int off,int length) 读取多个字节,off表示指定字节数组开始保存数据的起始下标,len表示读取字节数目。

     close()释放资源  注意io操作会很消耗资源 

      inputStream和OutputStream是抽象类

4:FileOutputStream(String fileName,boolean append) 第二个参数是控制我们在写入数据的时候是否将已经存在的数        据给清空

5:注意  为了保证流被关闭  我们一般将流关闭操作放在finally代码块里面

6:注意  字符流输入流读取 read返回的是一个int类型的值,如果想获取字符就应该进行强制类型转换。

7:注意  进行流转换时只可以针对文本文件的字节流进行转换,如果字节流操作的是一张图片,此时转换为

     字符流就会导致数据丢失。

常用操作字符字节的对象如下:

FileInputStream  FileOutputStream   FileReader  FileWriter

BufferReader  BufferWriter (带缓冲区的字符流)   提高效率。

BufferedInputStream  BufferedOutputStream

实例化缓冲流对象:是将流对象传递进去

BufferInputStream bin=new BufferInputStream(new FileInputStream(“demo.txt”));

InputStreamReader   OutputStreamWriter

 

 

相关api如下:

 

   FileInputStream fileInputStream = null;
try {
    //一个个字节的读取文件  到结尾返回值为-1
    fileInputStream.read();
    //多字节读取文件  返回值就是我们读取了几个字节的数据
    byte[]a=new byte[1024];
    fileInputStream.read(a);
    fileInputStream.read(byte b[], int off, int len);
    //关闭流和释放一些资源
    fileInputStream.close();
    //跳过流中n个字节的数据
    fileInputStream.skip(long n);
} catch (IOException e) {
    e.printStackTrace();
}

FileOutputStream fileOutputStream;
//逐字节写入数据
fileOutputStream.write(int b);
//字节数组的方式写入数据
fileOutputStream.write(byte b[]);
//取字节数组中若干位字节写入
fileOutputStream.write(byte b[], int off, int len);
//关闭流和释放一些资源
fileOutputStream.close();
//一般在写入文件结束调用刷新操作
fileOutputStream.flush();

注意  我们这地方读取到的是字节  如果需要转化为字符串  还需要借助

String  str=new String();  将byte转化为字符串。

FileReader和FileWriter

 

FileReader fileReader=new FileReader(String fileName);
FileReader fileReader=new FileReader(File file);
//逐个字符读取  返回的就是对应的字符
fileReader.read();
//注意  这个是字符数组
fileReader.read(char cbuf[], int offset, int length);
fileReader.getEncoding();
fileReader.skip(long a)
fileReader.close();

FileWriter fileWriter=new FileWriter(String filename);
FileWriter fileWriter=new FileWriter(String filename,boolean isadd);
FileWriter fileWriter=new FileWriter(File file);
FileWriter fileWriter=new FileWriter(File file,boolean isadd);
fileWriter.write();
fileWriter.append(CharSequence csq);
fileWriter.getEncoding();
fileWriter.append(char c);
fileWriter.flush();

 

class BufferedReaderDemo {  
    public static void main(String[] args)  throws IOException {  
  
        //创建一个字符读取流流对象,和文件关联  
        FileReader rw = new FileReader("buf.txt");  
  
        //只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可  
        BufferedReader brw = new BufferedReader(rw);  
  
          
        for(;;) {  
            String s = brw.readLine();  
            if(s==null) break;  
            System.out.println(s);  
        }  
          
        brw.close();//关闭输入流对象  
  
    }  
}  

 

class BufferedWriterDemo {  
    public static void main(String[] args)  throws IOException {  
  
        //创建一个字符写入流对象  
        FileWriter fw = new FileWriter("buf.txt");  
  
        //为了提高字符写入效率,加入了缓冲技术。  
        //只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可  
        BufferedWriter bfw = new BufferedWriter(fw);  
  
        //bfw.write("abc\r\nde");  
        //bfw.newLine();               这行代码等价于bfw.write("\r\n"),相当于一个跨平台的换行符  
        //用到缓冲区就必须要刷新  
        for(int x = 1; x < 5; x++) {  
            bfw.write("abc");  
            bfw.newLine();                  //java提供了一个跨平台的换行符newLine();  
            bfw.flush();  
        }  
  
  
  
        bfw.flush();                                                //刷新缓冲区  
        bfw.close();                                                //关闭缓冲区,但是必须要先刷新  
  
        //注意,关闭缓冲区就是在关闭缓冲中的流对象  
        fw.close();                                                 //关闭输入流对象  
  
    }  
}  

 

 

 

简单demo:

1:文件的复制:

public static void main(String[] args) throws IOException {
        File fil1 = new File("D:/111.pdf");
        File fil2 = new File("D:/222.pdf");
        try (FileInputStream fi = new FileInputStream(fil1); 
        //一个叫输入流的桶,装满了一桶叫做D:/111.pdf文件的水
        FileOutputStream fs = new FileOutputStream(fil2);
        //一个叫输出流的空桶,但想装满叫做"D:/222.pdf"文件的水
                ) {
            byte[] buf = new byte[521];
            //叫做buf的水瓢
            int len = -1;
            //用来测量每次水瓢装了多少水
            while((len = fi.read(buf)) != -1){
            //一次次的用水瓢在输入流的桶里舀水,并用len测了舀了多少水,当len等于-1意味着水舀光了,该结束舀水了。
                fs.write(buf, 0, len);
                //一次次把水瓢里的水放到了输出流的桶里
            }
            fs.flush();
        } catch (Exception e) {
        }

    }

 

2:字节流的形式读物文件 转化为字符串

File file = new File("D:/123.txt");
        FileInputStream fis = new FileInputStream(file);
        //同样是叫做输入流的桶
        StringBuffer sb = new StringBuffer();
        //把输出流的桶换成了StringBuffer用来储存字符串
        //其实也可以直接用String,但是StringBuffer速度更快。
        byte[] buf = new byte[256];
        //水瓢没变
        int len = -1;
        //测水瓢舀了多少水没变
        while ((len = fis.read(buf)) != -1){
            sb.append(new String(buf, 0, buf.length));
            //和上面的原理基本一样,只不过换了个水瓢而已
            //new String(buf, 0, buf.length)是将buf里面的内容转换为字符串
        }
        System.out.println(sb.toString());

3:文本的读取(注意  这个时候应该借助于字符流  而不是字节流)

    使用场景:(就是读取本地的字符串文件 )

   public static void main(String[] args) throws Exception {
        File file = new File("D:/123.txt");
        //复制源文件
        File file2 = new File("D:/456.txt");
        //复制结果文件
        StringBuffer sb = new StringBuffer();
        //用于输出到控制台
        if(!file2.exists()){
            file2.createNewFile();
        }
        //检测结果文件是否存在如果不存在便创建一个
        FileReader fr = new FileReader(file);
        //设置字符读入流用于向文件(file)中读数据
        FileWriter fw = new FileWriter(file2);
        //设置字符读出流用于向文件(file2)中写数据
        char[] ch = new char[256];
        //每次读和写的容器,或者说是传送的媒介
        int len = -1;
        while((len = fr.read(ch)) != -1){
            fw.write(ch, 0, ch.length);
            //将容器里的东西写入到新文件中
            sb.append(new String(ch, 0, ch.length));
            //将容器里的东西添加到strngBuffer中,用于输出
        }
        fw.flush();
        fw.close();
        fr.close();
        System.out.println(sb.toString());
        //输出文本文件
    }

 

 

 

  • 对对象进行序列化及反序列化 
    使用工具:ObjectOutputStream,ObjectInputStream 
    介绍:将对象以文件的形式保存在硬盘中,使之能更方便的传输。 
    条件:必须实现Serializable接口(实现了这个接口,但并不需要重写任何方法)

 

 

 

 

 

 

2:File类的作用:创建  删除  重命名文件等操作。

file文档详解:    

file代表文件或者目录,  文件或者目录的存储路径一般由路径分隔符和字符串组成  unix系统是   /    windows是  \

上面的分隔符获取方式是:File.seperator,

路径分为相对路径和绝对路径,相对路径获取父目录路径可以通过file.getParent获取到。

windows绝对路径如下 :C:\Apps

unix路径如下/

file的构造函数:

File(String pathname)

Creates a new File instance by converting the given pathname string into an abstract pathname.               

File(String parent, String child)

Creates a new File instance from a parent pathname string and a child pathname string.

File(File parent, String child)

Creates a new File instance from a parent abstract pathname and a child pathname string.

File(URI uri)

Creates a new File instance by converting the given file: URI into an abstract pathname.               

注意File类 包括file和directory  文件和目录

构造函数详解

File  file =new File("d:/1.txt");

pathName  就是文件的存储路径

File file =new File("D:/doc","letter.txt");

parent 父路径字符串  子路径字符串  其实就是文件名称外加文件类型

File file=new File(“D:/doc”);

File file1=new File(file,“”“letter.txt”)

file就是一个目录

File操作分为文件操作和文件夹操作:

 

经常看源代码:经api详细实现。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

File.separator

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值