Java I O流

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

Java  IO流

一、字符流

字符流的特点:

      数据最常见的体现形式是:文件

需求:在硬盘上,创建一个文件,并写入一些文字数据。

      用于操作操作文件的Writer的子类FileWriter,后缀名是父类名。前缀名是该流对象的功能。
操作步骤:
      1.创建一个FileWriter对象。该对象一被初始化就必须明确要被操作的文件,该文件会被创建到指定目录下,如果该目录下已经有同名文件,将被覆盖
                FileWriter fw=new FileWriter("demo.txt");
      2.调用write方法,将字符串写入到流中。
                fw.write();
      3.刷新流对象中的缓冲中的数据,将数据刷到目的地
                fw.flush();
      4.关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。和flush的区别,flush刷新后,流可以继续使用,close刷新后将会将流关闭。
                fw.close();


IO异常的处理方式:

 FileWriter fw=null;
  
   try {
    fw=new FileWriter("demo.txt");
    fw.write("sdfasd");
   } catch (IOException e) {
    e.printStackTrace();
   }finally{
    
    try {
      if(fw!=null)
      fw.close();
    } catch (IOException e) {
     
     e.printStackTrace();
    }
    
   }
 }


文件的续写:
      传递一个true参数,代表不覆盖已有文件,并在已知文件的末尾处进行数据续写。
                  FileWriter fw=new FileWriter("demo.txt",true);
换行转义字符:\r\n

文件的读取方式一:
FileReader();


      1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
                  FileReader fr=new FileReader("demo.txt");
      2.调用读取流的对象的read方法
         (1)int ch=fr.read();一次读一个字符,会自动往下读。
         (2)读出所有字符
     while((ch=fr.read())!=-1)
    {
        System.out.println((char)ch);
     }

3.关闭流资源,
fr.close();


文件的读取方式2:通过字符数组进行读取
      1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");
     2.定一个字符数组,用于存储读到字符,该rrad(char[])返回的是读到的字符个数。
char[] buf=new char[1024];一般定义1024-2个字节。
    int num=0;
     while((num=fr.read(buf))!=-1)
    {
        System.out.println((new String(buf,0,num));
     }

 

二、字符流的缓冲区
缓冲区的出现提高了对数据的读写效率对应类:
      BUfferWriter
      BufferedReader
特点:缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象。在流的基础上对流的功能进行了增强。
BUfferWriter步骤:
     1.创建一个字符写入流对象
FileWriter fw=new FileWriter("a.txt");
     2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
bufferedWriter bufw=new BufferedWriter(fw);
buff.write("asdasdas");
bufw.newLine();//换行符,跨平台的
    3.将缓冲区刷新
bufw.flush;
    4.关闭缓冲区,就是在关闭缓冲区中的流对象
bufw.close();


BufferedReader步骤
     1.创建一个字符写入流对象
FileReader fr=new FileReader ("a.txt");
     2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
BufferedReader bufr=new BufferedReader (fr);
     3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾
String line=null;
while((line=bufr.readLine())!=null)
{
String s=line;}
4.关闭
bufr.close();


readLine()方法的原理:
      无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,最终使用额还是read方法一次读一个的方法。

 

三、字节流

操作图片数据就要用到字节流。
字符流使用的是字符数组char[],字节流使用的是字节数组byte[]。
字节流:
InputStream 读
Outputstream 写

读取
FileInputStream fis=new FileInputStream ("a.txt");
byte[] buf=new byte[fis].available(0)];//定义一个刚刚好的缓冲区,不用再循环了
fis.read(buf);
System.out.println(new String(buf));
fis.close();

练习:复制图片

        FileOutputStream fw=null;
   FileInputStream fr=null;
   try {
    fos=new FileOutputStream("b.jpg");
    fis=new FileInputStream("a.jpg");
    byte[] buf=new byte[1024];
    int num=0;
    while ((num=fis.read(buf))!=-1){
    fis.write(buf,0,num);
    }
 }
   catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
   finally
  {
     try {
                      if(fis!=null)
    fis.close();
   } catch (IOException e) {
    
    e.printStackTrace();
   }  
     
     try {
    fos.close();
   } catch (IOException e) {
    
    e.printStackTrace();
   }  
  }

 

四、转换流

转换流

读取转换流:InputStreamReader
写入转换流:OutputStreamReader


读取转换流:InputStreamReader 字节流通向字符流的桥梁

步骤
      1.获取键盘录入对象
Inputstream in=System.in
      2.将字节流对象转换成字符流对象,使用转换流InputStreamReader
InputStreamReader isr=new InputStreamReader(in);
      3.提高效率使用字符流缓冲区 BufferedReader进行读取
