JavaIO流:主要知识点

Posted yhcboke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaIO流:主要知识点相关的知识,希望对你有一定的参考价值。

JavaIO流:主要知识点

File

介绍:

  • java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。
  • File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
  • 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。

File类常用构造器:

  • public File(String pathname)
    • pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
    • 如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
  • public File(String parent,String child)
    • 以parent为父路径,child为子路径创建File对象。
  • public File(File parent,String child)
    • 根据一个父File对象和子文件路径创建File对象。
  • 路径中的每级目录之间用一个路径分隔符隔开
    • windowsDOS系统默认使用“\\”来表示。
    • UNIX和URL使用“/”来表示。
    • 为了解决这个隐患,File类提供了一个常量:public static final String separator。根据操作系统,动态的提供分隔符。
      • 使用示例:

File类常用方法

  • public String getAbsolutePath():获取绝对路径。
  • public String getParent():获取上层文件目录路径。若无,返回null
  • public String getPath() :获取路径。
  • public String getName() :获取名称。
  • public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
  • public long lastModified() :获取最后一次的修改时间,毫秒值。
  • public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组。
  • public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组。
  • public boolean renameTo(File dest):把文件重命名为指定的文件路径。
  • public boolean isDirectory():判断是否是文件目录。
  • public boolean exists() :判断是否存在。
  • public boolean isFile() :判断是否是文件。
  • public boolean canRead() :判断是否可读。
  • public boolean canWrite() :判断是否可写。
  • public boolean isHidden() :判断是否隐藏。
  • public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
  • public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
  • public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建。
  • public boolean delete():删除文件或者文件夹。Java中的删除不走回收站。要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录
  • File类的使用示例:

JavaIO流

JavaIO原理

  • 输入input:读取外部数据(磁盘、光盘等存储设备的数据到程序(内存)中。
  • 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。

流的分类

  • 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)。
  • 按数据流的流向不同分为:输入流,输出流。
  • 按流的角色的不同分为:节点流,处理流。
    • 节点流:直接从数据源或目的地读写数据。
    • 处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
  • IO流体系图:

InputStreamReader

  • InputStreamReader 是所有输入流的基类。
  • InputStream(典型实现:FileInputStream),主要方法:
    • int read()
      • 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
    • int read(byte[] b)
      • 从此输入流中将最多 b.length 个字节的数据读入一个byte数组中。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取的字节数。
    • int read(byte[] b, int off,int len)
      • 将输入流中最多 len 个数据字节读入 byte 数组,从偏移量off开始存储。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值 -1。
    • public void close() throws IOException
      • 关闭此输入流并释放与该流关联的所有系统资源。
  • Reader主要方法:
    • int read()
      • 读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的Unicode码),如果已到达流的末尾,则返回 -1。
    • int read(char[] cbuf)
      • 将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
    • int read(char[] cbuf,int off,int len)
      • 将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
    • public void close() throws IOException
      • 关闭此输入流并释放与该流关联的所有系统资源。

OutputStreamWriter

  • OutputStreamWriter 非常相似,主要方法如下:
    • void write(int b/int c)
      • 将指定的字节写入此输出流。write的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。
    • void write(byte[] b/char[] cbuf)
      • b.length 个字节从指定的 byte 数组写入此输出流。
    • void write(byte[] b/char[] buff, int off, int len)
      • 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
    • void flush()
      • 刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。
    • void close()
      • 关闭此输出流并释放与该流关联的所有系统资源。
  • 因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数。
    • void write(String str)
    • void write(String str, int off, int len)
  • 使用示例:

节点流注意事项

  • 在写入一个文件时,如果使用构造器FileOutputStream(file),则目录下有同名文件将被覆盖。如果使用构造器FileOutputStream(file,true),则目录下的同名文件不会被覆盖,在文件内容末尾追加内容。
  • 在读取文件时,必须保证该文件已存在,否则报异常。
  • 字节流操作字节,比如:.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt。
  • 字符流操作字符,只能操作普通文本文件。最常见的文本文件:.txt,.java,.c,.cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文本文件。

处理流1:缓冲流

  • 为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。
  • 缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:
    • BufferedInputStreamBufferedOutputStream
    • BufferedReaderBufferedWriter
  • 当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区。
  • 当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。
  • 向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流。
  • 关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也会相应关闭内层节点流。
  • 如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出。
  • 使用示例:

