File类

  • java.io

 操作文件和目录,与平台无关。具体的常用实例方法:

File file = new File(".");    //  以当前路径创建名为 "." 的 File 对象

·   文件目录信息函数
    -   String getName/Path/Parent(): 文件名/路径/父目录
    -   boolean renameTo(File newName):文件/目录重命名
    -   long length():文件内容长度
    -   long lastModified():文件最后编辑时间
·   文件检测函数
    -   boolean exists():判断文件/目录是否存在
    -   boolean isFile/isDirectory():判断是否为文件/目录
    -   boolean canRead/Write():是否可读/写
    -   boolean isAbsolute():文件/目录是否绝对路径
·   文件目录操作函数
    -   boolean creatNewFile():新建 File 对象对应的文件
    -   boolean mkdir():创建 File 对象对应的目录
    -   boolean delete():删除文件/目录
    -   void deleteOnExit():JVM 退出时,删除文件/目录
    -   String[] list():返回 File 对象的所有子文件名和路径名
    -   File[] listFiles():返回 File 对象的所有子文件和路径

·文件过滤器
 利用File类的String[] list(FilenameFilter filter)方法,过滤得到指定类型的文件/目录,必须重写accept方法。具体应用步骤:
  ζ   实现FilenameFilter接口;
  ζ   实现boolean accept(File dir, String name)方法;  
由于FilenameFilter是函数式接口,Lambda表达式可直接作为入参。
 参考 :FilenameFilter 介绍

·RandomAccessFile类
   Java输入-输出体系中功能最丰富的文件内容访问类(局限性是只能读写文件,不能读写IO流),提供"随机访问"方式,支持追加文件内容、自由定义记录指针位置:
   -  long getFilePointer():返回文件记录指针当前位置;
   -  void seek(long pos):文件记录指针定位到pos处;
注意,定点插入数据需要先缓存插入点之后的数据,然后追加新数据,最后还原缓存的数据。RandomAccessFile类可以实现多线程断点下载/传输工具。

Files类

  • java.io.file

 File类的工具类,高度封装,支持文件复制、读写文件、遍历文件和子目录,Java-8支持Stream API操作文件目录和文件内容。

 ·   文件复制

Files.copy(Path source, Path target, CopyOption options);  // 文件到文件
Files.copy(InputStream in, Path target, CopyOption options); // 输入流到文件
Files.copy(Path source, OutputStream out); // 文件到输出流

 ·   读写文件

Files.write(Path src, List<string> strList);  // 将字符串内容写入文件
Files.list(Path path); // 列出path目录下的所有文件和子目录
Files.lines(Path src); // 列出文件中所有行

 ·   遍历文件和目录

// 遍历startPath路径下所有文件和子目录,并会“触发”FileVisitor中的相应方法
Files.walkFileTree(Path startPath, FileVisitor<? super Path> visitor);
Files.walkFileTree(Path startPath, Set<File VisitOption> options, int maxDepth, FileVisitor<? super Path> visitor);  

I/O 流

 流(stream)是从起源(source)到接收(sink)的有序数据,允许Java程序以相同的方式访问不同的输入/输出源。Java通过装饰器模式将底层节点流(低级流)封装成上层处理流(高级流),统一对不同数据源的访问,灵活方便、执行效率高。利用文件过滤器和I/O流可以实现文件的条件复制。流模型的功能体现:
· 性能提高:以增加缓冲的方式提高I/O效率;
· 操作便捷:提供不同的流处理方法,灵活性; 
 Java-I/O的4个抽象基类:
·   输入流: InputStream,字节流 - Reader,字符流,
  ζ  int read():读取单字节/单字符,返回int型字节/字符数据;
  ζ  int read(byte/char[] b): 字节/字符数组;
  ζ  int read(byte/char[] b, int pos, int len):字节/字符数组;
·   输出流:OutputStream,字节流 - Writer,字符流
  ζ  void write(int v):将字节/字符数据v写入到输出流中;
  ζ  int write(byte/char[] b)-(String str):字节/字符数组 - 字符串;
  ζ  int write(byte/char[] b, int pos, int len)-(String str, int pos, int len):字节/字符数组 - 字符串;
 字节流比字符流适应范围广,但字符流操作方便,文本文件推荐字符流,二进制文件推荐字节流。流的处理依靠隐式的记录指针:
   ζ  void mark(int pos):标记记录指针当前位置;
   ζ  void reset():记录指针复位; 
   ζ  long skip(long n):记录指针前移n个字节/字符;
 节点流直接以物理IO节点为构造器参数,处理流以已存在的流为构造器参数。System.out是输出处理流PrintStream的实例,System.in是输入节点流InputStream的实例。
    其他的流
  [1].转换流:InputStreamReader/OutputStreamWriter
   处理流,将字节流单向转换为字符流。
  [2].推回输入流:PushbackInputStream/Reader
   处理流,利用推回缓冲区,其方法unread()可以重复读取刚刚读取的内容。
  [3].缓冲流:BufferedInput/OutputStream-BufferedReader/Writer
   处理流,结合flush()方法实现缓冲功能。其方法readLine()用于读取行。
  [4].对象流:ObjectInput/OutputStream
   处理流,实现对象的序列化。
  [5].管道流:PipedInput/OutputStream-PipedReader/Writer
   节点流,实现进程间通信。
  其他的如处理文件、数组、字符串的流均为节点流。
    标准流重定向:将System.in/out重定向到相应位置;
   static void setIn/Out/Err(InputStream in/PrintStream out/PrintStream err);
 此外,Runtime.getRuntime().exec("文件名")启动子进程,JVM可以利用返回的Process对象读写子进程的数据。

