黑马程序员 第五篇 Java I/O (foundation, completed)

——- android培训java培训、期待与您交流! ———-

目录

1 I/O流简介
什么是I/O流
节点流与处理流
字节流与字符流
抽象基类
1. InputStream类
2. OutputStream类
3. Reader类
4. Writer类

2 使用流进行文件操作
2.1 使用File类进行文件与目录操作
2.2 FileInputStream类 与 FileOuputStream类
2.3 FileReader类 与 FileWriter类

————————————————————————————

Java中的流,可以从不同的角度进行分类

这里写图片描述

这里写图片描述

definition

Java中的数据流分为两种,一种是字节流,另一种是字符流。这两种流主要由4个抽象类来表示,分别为InputStream, OutputSteam, Reader, Writer,输入输出各两种。其中InputStream和OutputStream表示字节流,Reader和Writer表示字符流,其他各种各样的流均是继承这4个抽象类而来

按照数:输入流和输出流。
按照处理数据单位不同可以分为:字节流和字符流。
按照实现功能不同可以分为:节点流和处理流。


字节流与字符流

字节流:一次读入或读出是8位二进制。例如声音,图像等数据

字符流:一次读入或读出是16位二进制。例如文本文件,网络中发送的文本信息

字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是Reader,Writer是字符流。


节点流(Node Streams) 与处理流 (Processing Streams)

节点流一般用于直接从指定的位置进行读/写操作,例如磁盘文件,内存区域,网络连接等,其中一般只提供了一些基本的读写操作方法,功能比较单一。

节点流:直接与数据源相连,读入或读出。
这里写图片描述

直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。

=====分割线=====

处理流往往是用于对其他输入/输出流进行封装, 对内容进行过滤处理,其中一般提供了一些功能比较强大的读写方法。

处理流:与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。

实际应用中

通常是将节点流与处理流二者结合起来使用。节点流直接与指定的源或目标相连,例如某个文件,某个网络连接等。
而处理流则对节点流或其他处理流进一步进行封装,提供更丰富的输入/输出操作能力,例如缓冲,按字符串行读写等

这里写图片描述

Jdk提供的流继承了四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。

Java中常用的I/O流

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

简单介绍其上图:
对文件进行操作:

  • FileInputStream(字节输入流)
  • FileOutputStream(字节输出流)
  • FileReader(字符输入流)
  • FileWriter(字符输出流)

对管道进行操作:

  • PipedInputStream(字节输入流)
  • PipedOutStream(字节输出流)
  • PipedReader(字符输入流)
  • PipedWriter(字符输出流)

PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。
字节/字符数组:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了一个字节或字符数组。

Buffered缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。

转化流:InputStreamReader/OutputStreamWriter,把字节转化成字符。
数据流:DataInputStream,DataOutputStream。

因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。

打印流:printStream,printWriter,一般是打印到控制台,可以进行控制打印的地方。
对象流:ObjectInputStream,ObjectOutputStream,把封装的对象直接输出,而不是一个个在转换成字符串再输出。
序列化流:SequenceInputStream。
对象序列化:把对象直接转换成二进制,写入介质中。
使用对象流需要实现Serializable接口,否则会报错。而若用transient关键字修饰成员变量,不写入该成员变量,若是引用类型的成员变量为null,值类型的成员变量为0.

2 使用流进行文件操作

Java中专门提供了一个表示目录与文件的类—–java.io.File, 通过其可以获取文件,目录的信息,对文件,目录进行管理。

public File(String panthname)
public File(String parent, String child)
public File(File parent, String child)

下面代码是一个创建文件对象的程序

import java.io.*
public class Liu
{
    public static void main(String[] args)
    {
        File f1 = new File("C:\\");

        //创建file文件
        File f2 = new File("C:\\a.txt");
        if(f1.isDirectory())
        {
            System.out.println("f1对象表示的是目录");
        }else if(f1.isFile())
        {
            System.out.println("f1对象表示的是文件");
        }



        if(f2.isDirectory())
        {
            System.out.println("f2对象表示的是目录");
        }else if(f2.isFile())
        {
            System.out.println("f2对象表示的是文件");
        }


    }
}



输出结果:

打印   f1对象表示的是目录
      f2对象表示的是文件

如下是使用exists方法判断文件或牧师是否存在的程序

import java.io.*;
public class Liu
{
    public static void main(String[] args)
    {
        File f1 = new File("C:\\b.txt");
        if(!f1.exists())
        {

            try
            {
                System.out.println("文件不存在,创建该文件");
                f1.createNewFile();
                System.out.println("创建成功!");
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }

        }

        if(f1.isDirectory())
        {
            System.out.println("f2对象表示的是目录,目录名为: " + f1.getName());
        }else if(f1.isFile()){
            System.out.println("f2对象表示的是文件,文件名为: " + f1.getName());
            System.out.println("路径为: "+ f1.getPath());
        }

    }
}