处理流2:转换流

  • 转换流提供了在字节流和字符流之间的转换。字节流中的数据都是字符时,转成字符流操作更高效。很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。
  • Java API提供了两个转换流:
    • InputStreamReader
      • InputStream转换为Reader,实现将字节的输入流按指定字符集转换为字符的输入流。需要和InputStream"套接"。
      • 构造器:
        • public InputStreamReader(InputStream in)
        • public InputSreamReader(InputStream in,String charsetName)
          • 使用:Reader isr = new InputStreamReader(System.in,"gbk")
    • OutputStreamWriter
      • Writer转换为OutputStream,实现将字符的输出流按指定字符集转换为字节的输出流。需要和OutputStream"套接"。
      • 构造器:
        • public InputStreamReader(InputStream in)
          - public InputSreamReader(InputStream in,String charsetName)
          • 使用: Reader isr = new InputStreamReader(System.in,"gbk")
    • 使用示例:

处理流3:标准输入输出流

  • System.inSystem.out分别代表了系统标准的输入和输出设备。默认输入设备是:键盘,输出设备是:显示器。
  • System.in的类型是InputStreamSystem.out的类型是PrintStream,其是OutputStream的子类。
  • 重定向:通过System类的setInsetOut方法对默认设备进行改变。
    • public static void setIn(InputStream in)
    • public static void setOut(PrintStream out)
  • 使用示例:
    • BufferedReader br = new BufferedReader(new InputStreamReader(System.in)), 把"标准"输入流(键盘输入)这个字节流包装成字符流,再包装成缓冲流

处理流4:打印流

  • 实现将基本数据类型的数据格式转化为字符串输出。
  • 打印流:PrintStreamPrintWriter
    • 提供了一系列重载的print()println()方法,用于多种数据类型的输出。
    • PrintStreamPrintWriter的输出不会抛出IOException异常。
    • PrintStreamPrintWriter有自动flush功能。
    • PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。
    • System.out返回的是PrintStream的实例。
  • 使用示例:

处理流5:数据流

  • 为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流。
  • 数据流有两个类:(用于读取和写出基本数据类型、String类的数据)
    • DataInputStreamDataOutputStream
    • 分别"套接"在 InputStreamOutputStream 子类的流上。
    • 主要方法如下:
      • boolean readBoolean()
      • byte readByte()
      • char readChar()
      • float readFloat()
      • double readDouble()
      • short readShort()
      • long readLong()
      • int readInt()
      • String readUTF()
      • void readFully(byte[] b)
  • 使用示例:

处理流6:对象流

  • 用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
  • 处理流的两个类为:ObjectInputStreamOjbectOutputSteam
  • 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制。流程如下:
    • 创建一个 ObjectOutputStream
    • 调用 ObjectOutputStream 对象的 writeObject(对象) 方法输出可序列化对象
    • 注意写出一次,操作flush()一次。
  • 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制。流程如下:
    • 创建一个 ObjectInputStream
    • 调用 readObject() 方法读取流中的对象。
  • 对象序列化的要求:
    • 类必须实现如下两个接口之一:SerializableExternalizable。否则,会抛出NotSerializableException异常。
    • 如果序列化的类中某个属性不是基本数据类型或String类型,而是另一个引用类型,那么这个引用类型必须是可序列化的(就是它也要实现那两个接口)。
    • 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:
      • private static final long serialVersionUID
      • serialVersionUID用来表明类的不同版本间的兼容性。其目的是以序列化对象进行版本控制,有关各版本反序列化时是否兼容。(比如存对象时使用的UID是1,后面你对类进行了修改,UID改为了3,那么此时取出的对象和当前已修改了的新对象不兼容)。serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)
      • 如果类没有显示定义这个静态常量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID 可能发生变化。故建议,显式声明。
  • 使用示例:

JavaIo流总结

JavaIo流总结

1.学习javaIo流前置知识

1.先了解计算机存储单位的换算

8bit(只能存放1和0的单位,最小的存储单位)= 1Byte(字节)
Byte (B) = 8 bit
1 Kilo Byte (KB) = 1024 B
1 Mega Byte (MB) = 1024 KB
1 Giga Byte (GB)= 1024 MB
1 Tera Byte (TB)= 1024 GB
1 Peta Byte (PB) = 1024 TB
1 Exa Byte (EB) = 1024 PB
1 Zetta Byte (ZB) = 1024 EB
1 Yotta Byte (YB) = 1024 ZB
1 Bronto Byte (BB) = 1024 YB
1 Nona Byte (NB) =1024 BB
1 Dogga Byte (DB) =1024 NB
1 Corydon Byte (CB) = 1024 DB
1 Xero Byte (XB) = 1024 CB

2.io流的分类

