IO流...

1、File 类 (文件类)

是Java中的 文件/文件夹的 抽象表示形式 .

一个File类的对象, 在JAVA中, 就表示一个文件或文件夹 .

1.1、File类常用的构造方法

注意: 我们使用File类 描述文件时 ,这个File对象描述的文件 可以是不存在的 !

1. File(String pathName) ****

        参数1: 文件的路径, 例如: c://x.txt

2. File(String parentName,String fileName) *

        参数1: 文件夹的路径

        参数2: 文件的名称

        例如: 描述c盘中a文件夹中的x.txt

                new File("c://a","x.txt");

3. File(File parent,String fileName) *

        参数1: 父文件夹的 File对象

        参数2: 文件的名称

        例如: 描述c盘中a文件夹中的x.txt

                new File(new File("c://a"),"x.txt");

1.2、File类常用的方法

- boolean createNewFile(); *

                当此File对象表示的文件不存在时 , 此方法用于创建文件 , 创建成功返回true

                当此File对象表示的文件已存在时, 此方法不执行任何的操作, 直接返回false

                注意: 此方法不能用于创建文件夹

- boolean mkdir()

                当此File对象表示的文件夹不存在时, 用于创建文件夹, 创建成功返回true

                注意: 此方法只能用于创建一层目录, 也就是此File对象表示的父文件夹必须存在.

例如: File a = new File("c://a/b/c");

                当我们操作a.mkdir();

                 //只有b文件夹已经存在时, 才会创建成功.

- boolean mkdirs() ***

        当此File对象表示的文件夹不存在时, 用于创建文件夹, 创建成功返回true

        注意: 此方法可用于创建多层目录

        例如: File a = new File("c://a/b/c");

                当我们操作a.mkdirs();

                会在C盘创建a文件夹, 在a文件夹中创建b文件夹,在b文件夹中创建c文件夹

- boolean exists() *

        判断此File对象所表示的文件 或 文件夹是否存在.

        存在则返回true, 不存在则返回false;

- boolean delete(); *

        删除此File对象 所表示的文件/文件夹 , 删除成功返回true

        注意: 当用于删除文件夹时, 文件夹中的内容必须是空的.

- boolean deleteOnExit() 熟悉

        当JVM退出时 , 删除此文件.

- boolean renameTo(File newFile);

        更改文件的名称, 并将文件剪切到 参数位置

1.3、File类获取文件信息的方法

- String getAbsolutePath(); *

        获取文件的绝对路径, 例如: c://x.txt

- String getName(); *

        获取文件的名称 , 名称带有后缀名

- String getPath();

        获取文件的路径

- long length(); *

        返回文件的字节数

- long lastModified()

        获取文件最后一次修改的时间

- boolean isFile() *

        获取file对象 是否为文件, 文件则返回true , 文件夹则返回false

- boolean isDirctory()

        获取file对象 是否为文件夹, 文件夹则返回true , 文件则返回false

- boolean isHidden()

        获取此文件是否为隐藏文件 . 隐藏文件返回true

- String getParent();

        通过一个file对象 获取其父文件夹的路径.

- File getParentFile() *

        通过一个File对象, 获取其父文件夹的file对象

- String[] list() *

        只有file对象为文件夹时 才可用, 用于获取子文件 /子文件夹的 路径数组

- File[] listFiles() ***

        只有file对象为文件夹时 才可用, 用于获取子文件 /子文件夹的 文件数组 , 如果不存在子文件 则返回null  

1.4、电脑中相对路径与绝对路径   

绝对路径: c://a/b/c.txt

相对路径:         在c://a/b文件夹中的a.Java文件中 描述 heihei.txt

                        这个heihei.txt 就是相对路径, 相对于c://a/b存在的路径。

                        它的绝对路径解析为:c://a/b/heihei.txt

 2、IO流

2.1、IO流的概念

1. input 输入

2. output 输出

输入与输出:

                在我们程序中是一种相对的概念 .

例如:

                        我们的程序, 从硬盘中读取一个文件 !

                                这种操作 相对于我们的程序而言, 是在进行输入操作 .

                                这种操作 相对于我们的硬盘而言, 是在进行输出操作 .

例如:

                        我们的程序, 在硬盘中创建一个文件 !

                                这种操作 相对于我们的程序而言, 是在进行输出操作 .

                                这种操作 相对与我们的硬盘而言, 是在进行输入操作 .

2.2 Java中流的分类

从操作上来说, 分为两种流:

                1. 输入流

                2. 输出流

但是通常情况, 我们指的流的分类是:

1. 字节byte流

                - 输出流顶级父 : OutputStream

                - 输入流顶级父 : InputStream

2. 字符char流

                - 输出流顶级父 : Writer

                - 输入流顶级父 : Reader

整个Java的io体系, 使用了大量的装饰者设计模式.

字符的组成,依赖编码表:UTF-8,GBK

2.3 字节输出流 OutputStream

