Com.Java.Basis 第十四课 《File类 +IO流》简称字节的Ctrl+A Ctrl+C Ctrl+V(一)

简介: Com.Java.Basis 第十四课 《File类 +IO流》简称字节的Ctrl+A Ctrl+C Ctrl+V(一)

Com.Java.Basis 第十四课 《File类 +IO流》简称字节的Ctrl+A Ctrl+C  Ctrl+V.这篇文章我无法创造出经典:但是我可以编写出自己经典的文章。十六个小案例带你走进Java的IO流

第一部分:基础知识的积累:

1 初识Java IO

IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。



Java 中是通过流处理IO 的,那么什么是流?

流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。


当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。


一般来说关于流的特性有下面几点:

先进先出:最先写入输出流的数据最先被输入流读取到。

顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)

只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。


总结:以自己为中心看流是流入还是流出


2  IO流分类

IO流主要的分类方式有以下3种:

按数据流的方向:输入流、输出流

按处理数据单位:字节流、字符流

按功能:节点流、处理流


3 IO流方法


3.1 字节流方法

字节输入流InputStream主要方法:

read() :从此输入流中读取一个数据字节。

read(byte[] b) :从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

read(byte[] b, int off, int len) :从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

close():关闭此输入流并释放与该流关联的所有系统资源。

字节输出流OutputStream主要方法:

write(byte[] b) :将 b.length 个字节从指定 byte 数组写入此文件输出流中。

write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

write(int b) :将指定字节写入此文件输出流。

close() :关闭此输入流并释放与该流关联的所有系统资源。


3.2 字符流方法

字符输入流Reader主要方法:

read():读取单个字符。

read(char[] cbuf) :将字符读入数组。

read(char[] cbuf, int off, int len) : 将字符读入数组的某一部分。

read(CharBuffer target) :试图将字符读入指定的字符缓冲区。

flush() :刷新该流的缓冲。

close() :关闭此流,但要先刷新它。

字符输出流Writer主要方法:

write(char[] cbuf) :写入字符数组。

write(char[] cbuf, int off, int len) :写入字符数组的某一部分。

write(int c) :写入单个字符。

write(String str) :写入字符串。

write(String str, int off, int len) :写入字符串的某一部分。

flush() :刷新该流的缓冲。

close() :关闭此流,但要先刷新它。

另外,字符缓冲流还有两个独特的方法:

BufferedWriter类newLine() :写入一个行分隔符。这个方法会自动适配所在系统的行分隔符。

BufferedReader类readLine() :读取一个文本行。


4 加点扩展的内容


4.1 位、字节、字符

字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。

字符(Character)计算机中使用的字母、数字、字和符号,比如’A’、‘B’、’$’、’&'等。

一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。

字节与字符:

ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。

UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。

Unicode 编码中,一个英文为一个字节,一个中文为两个字节。

符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。

UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。

UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。

第二部分:进入主题IO流:十六个小案例带你走进Java的IO流

 

 

 

案例Demo展示的内容

案例一

概述:文件和目录(文件夹)路径名的抽象表示形式

路径的分类:

绝对路径:带有盘符号的路径

相对路径:没有带盘符号的路径,默认在根目录下

构造方法

File(String pathname):根据一个路径得到File对象

File(String parent, String child):根据一个目录和一个子文件/目录得到File对象

File(File parent, String child):根据一个父File对象和子文件/目录得到File对象


判断功能

public boolean isDirectory(): 判断是否是目录

public boolean isFile(): 判断是否是文件

public boolean exists(): 判断是否存在

public boolean canRead(): 判断是否可读

public boolean canWrite(): 判断是否可写

public boolean isHidden(): 判断是否隐藏


获取功能

public String getAbsolutePath(): 获取绝对路径

public String getPath(): 获取相对路径

public String getParent() 获取上一级路径,返回字符串,没有返回null

public File getParentFile() 获取上一级路径,返回File类型,没有返回nul

public long getTotalSpace() 返回总容量 单位字节

public long getFreeSpace() 返回剩余容量 单位字节

public String getName(): 获取名称

public long length(): 获取长度。字节数

public long lastModified(): 获取最后一次的修改时间,毫秒值