1.按照功能来区分

  • 字节流:节流操作的单元是数据单元是8位的字节
  • 字符流:字符流操作的是数据单元为16位的字符

2.按照输出方向来区分

  • 输入流:往内存中读叫做输入流,也就是将磁盘上的文件读取到内存中
  • 输出流:将内存中的数据输出到磁盘上就叫做输出流

File类的常用方法

在java中,所有的文件路径和都被抽象为一个叫做File的类,这个类是用来操作我们电脑中的文件的。

public String getAbsolutePath() :返回此File的绝对路径名字符串。
注意:无论路径是绝对的还是相对的,getAbsolutePath方法返回的都是绝对路

public String getPath() :将此File转换为路径名字符串, 获取的构造方法中传递的路径
注意:将此File转换为路径名字符串。
public String getName() :返回由此File表示的文件或目录的名称。

public long length() :返回由此File表示的文件的长度。
注意:
文件夹是没有大小概念的,不能获取文件夹的大小
如果构造方法中给出的路径不存在,那么length方法返回0

public boolean exists() :此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。(判断构造方法的路径是否以文件夹结尾)
public boolean isFile() :此File表示的是否为文件。(判断构造方法的路径是否以文件结尾)

public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete() :删除由此File表示的文件或目录。(不走回收站,谨慎操作!)
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。

public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

File的案例实战:查询某个路径下的文件是否存在


    /**
     * 查询某个路径下的某个文件是否存在
     * @param filePath 文件路径
     * @param fileName 文件名称
     * @return 如果存在 返回该文件的的绝对路径
     */
    public static String fileIsExist(String filePath,String fileName)
        if (!(fileName!=null && fileName.length()>0) || !(filePath!=null && filePath.length()>0))
            throw new IllegalArgumentException("文件名称或者文件路径不能为空");
        
        File file = new File(filePath);
        File[] files = file.listFiles();
        System.out.println(Arrays.toString(files));
        for (int i = 0; i<files.length; i++) 
            if (files[i].isFile() )
                if (files[i].getName().equals(fileName))
                    return  files[i].getAbsolutePath();
                

            else  // 如果不是文件继续向下递归
                fileIsExist(files[i].getAbsolutePath(),fileName);
            
        
        return null;
    

2.io流的继承体系

此图在我在网上找的,感谢这位网友的图。 https://blog.csdn.net/weixin_44411569

我们需要知道四个顶级的接口

字节流

  • java.io.InputStream 字节输入流
  • java.io.OutputStream 字节输出流

字符流

  • java.io.Reader 字符输入流
  • java.io.Writer 字符输出流

所有的流(输入输出)都实现了 java.io.Closeable接口,都是可关闭的,都有close()方法。
流毕竟是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭。

所有的输出流都实现了 java.io.Flushable接口,都是可刷新的,都有flush()方法。
养成一个好习惯,输出流在最终输出之后,一定要记得flush()
刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据
强行输出完(清空管道!)刷新的作用就是清空管道。
注意:如果没有flush()可能会导致丢失数据。

3.字节流

3.1 FileInputStrame

字节流是万能流,既可以读取文本,也可以读取二进制文件,比如视频,图片等文件。

他可以三种读取方式:

		   // (一次读一个byte数组,从什么位置开始读,读取的长度)
		   int read(byte b[], int off, int len)
            // 一次读一个字节   
            int in.read();
		   // 一次读一个byte数组,byte数组有多大,就读取多少内容	
            int in.read(byte[] b);

案例:读取一个文件中的文本内容,并且输出到控制台

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStrameTest 
    public static void main(String[] args) 
        File file = new File("file/dengGao.txt");
        byte[] bytes = new byte[1024];
        FileInputStream  in = null;
        try
            in = new FileInputStream(file);
            // 每次读取的字节数,读取完的时候返回-1
            int readCount = 0;
            // 将每次读取到的内容放到这个字符串中
            StringBuffer redContent = new StringBuffer();
            // 循环读取文件中的内容,每次读取1KB,直到读取完毕为止
            while ((readCount =in.read(bytes))!=-1)
                redContent.append(new String(bytes,0,readCount));
            
            System.out.println(redContent);
        catch (IOException e)
            e.printStackTrace();
        finally 
            try 
                in.close();
             catch (IOException e) 
                e.printStackTrace();
            
        

    

3.2 FileOutputStream

案例:将内存中的字符串写入到文本中


import java.io.*;