参考:Java - IO整理

对象序列化机制

 允许把内存中的Java对象(对象的类名、实例变量)转换为平台无关的二进制字节流(序列化,Serialize),用于永久保存对象到磁盘或利用套接字/RMI传输对象,后续可以恢复出Java对象(反序列化,Deserialize)。其中,反序列化读取的是类对象的数据而不是类本身,必须提供该对象的class文件。对象序列化机制是Java提供分布式网络编程的基础,也是Java EE的基础。
 对象支持序列化,其类必须是可序列化的,即必须实现接口之一:
  · Serializable:标记声明性接口,常用;
  · Externalizable:用于完全自定义序列化机制,性能略优但编程复杂度高;

 public class MyClass implements java.io.Serializable{
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("文件名"));
MyClass objMy = new MyClass(); out.writeObject(objMy);
out.close(); ObjectInputStream in = new ObjectInputStream(new FileInputStream("文件名"));
MyClass resMy = (MyClass)in.readObject();
in.close();
}

 Java序列化机制采用对对象序列化编号的方法避免同一对象重复序列化,此方法中要注意可变对象。
·自定义序列化机制
  自定义序列化控制程序如何序列化实例变量,重写如下方法:
  ·private void writeObject(ObjectOutputStream out):写入特定类的实例状态;
  ·private void readObject(ObjectInputStream in):从流中读取并恢复对象的实例变量;
  ·  private void readObjectNoData():可以正确初始化反序列化的对象;
  关键字transient用于修饰实例变量,序列化对象时忽略之,static变量也不会序列化,但是可以通过重写writeObject()和readObject()手动序列化保存。

 @override
private void writeObject(ObjectOutputStream out) throws IOException{
out.defaultWriteObject();
out.writeXxx(基本类型变量)/writeObject(引用类型变量);
}
@override
private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{
in.defaultReadObject();
in.ReadXxx()/readObject();
}

  自定义序列化机制可以加密提供安全性: 
  ·private Object writeReplace()
    序列化对象objA时将对象objA替换成其他对象objB,然后调用writeObject()方法序列化对象objB,可继承;
  ·private Object readResolve()
    实现保护性复制整个对象,在readObject()之后调用,返回值会代替readObject()反序列化出来的对象以保证反序列化的正确性,常用于单例类、枚举类的序列化,可继承;
·完全自定义序列化机制
 允许完全由程序员自主决定存储和恢复对象数据,必须实现接口Externalizable和如下方法:
  ·public void writeExternal(ObjectOutput out):保存对象的状态;
  ·public void readExternal(ObjectInput in):实现对象反序列化;
  方法实现体中,调用DataIn/Output(ObjectIn/Output的父接口)的方法保存/恢复基本类型的实例变量,调用ObjectIn/Output的read/writeObject()方法保存/恢复引用类型的实例变量。

 public class MyClass implements Externalizable{
public MyClass(){} // 无参的public构造函数
@override
public void writeExternal(ObjectOutput out) throws IOException{
...
}
@override
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{
...
}
}

·序列化机制版本
  Java序列化机制允许为序列化类提供private static final long serialVersionUID标识Java类的序列化版本,保证序列化版本的兼容性、有利于程序在不同JVM间的可移植性。

参考:

NIO

Java的NIO参见:Java - NIO - sqh

Java - I/O的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  3. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  4. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  8. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  9. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

  10. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

随机推荐

  1. Android之使用文件进行IPC

    一.文件进行IPC介绍 共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据.在Windows上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访问,包括读写,而由于An ...

  2. uboot环境配置

    uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...

  3. mono -图片处理

    这篇文章中您将了解到以下内容 保存Bitmap WebClient文件上传 向服务端传递数据 保存Bitmap 做移动端开发,图片上传下载是最普通的需求了. 在mono for android中按照资 ...

  4. 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...

  5. NodeJs 开发微信公众号(三)微信事件交互

    微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...

  6. php下载文件

    $size=filesize($file);$file=fopen($file, "r");ob_start();header("Content-type: applic ...

  7. vue vue-cli安装

    npm 更新 cnpm install -g npm Vue 的基本用法 Vue 相比于 React 和 Angular 容易上手多了,因此我对 Vue 的学习主要以文档为主,视频为辅(只有像我这种菜 ...

  8. PHP 高级编程(2/5) - 反射API

    PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 此外,反射 API 提供了方法来取出函数.类和方法中的文档注释.通过使用反射API可以分析其他的类.接口.方 ...

  9. 《JS设计模式笔记》 5,适配器模式

    //适配器模式的作用就像一个转接口. jQuery("#"+id); $id=function (id) { return jQuery("#"+id)[0]; ...

  10. 前端学HTTP之网络基础

    × 目录 [1]网络 [2]OSI [3]TCP/IP 前面的话 HTTP协议对于前端工程师是非常重要的.我们在浏览网站时,访问的每一个WEB页面都需要使用HTTP协议实现.如果不了解HTTP协议,就 ...