File类

  • 代表文件或者文件目录
  • 创建实例
    1. new File(String src) : 里面为绝对路径,或相对路径
    2. File(String parent,String child) : parent目录下的child文件或目录
    3. File(File file,String child) : file目录下的child文件
  • File.separator 根据系统提供分隔符(windows : \ unix: /)
  • 相对路径

    • 在IDEA中
      • JUnit测试方法,相对路径为Module
      • main方法,相对路径为Project
    • Eclipse中相对路径都是当前项目的Project下

      常用方法

    1. getAbsolutePath() : 获取绝对路径
    2. getPath() : 获取路径
    3. getName() : 获取名字
    4. getParent() : 返回上层目录
    5. length() : 获取字节长度
    6. lastModified() :获取 最近修改时间(毫秒数)
    7. list() : 获取指定目录下的所有文件和文件目录的名称数组 (包含隐藏文件)返回值String[]
    8. list(new FilenameFilter())里面可以加过滤器
    9. listFiles() : 获取指定目录下的所有文件和文件目录的File数组 返回值File[]
    10. renameTo(File dest) : 把文件重命名为指定的文件路径 : dest要他不存在相当于复制(名字是dest名字)
    11. isDirectory() : 判断是否文件目录
    12. isFile() : 判断是不是文件
    13. exists() : 判断是否存在
    14. canRead() : 判断是否可读
    15. canWrite() : 判断是否可写
    16. isHidden() : 判断是否隐藏
    17. createNewFile() : 创建文件,存在不创建返回false
    18. delect() : 删除文件或者文件夹(删除文件夹,其下面不能有文件,或者文件目录)
    19. mkdir() : 创建文件目录,存在不创建,上层目录不存在也不创建
    20. mkdirs() : 创建文件目录,上层目录不存在,一并创建

IO流Input/Output

  • 操作流的分类: 字节流/字符流
    • 文本文件使用字符流(.txt,.java,.c,.cpp)
    • 非文本文件使用字节流(.jpg,.mp3,.mp4,.ppt,.docx…)
  • 数据的流向:输入流/输出流
  • 流的角色: 节点流/处理流

image.png

FileReader :

  • read():数据读入一个字符,达到文件末尾,返回-1 ;
  • read(char[] cbuf) : 返回每次读入数组(cbuf)的字符个数,达到末尾返回-1 ;
  • 异常的处理:为了保证资源的关闭,需要使用try-catch-finally处理异常

FileWriter :

  • 明确存储数据的目的地,文件不存在就自动创建, 文件存在会覆盖
  • FileWriter(File file,boolean append) : 其中true就是在文件的基础 上去追加写入内容,而false就是覆盖原来文件,FileWriter(File file) 默认是false;
  • 系统的换行符不同所以可以使用 : System.getProperty(“line.separator”)
  • 调用Writer对象中的write()写入数据.数据写入临时存储缓冲区中,要使用flush() 进行刷新,写到目的地.close()关闭流,关闭资源.

缓冲流 :

为了提高效率(BufferedInputStream,BufferedOuputStream,BufferedReader,BufferedWriter)

  • 资源关闭 : 先关外层的流,再关内存的流(关闭外层流的时候,内层的流会自动关闭,我们可以省略)
  • 字符缓冲流(bufferedReader)中有特有的readLine()读取到的数据是不带换行符的可以使用BufferedWriter中newLine()来换行;
  • 缓冲的输出流都有一个flush() 来刷新流
  • 缓冲输入流中有读取readLine(); — 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null;

  • ```java FileWriter fw = new FileWriter(“D://MyFile/BuffShow.txt”);
    1. BufferedWriter fwbw = new BufferedWriter(fw);
    2. fwbw.write("buffershow");
    3. fwbw.flush();
    4. fwbw.close();
    5. FileReader fw = new FileReader("D://MyFile/Buffshow.txt");
    6. BufferedReader fwbr = new BufferedReader(fw);
    7. String line = null ;
    8. while((line=fwbr.readLine())!=null) {
    9. System.out.println(line);
    10. }
    11. fwbr.close();

//复制的操作(字符流类似) //读到数组中,再写 FileInputStream fi = new FileInputStream(“D://MyFile/OldMan1.mp3”); FileOutputStream fo = new FileOutputStream(“D://MyFile/OldMan2.mp3”); byte[] by = new byte[1024]; int len = 0; while ((len = fi.read(by)) != -1) { fo.write(by, 0, len); } //使用缓冲流 FileInputStream fi = new FileInputStream(“D://MyFile/OldMan1.mp3”); BufferedInputStream bffi = new BufferedInputStream(fi); FileOutputStream fo = new FileOutputStream(“D://MyFile/OldMan2.mp3”); BufferedOutputStream bffo = new BufferedOutputStream(fo);
byte [] by = new byte[1024] ;
int len= 0 ; while((len=bffi.read(by))!=-1) { bffo.write(by, 0, len); } //确定好了字节读完,再写,耗费内存 FileInputStream fi = new FileInputStream(“D://MyFile/OldMan1.mp3”); FileOutputStream fo = new FileOutputStream(“D://MyFile/OldMan2.mp3”); byte [] by = new byte[fi.available()]; // 确定文件的字节数 fi.read(by); fo.write(by);

//读一个写一个 FileInputStream fi = new FileInputStream(“D://MyFile/OldMan1.mp3”); FileOutputStream fo = new FileOutputStream(“D://MyFile/OldMan2.mp3”); int ch = 0 ; while((ch=fi.read())!=-1) { fo.write(ch); } ```