public class FileOutputStreamTest 

    public static void main(String[] args) 

        String wirteContent = "     长恨歌" +
                "作者:白居易\\n" +
                "汉皇重色思倾国,御宇多年求不得。\\n" +
                "杨家有女初长成,养在深闺人未识。\\n" +
                "天生丽质难自弃,一朝选在君王侧。\\n" +
                "回眸一笑百媚生,六宫粉黛无颜色。\\n" +
                "春寒赐浴华清池,温泉水滑洗凝脂。\\n" +
                "侍儿扶起娇无力,始是新承恩泽时。\\n" +
                "云鬓花颜金步摇,芙蓉帐暖度春宵。\\n" +
                "春宵苦短日高起,从此君王不早朝。\\n" +
                "承欢侍宴无闲暇,春从春游夜专夜。\\n" +
                "后宫佳丽三千人,三千宠爱在一身。\\n" +
                "金屋妆成娇侍夜,玉楼宴罢醉和春。\\n" +
                "姊妹弟兄皆列土,可怜光彩生门户。\\n" +
                "遂令天下父母心,不重生男重生女。\\n" +
                "骊宫高处入青云,仙乐风飘处处闻。\\n" +
                "缓歌慢舞凝丝竹,尽日君王看不足。\\n" +
                "渔阳鼙鼓动地来,惊破霓裳羽衣曲。\\n" +
                "九重城阙烟尘生,千乘万骑西南行。\\n" +
                "翠华摇摇行复止,西出都门百余里。\\n" +
                "六军不发无奈何,宛转蛾眉马前死。\\n" +
                "花钿委地无人收,翠翘金雀玉搔头。\\n" +
                "君王掩面救不得,回看血泪相和流。\\n" +
                "黄埃散漫风萧索,云栈萦纡登剑阁。\\n" +
                "峨嵋山下少人行,旌旗无光日色薄。\\n" +
                "蜀江水碧蜀山青,圣主朝朝暮暮情。\\n" +
                "行宫见月伤心色,夜雨闻铃肠断声。\\n" +
                "天旋日转回龙驭,到此踌躇不能去。\\n" +
                "马嵬坡下泥土中,不见玉颜空死处。\\n" +
                "君臣相顾尽沾衣,东望都门信马归。\\n" +
                "归来池苑皆依旧,太液芙蓉未央柳。\\n" +
                "芙蓉如面柳如眉,对此如何不泪垂。\\n" +
                "春风桃李花开夜,秋雨梧桐叶落时。\\n" +
                "西宫南苑多秋草,落叶满阶红不扫。\\n" +
                "梨园弟子白发新,椒房阿监青娥老。\\n" +
                "夕殿萤飞思悄然,孤灯挑尽未成眠。\\n" +
                "迟迟钟鼓初长夜,耿耿星河欲曙天。\\n" +
                "鸳鸯瓦冷霜华重,翡翠衾寒谁与共。\\n" +
                "悠悠生死别经年,魂魄不曾来入梦。\\n" +
                "临邛道士鸿都客,能以精诚致魂魄。\\n" +
                "为感君王辗转思,遂教方士殷勤觅。\\n" +
                "排空驭气奔如电,升天入地求之遍。\\n" +
                "上穷碧落下黄泉,两处茫茫皆不见。\\n" +
                "忽闻海上有仙山,山在虚无缥渺间。\\n" +
                "楼阁玲珑五云起,其中绰约多仙子。\\n" +
                "中有一人字太真,雪肤花貌参差是。\\n" +
                "金阙西厢叩玉扃,转教小玉报双成。\\n" +
                "闻道汉家天子使,九华帐里梦魂惊。\\n" +
                "揽衣推枕起徘徊,珠箔银屏迤逦开。\\n" +
                "云鬓半偏新睡觉,花冠不整下堂来。\\n" +
                "风吹仙袂飘飖举,犹似霓裳羽衣舞。\\n" +
                "玉容寂寞泪阑干,梨花一枝春带雨。\\n" +
                "含情凝睇谢君王,一别音容两渺茫。\\n" +
                "昭阳殿里恩爱绝,蓬莱宫中日月长。\\n" +
                "回头下望人寰处,不见长安见尘雾。\\n" +
                "惟将旧物表深情,钿合金钗寄将去。\\n" +
                "钗留一股合一扇,钗擘黄金合分钿。\\n" +
                "但令心似金钿坚,天上人间会相见。\\n" +
                "临别殷勤重寄词,词中有誓两心知。\\n" +
                "七月七日长生殿,夜半无人私语时。\\n" +
                "在天愿作比翼鸟,在地愿为连理枝。\\n" +
                "天长地久有时尽,此恨绵绵无绝期。\\n";

        FileOutputStream os = null;
        try 
            File file = new File("file/changHenGe");
            os = new FileOutputStream(file);
            byte[] bytes = wirteContent.getBytes("utf-8");
            // 将一个byte数组的内容直接写入到磁盘
            os.write(bytes);
            // 写完后记得刷新管道
            os.flush();
         catch (FileNotFoundException e) 
            e.printStackTrace();
         catch (UnsupportedEncodingException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        finally 
            try 
                os.close();
             catch (IOException e) 
                e.printStackTrace();
            
        
    


3.3 使用FileInputStrame 和 FileOutputStream完成文件的复制

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyStreamTest 
    public static void main(String[] args) 
        FileInputStream in = null;
        FileOutputStream os = null;
        try 
             in = new FileInputStream("file/sources.txt");
             os = new FileOutputStream("file/target.txt");
            //一次最多读1字节
            byte [] bytes = new byte[1024];
            int readCount = 0;
            while ((readCount = in.read(bytes)) != -1)
                // write(byte数组,bytes中的起始偏移量,需要写入的字节数);
                // 核心点在于每次读多少,就写入多少
                os.write(bytes,0,readCount);
            
            os.flush();

         catch (Exception e) 
            e.printStackTrace();
        finally 
            // 记住流用完一定要关闭,如果有多个流需要分开try,否则会影响其他流的关闭
            try 
                in.close();
             catch (IOException e) 
                e.printStackTrace();
            
            try 
                os.close();
             catch (IOException e) 
                e.printStackTrace();
            
        

    


3.4 BufferedInputStream

案例:使用BufferedInputStream读取磁盘上的文件

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedInputStreamTest 
    public static void main(String[] args) 
        try (
                BufferedInputStream in = new BufferedInputStream(new FileInputStream("copy/sources.txt"))
        )
            byte[] bytes = new byte[1024];
            int readCount = 0;
            while ((readCount =  in.read(bytes)) !=-1)
                System.out.println(new String(bytes));
            
        catch (IOException e)
            e.printStackTrace();
        
    

3.5 BufferedOutputStream

使用 BufferedOutputStream向文件中写入的内容

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedOutputStreamTest 
    public static void main(String[] args) 
        String content = "        登高\\n" +
                "            作者:杜甫\\n" +
                "风急天高猿啸哀,渚清沙白鸟飞回。\\n" +
                "无边落木萧萧下,不尽长江滚滚来。\\n" +
                "万里悲秋常作客,百年多病独登台。\\n" +
                "艰难苦恨繁霜鬓,潦倒新停浊酒杯。";
        try (BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream("copy/target.txt"));)
            os.write(content.getBytes("utf-8"));
            os.flush();
         catch (IOException e) 
            e.printStackTrace();
        
    