常用方法:

     - void write(int b);

                        向输出流指向的位置 , 输出一个字节.

     - void write(byte[] bytes); 

                        向输出流指向的位置 , 输出一个字节数组 .

     - void write(byte[] bytes,int offset,int len); 

                        向输出流指向的位置 , 输出一个字节数组的一部分 (从offset开始, 输出len个字节)

       - void close() 

                        关闭流, 释放占用的硬件资源.

2.3.1 FileOutputStream 文件字节输出流

FileOutputStream 是 OuputStream 的实现类 , 是用于将字节 输出到文件中的 类.

文件输出流 输出时, 指向的文件可以不存在, 会创建文件并输出 .

构造方法:

                - FileOutputStream(String filePath); ***

                        通过文件的绝对路径 , 创建一个指向文件的输出流.

                - FileOutputStream(String filePath,boolean append); ***

                         参数1. filePath: 创建的流 , 指向的文件路径

                         参数2. append : 设置流是否为追加模式 .

                                                        (当值为false时, 会将之前的数据清空)

                                                        (当值为true时, 会接着之前的文件 继续存储)

               - FileOutputStream(File file); ***

                        通过文件的file对象 , 创建一个指向文件的输出流.

                - FileOutputStream(File file,boolean append); ***

                        参数1. file : 创建的流 , 指向的文件

                        参数2. append : 设置流是否为追加模式 .

                                                        (当值为false时, 会将之前的数据清空)

                                                        (当值为true时, 会接着之前的文件 继续存储)

2.4 InputStream 输入流

常用方法:

        - int read()

                一次读取一个字节,(这个字节 使用0-255的int值来表示) 并返回 , 如果读取到流的尾部则返回-1

        - int read(byte[] bytes); ***

                一次读取一个字节数组 , 并将读取的内容存储到bytes中 , 返回的是读取的字节个数 , 当读取到流尾部时返回-1

        - int read(byte[] bytes,int offIndex,int length)

                bytes: 读取的字节数组, 存储的位置

                offIndex: 读取的一组字节, 存储在bytes中的起始位置

                length: 读取的一组字节的长度

                这个方法读取完毕后, 新的数据存储在 bytes数组的 offIndex下标 到 offIndex+length下标

        - void close();

                关闭流, 释放资源.

2.4.1 FileInputStream 文件输入流

构造方法:

        - FileInputStream(String filePath);

                根据一个文件的路径, 创建一个指向此文件的输入流

        - FileInputStream(File file);

                根据一个file对象, 创建一个指向file表示文件的输入流.

  2.6 字符流

2.6.1 字符输出流 Writer ***

字符流进行输出操作时, 都是在操作缓冲管道. 当管道缓冲满时, 才会一次性 写出到文件中.

常用方法:

        - void write(int ch);

                一次写出一个字符

        - void write(char[] chars);

                一次写出一个字符数组

        - void write(char[] chars,int start,int end);

                一次写出一个字符数组的一部分. 从start开始 到end结束, 含start 不含end

        - void write(String text); ****

                一次写出一个字符串 到流指向的位置

        - void flush() ***

                刷新缓冲管道 : 强制将管道中的缓存数据 输出到流指向的位置, 并清空管道 !

        - void close(); ***

                释放资源, 字符输出流在关闭时 , 会自动执行flush操作.

2.6.2 FileWriter 文件字符输出流

构造方法:

        - FileWriter(String filePath); ***

                通过文件的绝对路径 , 创建一个指向文件的输出流.

        - FileWriter(String filePath,boolean append); ***

                参数1. filePath: 创建的流 , 指向的文件路径

                参数2. append : 设置流是否为追加模式 .

                        (当值为false时, 会将之前的数据清空)

                        (当值为true时, 会接着之前的文件 继续存储)

        - FileWriter(File file); ***

                通过文件的file对象 , 创建一个指向文件的输出流.

        - FileWriter(File file,boolean append); ***

                参数1. file : 创建的流 , 指向的文件

                参数2. append : 设置流是否为追加模式 .

                        (当值为false时, 会将之前的数据清空)

                        (当值为true时, 会接着之前的文件 继续存储)

字符输入流 Reader ***

常用方法:

        int read();

                一次读取一个字符, 并按照int的方式返回! 当读取到流尾部时 返回-1

        int read(char[] chars);

                一次读取一个字符数组, 并将读取到的数据存储到chars中, 返回读取的字符个数, 当读取到流的尾部时返回-1;

        int read(char[] chars,int offset ,int length);

                一次读取一个字符数组的一部分 , 读取的数据存储在chars中的 offset到length下标中 .

返回读取的字符个数, 当读取到流的尾部时返回-1

        void close();

                关闭流 ,释放资源

2.6.3FileReader 文件字符输入流 

构造方法:

        - FileReader(String filePath);

                根据一个文件的路径, 创建一个指向此文件的输入流

        - FileReader(File file);

                根据一个file对象, 创建一个指向file表示文件的输入流.