/

转换流 : 字节流与字符流之间的转换

  • 属于字符流
    • InputStreamReader: 将字节的输入流转换成字符的输入流
    • OutputStreamWriter: 将字符的输出流转换成字节的输出流
  • new InputStreamReader(InputStream in,Charset cs) : in为字节输入流,cs为字符集保存用哪个使用就是用哪个 .
  • new OutputStreamWriter(OutputStream in , charset cs); 将输出流采用cs字符集保存

字符集:

  • ASCII : 美国标准信息交换码
  • ISO8859-1 : 拉丁码表.欧洲码表
  • GB2312 : 中国的中文编码表
  • GBK : 中文编码表的升级
  • Unicode : 国际标准码,融入人类所有的字符
  • UTF-8 :变长的编码方式,通用

标准输入,输出流

  • System.in : 标准的输入流,默认键盘输入类型InputStream
  • System.out : 标准的的输出流,默认控制台输出,类型PrintStream,OutputStream的子类
  • setIn(InputStream in) /setOut(PrintStream out) 重新指定输入,输出的流

打印流 : 实现基本数据类型的数据格式转化为字符串输出

  • PrintStream() 和 PrintWriter()
  • System.out是PrintStream的实例

数据流: 方便操作基本数据类型和String类型数据.

  • DataInputStream(InputStream in) ; 读取顺序的必须和写入的一致
    • readInt();
    • readUTF();
  • DataOutputStream(OutputStream out);
    • 可以使用writeInt(int ) ; 存储int型
    • writeBoolean() ; 存储布尔值
    • writeUTF() ; 存储字符串

对象流:存储基本数据类型和对象处理流

  • ObjectInputStream和ObjectOutputStram
  • 序列化过程:ObjectOutputStream ,将内存中的java对象保存到磁盘或者网络传播出去,
    • writeObject(Object obj);
  • 反序列化:ObjectInputStream,将磁盘或者网络中的对象,还原成内存中的一个java对象
    • readObject() ;
  • 要想对象可以序列化

    1. 就要实现Serializable接口,
    2. 然后在类里面创建全局常量:serialVersionUID ; static final long ;

      • 如果没有加常量,内部是会自动生成,类的实例变量做了修改,serialVersionUID可能发生变化

             3.必须保证其内部所有属性也可以序列化,(基本类型都是可序列化的)<br />                 4.不能操作static,transient修饰的成员变量
        

RandomAccessFile

  • 继承java.long.Object类,实现Datainput和DataOutput接口
  • 即使一个输出流,又是一个输入流
  • 内部维护了一个byte[]数组
  • 构造方法
    • RandomAccessFile(File file, String mode)
    • RandomAccessFile(String name, String mode)
      • mode为访问模式
        • r:只读的方式打开
        • rw:打开以便读取和写入
        • rwd:打开便读取和写入,同步文件内容的更新
        • rws:打开以便读取和写入,同步文件内容和元数据的更新
  • 作为输出流出现,不存在则创建,存在就对原来里面的内容进行覆盖.
  • seek(int pos); 将指针移动到pos位置,
  • getFilePointer();获得指针位置

序列流(SequenceInputStrea)

可将多个读流写入一个写流
Enumeration enu = Collections.enumeration(集合);
SequenceInputStream sis = new SequenceInputStream(这里面是枚举对象);

(操作数组)

ByteArrayInputStream,ByteArrayOutputStream
CharArrayInputStream, CharArrayOutputStream
StringReader, StringWriter
操作内存的不需要关闭流;