package com.JavaBasicsDemo9;
import java.io.File;
/**
 * 概述:文件和目录(文件夹)路径名的抽象表示形式
 * 路径的分类:
 * 绝对路径:带有盘符号的路径
 * 相对路径:没有带盘符号的路径,默认在根目录下
 * 构造方法
 * File(String pathname):根据一个路径得到File对象
 * File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
 * File(File parent, String child):根据一个父File对象和子文件/目录得到File对象
 */
public class Demo1Test {
    public static void main(String[] args) throws Exception {
        // 1  File(String pathname)
        //创建的文件目录在的路径
        File file = new File("E:\\demo\\nopainsnogains.ppt");
        System.out.println(file);//打印文件路径
        /**
         * (4)判断功能
         * public boolean isDirectory(): 判断是否是目录
         * public boolean isFile(): 判断是否是文件
         * public boolean exists(): 判断是否存在
         * public boolean canRead(): 判断是否可读
         * public boolean canWrite(): 判断是否可写
         * public boolean isHidden(): 判断是否隐藏
         */
        //判断文件夹是否有目录
        System.out.println(file.isDirectory());
        //判断是否有文件
        System.out.println(file.isFile());
        //判断是否存在
        System.out.println(file.exists());
        //判断是否可读
        System.out.println(file.canRead());
        //判断是否可以写
        System.out.println(file.canWrite());
        //判断是否隐藏
        System.out.println(file.isHidden());
/**
 * 5)获取功能
 * public String getAbsolutePath(): 获取绝对路径
 * public String getPath(): 获取相对路径
 * public String getParent() 获取上一级路径,返回字符串,没有返回null
 * public File getParentFile() 获取上一级路径,返回File类型,没有返回null
 * public long getTotalSpace() 返回总容量 单位字节
 * public long getFreeSpace() 返回剩余容量 单位字节
 * public String getName(): 获取名称
 * public long length(): 获取长度。字节数
 * public long lastModified(): 获取最后一次的修改时间,毫秒值
 */
        //获取绝对路径
        System.out.println(file.getAbsolutePath());
        //获取相对路径
        System.out.println(file.getPath());
        //获取上一级路径,返回字符串,没有返回null
        System.out.println(file.getParent());
        //获取上一级路径,返回File类型,没有返回null
        System.out.println(file.getParentFile());
        System.out.println(file.getCanonicalPath());
        System.out.println("返回总容量 单位字节" + file.getTotalSpace());
        System.out.println("返回剩余容量 单位字节" + file.getFreeSpace());
        System.out.println(file.getName());
        System.out.println(file.length());
        System.out.println(file.lastModified());
        //创建文件
        file.createNewFile();
        //创建目录文件夹
        //File file1 =new File("E:\\demo\\hello");
        //file1.mkdir();
        //创建文件多及目录
        File file2 = new File("E:\\demo\\aa\\ba\\ca\\da\\ea\\fa\\ga");
        file2.mkdirs();
        File f = new File("E:\\demo\\HelloWord.text");
        System.out.println(f);
        f.mkdir();
        System.out.println(f.isDirectory());
        System.out.println(f.isFile());
    }
}

案例二:

package com.JavaBasicsDemo9;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1Test2 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileOutputStream fos=null;
        try {
            //创建
            fos =new  FileOutputStream("E:\\demo\\File.txt" ,true);
            for (int i = 0; i <=5; i++) {
                System.out.println("ctrl+c ctrl+v");
                fos.write("窗前明月光意识地上床酒托人生能坎区因".getBytes());
                fos.write("\r\n".getBytes());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //释放资源
            try {
                if(fos!=null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

案例三:

package com.JavaBasicsDemo9;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1Test3 {
    public static void main(String[] args) throws IOException {
        //输入流中的ctrl+A  ctrl+C
        FileInputStream fis=new   FileInputStream("E:\\demo\\File.txt");
        //输出
        //Ctrl+v
        FileOutputStream fos =new  FileOutputStream("E:\\demo\\ctrlV.txt",true);
        int by;
        while((by=fis.read())!=-1) {
            fos.write(by);
        }
        fis.close();
        fos.close();
    }
}


Java程序员的ctrl+A ctrl+c  ctrl+v

案例四:

package com.JavaBasicsDemo9;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1Test4 {
    public static void main(String[] args) throws IOException {
        //输入
        FileInputStream fis=new   FileInputStream("E:\\demo\\AAA.txt");
        //输出
        FileOutputStream fos =new  FileOutputStream("E:\\demo\\BBB.txt",true);
        int by;
        while((by=fis.read())!=-1) {
            fos.write(by);
        }
        fis.close();
        fos.close();
    }
}

案例五:

package com.JavaBasicsDemo9;
import java.io.File;
public class Demo1Test5 {
    public static void main(String[] args)  throws Exception{
        // 1  File(String pathname)
        File file =new File ("E:\\demo\\AAA.text");
        System.out.println(file);
        //判断文件夹
        System.out.println(file.isDirectory());
        //判断文件
        System.out.println(file.isFile());
        //file文件路径
        System.out.println(file.exists());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getCanonicalFile());
        //创建文件
        file.createNewFile();
        //多及目录
        File file2 =new File("E:\\demo\\aa\\ba\\ca\\da\\ea\\fa\\ga");
        file2.mkdirs();
        File f =new File ("E:\\demo\\hellow.text");
        System.out.println(f);
        f.mkdir();
        System.out.println(f.isDirectory());
        System.out.println(f.isFile());
    }
}

File file =new File ("E:\\demo\\AAA.text"); 创建文件的方式

案例六:

package com.JavaBasicsDemo9;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1Test6 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileOutputStream fos=null;
        try {
            //创建
            fos =new  FileOutputStream("E:\\demo\\AAA.txt" ,true);
            for (int i = 0; i <=10; i++) {
//                System.out.println("NO PAINS");
                fos.write("我是转入的数据ctrl ".getBytes());
                fos.write("\r\n".getBytes());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //释放资源
            try {
                if(fos!=null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

案例七:

package com.JavaBasicsDemo9;
import java.io.File;
public class Demo1Test7 {
    public static void main(String[] args)  throws Exception{
        // 1  File(String pathname)
        //文件名
        File file =new File ("E:\\demo\\heerllo.text");
        System.out.println(file);
        //创建文件
        file.createNewFile();
        //创建目录文件夹
        File file1 =new File("E:\\demo\\hello");
        file1.mkdir();
        File file22 =new File("E:\\dem\\hert");
        //多及目录
        File file2 =new File("E:\\demo\\a\\b\\c");
        file2.mkdirs();
        File f =new File ("E:\\demo\\heerllowert.text");
        System.out.println(f);
        f.mkdir();
        System.out.println(f.isDirectory());
        System.out.println(f.isFile());
    }
}

案例八:

package com.JavaBasicsDemo9;
import java.io.File;
/**
 * File的删除文件
 */
public class Demo1Test8 {
    public static void main(String[] args) {
        File file =new File ("E:\\demo\\hello");
        //删除路径的文件夹
        file.delete();
        //不能伤处多及目录
        File file1 =new File ("E:\\demo\\hello");
        //删除路径的文件夹
        file.delete();
        //
        File file2 =new File ("E:\\demo\\a\\b\\c\\d\\e\\f");
        //删除路径的文件夹
        file2.delete();
    }
}
相关文章
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
81 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3月前
|
Java
缓冲流和转换流的使用【 File类+IO流知识回顾③】
这篇文章介绍了Java中缓冲流(BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter)和转换流(InputStreamReader, OutputStreamWriter)的使用,包括它们的构造方法和如何利用它们提高IO操作的效率及处理字符编码问题。
缓冲流和转换流的使用【 File类+IO流知识回顾③】
|
3月前
|
存储 Java 调度
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
这篇文章回顾了Java中FileInputStream、FileOutputStream、FileReader和FileWriter类的基本使用方法,包括读取和写入文件的操作,以及字符流和字节流的区别和应用场景。
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
|
3月前
|
Java
File类的基本使用【 File类+IO流知识回顾①】
这篇文章回顾了Java中File类的基本使用,包括创建File对象、获取文件数据信息、判断文件存在与否、创建和删除文件目录,以及遍历文件目录的方法。
File类的基本使用【 File类+IO流知识回顾①】
|
3月前
|
存储 Java
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
这篇文章介绍了Java中ObjectInputStream和ObjectOutputStream类的基本使用,这两个类用于实现对象的序列化和反序列化。文章解释了序列化的概念、如何通过实现Serializable接口来实现序列化,以及如何使用transient关键字标记不需要序列化的属性。接着,通过示例代码演示了如何使用ObjectOutputStream进行对象的序列化和ObjectInputStream进行反序列化。
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
37 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
85 1
|
2月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
50 0
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。