BufferedReader bf=new BufferedReader(is);
String line=null;
while((line=bf.readLine())!=null)
{
    if("over".equals(line))
     break;
    sop(line);
}
bufr.close;

 

写入转换流:OutputStreamReader 字符流通向字节流的桥梁

步骤
      1.获取输出对象
Outputstream out=System.out
      2.将字符流对象转换成字节流对象,使用转换流OutputstreamWriter
OutputstreamWriter osw=new OutputstreamWriter(out);
      3.提高效率使用字符流缓冲区 BufferedWriter进行写入
BufferedWriter bw=new BufferedWriter(osw);
String line=null;
while((line=bf.readLine())!=null)
{
    if("over".equals(line))
     break;
    bw.write(line);
    bufw.newLine();
}
bufr.close;

 

 

五、File类

File类

创建File对象,
      1.File f=new File("c:\\abc\a.txt");//将a.txt封装成FIle对象,可以将已有的和未出现的文件或者文件夹封装成对象。
      2.File f=new File("c:\\abc","a.txt"); 第一个参数代表的是目录,第二个参数代表的是目录下的文件。
      3.file d=new File("c\\abc"); 将路径封装成对象
          File f=new File(d,"a.txt"); 调用路径对象


f代表的是文件路径

目录分隔符:\\
File.separator

常见方法:
1.创建
  boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false
                          和写入流不一样,写入流创建文件会覆盖已经存在的文件。
  案例 :
   File f=new File("a.txt");
   f.createNewFile();
   创建一级目录
   File dir=new File("abc");
   dir.mkdir();
   创建多级目录
   dir.mkdirs();

2.删除
   boolean f.delete(); 删除失败,返回false,可能不能删除
   void deleteOnExit();在程序退出时,删除指定文件。必须删除。不会失败

3.判断 :在判断文件对象是都是文件或者目的时候,必须要先判断该文件对象封装的内容是否存在。
   File f=new File("a.txt");
   f.canExecute();是否能执行。
   f.exits();返回boolean  文件是否存在
   是否是目录
   f.isDirectory();
   是否是文件
   f.isFile();
   是否是隐藏的
   f.isHidden();
   是否是绝对路径
   f.isAbsolute();

4.获取信息。
   getName()   //获取名称
   getpath()    //获取路径
   getAbsolutePath() //获取绝对路径
   getParent() //获取绝对路径下的父路径,如果获取的是相对路径返回null,如果相对路径中由上一级目录,该目录就是结果。
   lastModified()//获取最后一次修改时间
   length();//获取体积大小
5.其他
   renameTo();改名,重命名,如果修改路径的话,同时路径也会修改
   f1.renameTo(f2);
  


    listRoots();返回 File 数组,列出可用的文件系统根(盘符)
   例子:
    File[] files=File.listRoots();
     for(File f: files)
     {
               sop(f)
     }

 

     list():返回当前目录下所有文件,包括子目录
     File f=new File("abc");

     String[] namess=f.list();//调用list方法的file对象必须封装了一个目录,把那个目录必须存在
     for(String f: names)
     {
               sop(f)
     }

 

    显示.bmp结尾的文件
      list(FilenameFilter Filter) 返回String[]  指定目录中满足制定过滤器的文件和目录
       File dir=new File("abc");

     String[] namess=f.list(new FilenameFileter()

           public boolean accept(File dir,String name)
               {
                  return name.endsWith(".bmp");
                  }
     );/
     for(String f: names)
     {
               sop(f);
     }

    
     listFiles();返回当前路径下的文件对象。(不包括子目录)
     
     FIle dir=new File("c:\\");
     File[] files=dir.listFiles();
     for(File f : files)
      {
          sop (f.getname())
      }
     
   

列出指定目录下所有内容:使用递归 。。函数自己调用自己

     File dir=new File("d:\\");
     sop(dir);
     File[]  files=dir.listFiles();
     for(int x=0;x<files.length;x++)
      {
         if(files[x].isDirectory)
            showDir(files[x]);
         else
            System.out.println(files[x]);
      }

 

        
删除一个带内容的目录:

原理:从里面往外删除,就需要递归
 File dir=new File("d:\\");
File[] files=dr.listFiles();
for(int x=0;x<files.length;x++)
{
   if(files[x].isDirectory())
    removeDir(files[x]);
 
    sop(files[x].toString()+":-file-:"+files[x].delete(););
}
sop(dir+":-dir-:"+dir.delete();)


练习:讲一个指定目录下的jva文件的绝对路径,存储到一个文本文件中。
思路:
1.对指定目录进行递归
2.获取递归过程中所有以JAVA文件的路径
3.将这些目录存储到集合中,将集合中的数据写入到一个文件中。

 


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三季人 G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值