2.6.4 BufferedReader 逐行读取字符流 *****

        这个类是用于逐行读取字符的 .

        这个类 比较特殊, 它的构造方法不是传入文件地址, 而是传入其他的字符输入流!

构造方法:

        BufferedReader(Reader r);

常用方法:

        String readLine();

                读取一行数据, 返回读取到的内容, 如果读取到流的尾部返回null;

案例:

public static void main(String[] args) throws Exception {

        FileReader fr = new FileReader("d://heihei.txt");

        BufferedReader br = new BufferedReader(fr);

        StringBuffer sb = new StringBuffer();

        String text = null;

        while((text = br.readLine())!=null) {

                sb.append(text+"\r\n");

}

        System.out.println(sb.toString());

        br.close();

        fr.close();

}

2.7 打印流 (PrintStream | PrintWriter) *****

构造方法:

        1. PrintStream(OutputStream os) | PrintWriter(Writer w);

                根据一个流, 创建一个打印流.

        2. PrintStream(String filePath) | PrintWriter(String filePath); ***

                根据一个文件的绝对路径, 创建一个打印流

        3. PrintStream(File file) | PrintWriter(File file); ***

                根据一个文件的file对象, 创建一个打印流

        4. PrintStream(File file,String charsetName); | PrintWriter(File file,String charsetName);

                根据一个文件的file对象 和 字符编码名称 创建一个打印流

常用方法:

参考System.out.printXXX....

2.8 转换流 

用于将字节流 转换为 字符流 .

转换后得到的字符流, 操作的方式与 文件字符流一致 ;

2.8.1 OutputStreamWriter 字节转字符 输出流

通过构造方法, 进行转换:

        - OutputStreamWriter(OutputStream os);

                参数1. 根据一个字节流, 创建一个字符流

        - OutputStreamWriter(OutputStream os,Sting charsetName);

                参数1. 根据一个字节流, 创建一个字符流

                参数2. 字节流转换为字符流时, 使用的字符编码集的名称;

案例:

public static void main(String[] args) throws Exception {

        // 创建文件字节输出流

        FileOutputStream fos = new FileOutputStream("c://x.txt");

        // 准备输出的文字

        String text = "从前有座山, 山里有座老和尚";

        // 创建转换流, 将字节fos转换为字符流, 然后通过字符流 ,输出文字

        OutputStreamWriter osw = new OutputStreamWriter(fos);

        osw.write(text);

        osw.close();

        System.out.println("输出完毕");

}

2.8.2 InputStreamReader 字节转字符 输入流

通过构造方法, 进行转换:

        - InputStreamReader(InputStream is);

                参数1. 根据一个字节流, 创建一个字符流

        - InputStreamReader(InputStream is,Sting charsetName);

                参数1. 根据一个字节流, 创建一个字符流

                参数2. 字节流转换为字符流时, 使用的字符编码集的名称;

案例:

public static void main(String[] args) throws Exception {

        // 创建一个字节输入流

                FileInputStream fis = new FileInputStream("c://x.txt");

        // 将字节输入流, 转换为字符输入流

                InputStreamReader isr = new InputStreamReader(fis);

        // 再将一个字符流, 转换为逐行读取的流

                BufferedReader br = new BufferedReader(isr);

                String text = br.readLine();

                System.out.println(text);

                br.close();

                isr.close();

                fis.close();

}

2.9 对象序列化 

对象序列化流

指的是: 将Java中的对象,存储到本地文件中的过程.

构造方法:

ObjectOutputStream(OutputStream os)

常用方法:

writeObject(Object o);

对象反序列化流 

指的是: 将本地文件中存储的Java对象, 读取到内存中的过程.

构造方法:

ObjectInputStream(InputStream is);

常用方法:

Object o = 对象.readObject();

2.9.1 序列化接口 Serializable 

Java中我们编写的类的对象, 默认情况下是不能参与序列化.

需要实现一个标记接口: Serializable , 才可以被序列化

标记接口:

接口中不包含任何的抽象, 实现后对于实现类来说, 类的接口没有发生改变, 仅仅是多了一个父接口.

注意: 对象在序列化时, 会依次序列化它的属性值.

属性值的类型, 也必须实现序列化接口

2.9.2 在对象序列化时, 有两种特殊修饰的属性, 不会被序列化

1. 被static 修饰的属性不会被序列化. 因为静态的属性不依赖于对象, 我们的对象序列化操作, 就不会操作这些静态的属性;

2. 被transient修饰的属性 ,序列化时会被忽略 , 反序列化时是默认的值;

3、try - with - resources

所有实现了Closeable或AutoCloseable接口的类,都可以通过此方式关闭资源。

格式一 (JDK1.7) :

try(Closeable c = new Closeable()){

}catch(){

}

//c就会在finally中自动释放

格式二(JDK1.9) :

Java

try(Closeable对象1;Closeable对象2...){

}catch(){

}

//通过分号隔开的closeable对象都会在finally中自动释放

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值