java基础(九):IO流

硬盘==>内存:读(input)

内存==>硬盘:写(output)

2.File类常用方法

新建文件:File file = new File(“D:\aaa\”,“1.txt”);

              File file = new File("D:"+System.getProperty("file.separator")+"1.txt");   //下划线可用property键值对替代

文件长度:length();

文件名:getName();

文件所在目录:getParent();

文件路径:getPath(); getAbsolutePath();

上次修改时间:lastModified();

创建文件:createNewFile();

创建目录:mkdir(); mkdirs();(多级目录用后者)

删除文件:delete();

判断是否隐藏文件:isHidden();

判断是否为空:isEmpty();

判断是否文件、目录:isFile(); isDirectory();

获取所有文件名,获取所有文件(包含隐藏文件):list(); listFiles();

  1. File类实用方法(过滤器,遍历,将txt文件放到一个集合中)

(1).文件名过滤器(FilenameFilter)、文件过滤器(FileFilter)

     class IOFilterByName implements FilenameFilter{

              private String content;

              public IOFilterByName(String content){

                       this.content = content;

              }

              public boolean accept(File dir,String name){

                       return name.contains(content);

              }

     }

(2).遍历指定目录下的所有文件(递归)

     public static void getAllFiles(File file){

              File[] files = file.listFiles();

              for(File f:files){

                       if(f.isDirectory()){

                                getAllFiles(f);

                       }else{

                                System.out.println(f);

                       }

              }

     }

      什么时候用递归:多次用到同样方法但是参数不同的时候

(3).将指定文件夹下后缀为txt的文件放到集合中
public static void main(String[] args){
File dir = new File(“D:\aaa”);
IOFilterByEndName filter = new IOFilterByEndName(“txt”);
List list = new ArrayList();
List list2 = searchDir(dir,filter,list);
for(File f:list2){
System.out.println(f);
}
}

     //写文件过滤器

     public IOFilterByEndName implements FileName{

              private String content;

              public IOFilterByEndName(String content){

                       this.content = content;

              } 

              public boolean accept(File pathName){

                       return pathName.getName().endWith(content);

              }

     }

     //将所有文件放到list中

     public static List<File> searchDir(File dir,IOFilterByEndName filter,List<File> list){

              File[] files = dir.listFiles();

              for(File f:files){

                       if(f.isDirectory())    searchDir(f,filter,list);
                       else{
                                if(filter.accept(f))    list.add(f);
                       }


              }
              return list;

     }

4.普通流(重点)

     (1).流的基本分类

              按流操作的数据:字节流,字符流

              按流的流向:输入流(读),输出流(写)

              字节流的抽象基类:InputStream,OutputStream

              字符流的抽象基类:Reader,Writer

     (2).字节流

              ^1.文件字节流:FileInputStream,FileOutputStream

              ^2.字节流的读取(2种方法,区别在于有无缓存)

                       File dir = new File("D:\\aaa");

                       FileInputStream fis = new FileInputStream(dir);

                       方法一:

                                int len = 0;

                                while((len = fis.read())!=-1){

                                         System.out.println(len);

                                }

                                fis.close();

                       方法二:

                                Byte[] bs = new Byte[1024];

                                int len = 0;

                                while((len = fis.read(bs))!=-1){

                                         System.out.println(new String(bs,0,len));

                                }

                                fis.close();

                       注:方法二可以直接设定缓存区大小为文件大小:Byte[] bs = new Byte[fis.available()];

              ^3.字节缓存流:BufferedInputStream,BufferedOutputStream

                       基本上同上,但是在流关闭之前要bos.flush()刷新一下,将缓存区的数据写入到设备里。

     (3)字符流

              ^1.文件字符流:FileReader,FileWriter

                       将字节流转换成字符流的叫转换流:InputStreamReader,OutputStreamWriter

                       字符流 = 字节流 + 转换流

              ^2.字符流的读取:基本同上,唯一不同在于:Char[] chars = new Char[1024];

              ^3.字符缓存流:BufferedReader,BufferedWriter

                       读取基本也同上,区别:while((line = br.readline())!=null){}

                       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

     注:加缓存的意义在于提高效率

     注:FileOutputStream fos = new FileOutputStream("D:\\1.txt",true);   //此处true意思为续写

5.其他流

     (1).打印流:PrintStream,PrintWriter

              PrintWriter pw = new PrintWriter(System.out,true);    //true表示自动刷新

     (2).对象序列化流(对象存储到设备上):ObjectOutputStream

              实现对象序列化流必须实现接口:implements Serializable(给类提供版本号)

              若对象中有属性不想被序列化:private transient int age;

              对象反序列化:ObjectInputStream



              FileOutputStream fos = new FileOutputStream("D:\\1.txt");

              ObjectOutputStream oos = new ObjectOutputStream(fos);

              oos.writeObject(new Person("aaa",20));

              oos.close();

              fos.close();

              

     (3).随机流:RandomAccessFile

              seek(数字);通过操作指针完成随机写

              "r":只读权限     "rw":读写权限都有

              

              RandomAccessFile raf = new RandomAccessFile("D:\\1.txt","rw");

              raf.seek(8);

              raf.write("aa".getBytes());

              raf.writeInt(7);

              raf.close();

     (4).管道流:PipedInputStream,PipedOutputStream(管道流一般用于多线程,单线程会死锁)

              可用connect()连接管道输入输出流

              

              PipedInputStream pis = new PipedInputStream();

              PipedOutputStream pos = new PipedOutputStream();

              pis.connect(pos);

              new Thread(new PipedInputThread(pis)).start();

              new Thread(new PipedOutputThread(pos)).start();

     (5).数据流:DataInputStream    DataOutputStream

     (6).字节数组流:ByteArrayInputStream    ByteArrayOutputStream

     (7).字符数组流:CharArrayReader    CharArrayWriter

     (8).字符串流:StringReader    StringWriter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值