运行结果:

第一次结果

        文件不存在,创建该文件
        创建成功!
        f2对象表示的是文件,文件名为b.text
        路径为:C:\b.txt


第二次结果
        f2对象表示的是文件,文件名为b.text
        路径为:C:\b.txt




2.2 FileInputStream类与FileOutputStream类

FileInputStream类是InputStream的子类: 主要用于从文件系统中的某个文件中获取输入字节。
FileOutputStream类是OutputStream的子类: 主要用于将数据以字节流写入目标文件的输出流。

每次使用完流对象之后,都必须要调用close()方法进行显示的关闭操作

以下代码演示使用FileInputStream类的程序

一个使用FileInputStream类的程序

import java.io.*;
public class FileIS
{
    public static void main(String[] args)
    {
        //创建File对象
        File f = new File("c:\\c.txt");

        //创建FileInputStream对象
        FileInputStream fis = new FileInputStream(f);


        char ch;
        for(int i=0; i<f.length(); i++)
        {
            //读取内容
            ch=(char)fis.read();
            //显示
            System.out.print(ch);
        }

        //关闭
        fis.close();
    }
}

输出结果:

asdf
qwer
zxcv

一个使用FileOutputStream类的程序

import java.io.*;
public class FileOS
{
    public static void main(String[] args)throws IOException
    {
        //创建两个File对象
        File f = new File("c:\\d.txt");
        //创建FileOnputStream对象
        FileOutputStream fos = new FileOutputStream(f);

        //写入
        for(int i='a'; i<'z'; i++)
        {
            fos.write(i);
        }

        fos.close();

    }
}


输出结果

C盘中有一个d.txt

abcdefg.......z

Tips
FileInputStream类和FileOutputStream类经常一起配合使用,最经常的使用就是读取一个文件中的信息,然后将信息复制到另一个文件中

一个FileInputStream类和FileOutputStream类结合使用的程序

import java.io.*;
public class FisFos
{
    public static void main(String[] args)throws IOException
    {
        //创建两个File对象
        File f1=new File("c:\\1.txt");
        File f2=new File("c:\\2.txt");

        //创建FileInputStream对象
        FileInputStream fis = new FileInputStream(f1);
        //创建FileOutputStream对象
        FileOutputStream fos = new FileOutputStream(f2);

        byte[] b = new byte[(int)f1.length()];
        //读取1文件
        fis.read(b);
        //写入2文件
        for(int i=0; i<f1.length(); i++)
        {
            fos.write(b[i]);
        }
        fix.close();
        fox.close();
    }
}


代码解析:


在本程序中首先创建了两个File对象,要对应的指定的位置创建这两个文件。其
中f1是一个被读取文件,f2是一个要写入的文件。该程序看起来功能复杂,其实
只是简单地从一个文件读取信息,然后将信息写入到另一个文件。

2.3 FileReader类与FileWriter类


import java.io.*;
public class Liu6 
{
    public static void main(String[] args) 
    {
        File f = new File("C://aaa.txt");       //创建一个File类对象
        String str = "FileReader and FileWriter";
        char[] buffer = new char[str.length()];//创建一个char数组,初始化大小为str字符串对象的长度
        buffer = str.toCharArray();
        try 
        {
            if (!f.exists()) 
            {
                f.createNewFile();
            }
            FileWriter writer = new FileWriter(f);
            writer.write(buffer);           //输出整个字符数组到文件
            writer.close();
            //从文件中读取数据
            FileReader reader1 = new FileReader(f); //从文件头读取所有数据
            char[] result1 = new char[20];
            int i1 = reader1.read(result1);
            System.out.println("读取文件中所有字符,字符数为:" + i1);
            System.out.println(result1);
            FileReader reader4 = new FileReader(f);
            char[] result4 = new char[100];     //从文件中逐个读取字符,直到文件末尾,返回-1
            int i = 0;
            System.out.println("从文件中逐个读取字符:");
            while (i != -1) 
            {
                i = reader4.read();
                if (i != -1) 
                {
                    System.out.print(String.valueOf(Character.toChars(i)) + ";");
                }
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}





        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

输出结果:

读取文件中所有字符,字符数为:20
FileReader and FileW
从文件中逐个读取字符:
F;i;l;e;R;e;a;d;e;r;  ;a;n;d; ;F;i;l;e

Reference :

深入分析 Java I/O 的工作机制
http://www.ibm.com/developerworks/cn/java/j-lo-javaio/
Java I/O流概念分析整理
http://blog.csdn.net/yuebinghaoyuan/article/details/7388059
IO流 小结 (提高篇 BufferedInputStream, PipedInputStream)
http://blog.csdn.net/zzp_403184692/article/details/8057693

——- android培训java培训、期待与您交流! ———-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值