3.6 完成目录的深层拷贝

import java.io.*;

public class DirCopyTest 
    public static void main(String[] args) throws IOException 
        File srcFolder = new File("D:\\\\IDE2019\\\\code\\\\javase-io\\\\file");
        File destFolder = new File("D:\\\\IDE2019\\\\code\\\\javase-io\\\\copy");
        copyFolder(srcFolder, destFolder);
    

    /**
     * 复制多级文件夹
     *
     * @param srcFolder  源文件夹
     * @param destFolder 目的文件夹
     * @throws IOException
     */
    private static void copyFolder(File srcFolder, File destFolder) throws IOException 
        // 判断路径是否存在
        if (!destFolder.exists()) 
            destFolder.mkdirs();
        
        // 获取目的文件列表
        File[] listFiles = srcFolder.listFiles();
        // 遍历目的文件列表
        for (File file : listFiles) 
            if (file.isDirectory()) 
                copyFolder(file, new File(destFolder, file.getName()));
             else 
                copyFile(file, new File(destFolder, file.getName()));
            
        
    

    /**
     * 复制文件
     * @param srcFile  源文件
     * @param destFile 目的文件
     * @throws IOException
     */
    private static void copyFile(File srcFile, File destFile) throws IOException 
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1) 
            bos.write(bys, 0, len);
        
        bos.close();
        bis.close();
    


3.7 ByteArrayInputStream

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class ByteArrayInputStreamTest 
    public static void main(String[] args) 
        String content = "hello world";
        // 如

以上是关于JavaIO流:主要知识点的主要内容,如果未能解决你的问题,请参考以下文章

Java知识面试题复习JavaIO流和反射

JavaIo流总结

JavaIO流学习总结-字符流总结

Java基础知识回顾之六 ----- IO流

Java基础知识回顾之六 ----- IO流

JavaIO(03)字节流--FileOutputStream