balabla: IO流 即输入输出流iu是磁盘和内存的相互交互,直接在磁盘中读写数据在日常开发中往往会用到,尤其是一些管理系统经常需要表格的导入导出,日常图片的上传和读取,这些功能的基础都是流,因此掌握流的相关知识对以后直接使用第三方提供的工具可以更好的理解。

File类:

他是文件和目录路径的抽象表示,文件和目录可以通过File封装成对象,封装的对象仅仅是一个路径可以存在可以不存在

构造方法

File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。

绝对路径和相对路径

绝对路径:从盘符开始的路径

相对路径:相对于当前项目的路径  也可以根据模块名具体到项目下的模块

File file1 = new File("D:\\test.txt");
File file2 = new File("test.txt");
File file3 = new File("JAVA_SE\\src\\com\\youngchan\\io\\test.txt");

常用方法

boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件
boolean mkdir() 创建由此抽象路径名命名的目录。 // 只能创建单机目录
boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。boolean delete() 删除由此抽象路径名表示的文件或目录。 不走系统回收站,只能删除文件和空文件夹
boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
String getName() 返回由此抽象路径名表示的文件或目录的名称。
boolean isDirectory() 测试此抽象路径名表示的文件是否为目录。
boolean isFile() 测试此抽象路径名表示的文件是否为普通文件。 String getParent()
返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。
File getParentFile() 返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。
String getPath()  将此抽象路径名转换为路径名字符串。
boolean isHidden() 测试此抽象路径名命名的文件是否为隐藏文件。 String[] list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
File[] listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
当路径是一个文件时返回null;
当路径为一个空文件夹时返回一个长度为0的数组
当路径是一个有权限才能访问的文件夹时返回的是null

IO的分类

根据数据的流向分为:输入流输出流

  • 输入流 :把数据从其他设备上读取到内存中的流。
  • 输出流 :把数据从内存 中写出到其他设备上的流。

格局数据的类型分为:

字节流字符流(只操作纯文本文件,可以解决字节流产生的中文乱码问题)

  • 字节流 :以字节为单位,读写数据的流。
  • 字符流 :以字符为单位,读写数据的流。

ps:

字节流出现乱码的原因是 以字节为单位处理数据  一个中文 UTF-8 3个字节 GBK 2个字节所以乱码

IO操作过程:

创建对象 ; 写数据/读数据 ; 关闭资源

注意当写和读操作同一文件时需要分布操作 ,同时操作 写会清空读的内容造成空指针异常

顶级父类

输入流 输出流
字节流 字节输入流
InputStream
字节输出流
OutputStream
字符流 字符输入流
Reader
字符输出流
Writer

字节流

简介

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

字节输出流【OutputStream】

内存到硬盘
java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
  • public abstract void write(int b) :将指定的字节输出流。

小贴士:

close方法,当完成流的操作时,必须调用此方法,释放系统资源。

FileOutputStream类

OutputStream有很多子类,我们从最简单的一个子类开始。

java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。

构造方法

  • public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。
  • public FileOutputStream(File file, boolean append): 创建文件输出流以写入由指定的 File对象表示的文件。true 表示追加数据,false 表示清空
  • public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称写入文件。true 表示追加数据,false 表示清空

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据。

写出字节数据

写出字节write(int b) 方法,每次可以写出一个字节数据(写的是码表中所在字符)
写出字节数组write(byte[] b, int off, int len) len字节从位于偏移量 off的指定字节数组写入此文件输出流   write(byte[] b)b.length个字节从指定的字节数组写入此文件输出流。

写出指定长度字节数组write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节

小贴士:

  1. 虽然参数为int类型四个字节,但是只会保留一个字节的信息写出。
  2. 流操作完毕后,必须释放系统资源,调用close方法,千万记得。

写出换行

Windows系统里,换行符号是\r\n

  • 回车符\r和换行符\n :

    • 回车符:回到一行的开头(return)。
    • 换行符:下一行(newline)。
  • 系统中的换行:
    • Windows系统里,每行结尾是 回车+换行 ,即\r\n
    • Unix系统里,每行结尾只有 换行 ,即\n
    • Mac系统里,每行结尾是 回车 ,即\r。从 Mac OS X开始与Linux统一。

字节输入流

java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
  • public abstract int read(): 从输入流读取数据的下一个字节。
  • public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

小贴士:

close方法,当完成流的操作时,必须调用此方法,释放系统资源。

FileInputStream类

java.io.FileInputStream 类是文件输入流,从文件中读取字节。

构造方法

  • FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
  • FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException 。

读取字节数据

  1. 读取字节read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1  如果需要展示可以强转为char类型

小贴士:

  1. 虽然读取了一个字节,但是会自动提升为int类型。
  2. 流操作完毕后,必须释放系统资源,调用close方法,千万记得。
  1. 使用字节数组读取read(byte[] b),每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1

小贴士:

使用数组读取,每次读取多个字节,减少了系统间的IO操作次数,从而提高了读写的效率,建议开发中使用。

举个栗子:

    public static void testFile() {// 创建文件File file = new File("/1/createFile.txt");try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}byte[] bytes = ".YOUNGCHAN.".getBytes();byte[] bytes1 = ".CLUB".getBytes();FileOutputStream fileOutputStream = null;FileOutputStream fileOutputStream1 = null;try {// 创建文件流fileOutputStream = new FileOutputStream(file);//文件写入个WfileOutputStream.write(87);fileOutputStream.write(87);fileOutputStream.write(87);// 文件写入 .YOUNGCHAN.fileOutputStream.write(bytes);// 文件写入 CLUBfileOutputStream.write(bytes1,1,bytes1.length-1);} catch (IOException e) {e.printStackTrace();}finally {try {// 刷新流fileOutputStream.flush();//关闭流fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}try {// 不覆盖原文件继续写文件fileOutputStream1 = new FileOutputStream(new File("/1/createFile.txt"), true);// 写入换行fileOutputStream1.write("\r\n".getBytes());// 写入文字fileOutputStream1.write("这个博客厉害了".getBytes());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {//刷新流fileOutputStream1.flush();// 关闭流fileOutputStream1.close();} catch (IOException e) {e.printStackTrace();}}//读取文件FileInputStream fileInputStream =null;try {// 获取输入流fileInputStream = new FileInputStream(new File("/1/createFile.txt"));// 定义接收容器byte[] inputBytes = new byte[100];// 定义最大长度临时角标int len;// 定义使用容器循环获取while ((len = fileInputStream.read(inputBytes))!= -1){// 写入字节流 传入输入字节流截取用用信息System.out.println(new String(inputBytes, 0, len));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {// 关闭流fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}public static  void copyImg(){// 定义输出文件FileOutputStream outPutImg =null;// 定义输入文件FileInputStream inPutImg = null ;try {// 定义输出文件位置inPutImg =new FileInputStream(new File("C:\\Users\\admin\\Desktop\\图片\\2.jpg"));// 定义输入文件位置outPutImg =  new FileOutputStream(new File("C:\\Users\\admin\\Desktop\\123.jpg"));// 定义字节流长度byte[] img = new byte[100];// 定义临时角标int len ;// 使用容器循环获取内容while ((len=inPutImg.read(img))!= -1){// 循环将容器中的内容写入到输出文件流中outPutImg.write(img,0,len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {// 关闭输入流inPutImg.close();// 关闭输出流outPutImg.close();} catch (IOException e) {e.printStackTrace();}}}

字符流

字符输入流【Reader】

java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read(): 从输入流读取一个字符。
  • public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf 中。

FileReader类

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

小贴士:

  1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。

idea中UTF-8

  1. 字节缓冲区:一个字节数组,用来临时存储字节数据。

构造方法

  • FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
  • FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称。

当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream 。

读取字符数据

  1. 读取字符read方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1,循环读取

小贴士:虽然读取了一个字符,但是会自动提升为int类型。

  1. 使用字符数组读取read(char[] cbuf),每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回-1

字符输出流【Writer】

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

  • public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。
  • public void write(int c) :写出一个字符。
  • public void write(char[] cbuf):将 b.length字符从指定的字符数组写出此输出流。
  • public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。
  • public void write(String str) :写出一个字符串。

FileWriter类

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法

  • FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。
  • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。
  • FileWriter(String fileName, boolean append):

    构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。

当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。

基本写出数据

写出字符write(int b) 方法,每次可以写出一个字符数据

小贴士:

  1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。
  2. 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。

关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。

  • flush :刷新缓冲区,流对象可以继续使用。
  • close :关闭流,释放系统资源。关闭前会刷新缓冲区。
    小贴士:即便是flush方法写出了数据,操作的最后还是要调用close方法,释放系统资源。

写出其他数据

  1. 写出字符数组 :write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据,用法类似FileOutputStream
    2.写出字符串write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的数据,更为方便
    3.续写和换行:操作类似于FileOutputStream

public static void readerAndWriter() {try (FileReader fileReader = new FileReader(new File("/1/createFile.txt"));FileWriter fileWriter = new FileWriter(new File("/1/2/createFile.txt"), true)) {char[] charArray = new char[100];int len;fileWriter.write("\r\n");while ((len = fileReader.read(charArray)) != -1) {fileWriter.write(charArray, 0, len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

序列化流

概述

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据对象的类型对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化对象的数据对象的类型对象中存储的数据信息,都可以用来在内存中创建对象

ObjectOutputStream类

java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储

构造方法

  • public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream。

序列化操作

  1. 一个对象要想序列化,必须满足两个条件:
  • 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
    该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

// 继承Serializable 接口
public class RepositoryImpl extends _RepositoryImplBaseimplements Serializable
{
// 指定序列号private static final long serialVersionUID = 8458417785209341858L;
//  序列化时忽略 height 成员变量private transient double height;
}
  • 2.写出对象方法

  • public final void writeObject (Object obj) : 将指定的对象写出。

ObjectInputStream类

ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

构造方法

  • public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。

反序列化操作

如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream读取对象的方法:

  • public final Object readObject () : 读取一个对象
  • 当读不到对象时会抛出异常 所以多个对象直接用死循环,然后捕捉异常(java.io.EOFException) ;
  • 多个对象时可以放到 集合对象中序列化 读的时候也就只用读一个对象集合了
    对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常。

反序列化操作2

另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException异常。
发生这个异常的原因如下:

  • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
  • 该类包含未知数据类型
  • 该类没有可访问的无参数构造方法

Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

举个例子:

 public static  void serializationTest(){Teacher teacher = new Teacher("英语", "Chan", 35);try(    // 定义序列化输出流
//                ObjectOutputStream objectOutputStream =new ObjectOutputStream(new FileOutputStream(new File("/1/2/3/4/5/teacher.txt")));// 定义序列化输入流ObjectInputStream objectInputStream  =new ObjectInputStream(new FileInputStream(new File("/1/2/3/4/5/teacher.txt")));){// 输出teacher
//            objectOutputStream.writeObject(teacher);// 输入teacherTeacher teacher1 =(Teacher) objectInputStream.readObject();// 打印teacher方法teacher1.sayHell();// 打印teacher 年龄System.out.println(teacher1.getAge());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}static class Teacher implements Serializable{private static final long serialVersionUID = 1L;public String course;public String name;public transient int age;public void sayHell(){System.out.println(this.name+"老师教"+this.course);}public Teacher(String course, String name, int age) {this.course = course;this.name = name;this.age = age;}public int getAge() {return age;}}

缓冲流

概述

缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类:

  • 字节缓冲流BufferedInputStreamBufferedOutputStream
  • 字符缓冲流BufferedReaderBufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

字节缓冲流(仅仅提供缓冲区,操作实现依靠字节流)

构造方法

  • public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
  • public BufferedOutputStream(OutputStream out): 创建一个新的缓冲输出流。

字符缓冲流

构造方法

  • public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
  • public BufferedWriter(Writer out): 创建一个新的缓冲输出流。

特有方法

字符缓冲流的基本方法与普通字符流调用方式一致,不再阐述,我们来看它们具备的特有方法。

  • BufferedReader:public String readLine(): 读一行文字。读不到返回null
  • BufferedWriter:public void newLine():  写一行分隔符(换行),由系统属性定义符号

转化流(解决编码问题)

字符编码和字符集

字符编码

计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本f符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。

  • 字符编码Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。

字符集

  • 字符集 Charset:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。

计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBK字符集、Unicode字符集等。

可见,当指定了编码,它所对应的字符集自然就指定了,所以编码才是我们最终要关心的。

  • ASCII字符集 :

    • ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
    • 基本的ASCII字符集,使用7位(bits)表示一个字符,共128字符。ASCII的扩展字符集使用8位(bits)表示一个字符,共256字符,方便支持欧洲常用字符。
  • ISO-8859-1字符集
    • 拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。
    • ISO-5559-1使用单字节编码,兼容ASCII编码。
  • GBxxx字符集
    • GB就是国标的意思,是为了显示中文而设计的一套字符集。
    • GB2312:简体中文码表。一个小于127的字符的意义与原来相同。但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
    • GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。
    • GB18030:最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。
  • Unicode字符集 :
    • Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。
    • 它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF-32。最为常用的UTF-8编码。
    • UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。所以,我们开发Web应用,也要使用UTF-8编码。它使用一至四个字节为每个字符编码,编码规则:
      1. 128个US-ASCII字符,只需一个字节编码。
      2. 拉丁文等字符,需要二个字节编码。
      3. 大部分常用字(含中文),使用三个字节编码。
      4. 其他极少使用的Unicode辅助字符,使用四字节编码。

编码引出的问题

在IDEA中,使用FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。

InputStreamReader类

转换流java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

构造方法

  • InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流。
  • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流。

OutputStreamWriter类

转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

构造方法

  • OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流。
  • OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流。

举个例子

    public static void bufferFlow() {try (// 字节缓冲流BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File("/1/createFile.txt")));BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File("/1/2/3/createFile.txt")));// 字符缓冲流BufferedReader bufferedReader = new BufferedReader(new FileReader(new File("/1/2/3/createFile.txt")));BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File("/1/2/3/4/createFile.txt"),true));// 转换流InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(new File("C:\\Users\\admin\\Desktop\\test2.txt")),"GBK");OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(new File("C:\\Users\\admin\\Desktop\\test3.txt")),"UTF-8");){// 字节流复制文件int len;byte [] byteArray = new byte[100];while ((len = bufferedInputStream.read(byteArray))!=-1){bufferedOutputStream.write(byteArray,0,len);}bufferedOutputStream.flush();// 字符流复制文件//方式一
//             char [] charArray = new char[100];
//             while ((len = bufferedReader.read(charArray))!= -1 ){
//                 bufferedWriter.write(new String(charArray,0,len));
//             }
//             bufferedWriter.flush();bufferedWriter.newLine();// 方式二  字符流赋值文件String line ;while ((line=bufferedReader.readLine()) != null) {bufferedWriter.write(line);}// 转换流 读取文件指定编码 复制文件 指定编码int len2;char [] charArray2 = new char[100];while ((len2 = inputStreamReader.read(charArray2))!=-1){outputStreamWriter.write(charArray2,0,len2);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

打印流

概述

平时我们在控制台打印输出,是调用print方法和println方法完成的,这两个方法都来自于java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

PrintStream类

  • public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流。

构造举例,代码如下:

PrintStream ps = new PrintStream("ps.txt");

System.out就是PrintStream类型的,只不过它的流向是系统规定的,打印在控制台上

举个例子:

public static void printStream() {try (PrintStream printStream = new PrintStream(new File("/1/1.txt"));){System.setOut(printStream);System.out.println("这是通过打印流输出的文件");} catch (FileNotFoundException e) {e.printStackTrace();}}

Properties(配置类常用到peropertis,读取键值对)

是Map体系的集合 , 键值对的数据类型基本都定义为字符串,其中有关于IO相关的方法

方法

void load(InputStream inStream) 从输入字节流读取属性列表(键和元素对)。
void load(Reader reader) 以简单的线性格式从输入字符流读取属性列表(关键字和元素对)。
Object setProperty(String key, String value) 致电 Hashtable方法 put 。
void store(OutputStream out, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法加载到 Properties表中的格式输出流 键值对:
config.propertise
userName=xiaoxiao
passWord=123

例 :

 /*** @Author youngchan* @Description //通过 Properties 类 实现对.properties文件的写入和读取* @Date 16:17 2022/11/20* @param    null* @return**/private static void propertiesMethod() {try {//            OutputStream os = new FileOutputStream("properties.properties");
//            Properties properties = new Properties();
//            properties.put("userName","youngchan");
//            properties.put("passWord","123");
//            properties.store(os,"propertiesTry");
//            os.close();InputStream is = new FileInputStream("properties.properties");Properties properties = new Properties();properties.load(is);System.out.println(properties);is.close();} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}

getResourceAsStream()通过classname的类加载器加载文件。如果类来自JAR文件,那么就会从JAR文件中加载资源。FileInputStream用于从文件系统读取文件。

Java基础理论之IO流和其他流相关推荐

  1. java io字符输出流_灵魂一击!详解Java中的IO输入输出流

    什么是流?流表示任何有能力产生数据的数据源对象或者是有能力接收数据的接收端对象,它屏蔽了实际的I/O设备中处理数据的细节. IO流是实现输入输出的基础,它可以很方便地实现数据的输入输出操作,即读写操作 ...

  2. Java IO 字节流与字符流 (三)

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  3. Java基础系列——IO流

    2019独角兽企业重金招聘Python工程师标准>>> ---恢复内容开始--- Java对数据的操作都是通过流的方式,数据的输入和输出是相对内存来说的,将外设的数据读到内存:输入流 ...

  4. Java基础学习总结(13)——流IO

    2019独角兽企业重金招聘Python工程师标准>>> 一.JAVA流式输入/输出原理 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象 ...

  5. java中io流实现哪个接口_第55节:Java当中的IO流-时间api(下)-上

    标题图 Java当中的IO流(下)-上日期和时间日期类:java.util.Date 系统时间:long time = System.currentTimeMillis();public class  ...

  6. java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...

    一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...

  7. java高级之Io流

    1.1,什么是io流? 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作 ...

  8. java中关于IO流的知识总结(重点介绍文件流的使用)

    今天做软件构造实验一的时候,用到了java文件流的使用,因为之前学的不是很踏实,于是决定今天好好总结一下, 也方便以后的回顾. 首先,要分清IO流中的一些基础划分: 按照数据流的方向不同可以分为:输入 ...

  9. 详细讲解JAVA中的IO流

    一.流的概念        流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等.        ...

最新文章

  1. button按钮大小
  2. 数据算法——Spark二次排序
  3. http简介看这篇就够了
  4. c语言改u3d游戏,使用Unity3D怎么制作一个五子棋游戏
  5. python如何连续打印_Python实现批量打印功能
  6. 编码压缩新思路:面向QoE的感知视频编码
  7. 四叶草社交平台——十天冲刺(4)
  8. javascript 原生事件综合查询
  9. # SUMO 仿真建模
  10. ORACLE学习笔记-CentOS 7.2 Oracle 12C R2安装部署
  11. Linux命令之统计文件行数、字数、字符数-wc
  12. 软件需求工程 高校教学平台 培训计划
  13. 如何判断一笔交易是否属于欺诈 数据挖掘算法与现实生活中的应用案例
  14. 开发通用资料——常用接口引脚定义
  15. 3. 简单前馈神经网络模型及PyTorch实现
  16. 以太坊 智能合约 示例
  17. 大学女生学计算机人多吗,浙江大学计算机专业女生多吗
  18. linux高级命令干货
  19. 美美的圣诞树画出来-CoCube
  20. OpenGL立方体贴图

热门文章

  1. 毛驴也能网上买,农村淘宝想象空间到底有多大?
  2. 题解- [USACO09OCT]热浪Heat Wave
  3. java成员变量怎么赋值_给成员变量赋值的两种方法
  4. LAMP安装及启用测试
  5. Nokia N900刷android 2.3.4
  6. 阿尔法经济学:认识市场
  7. 怎么抠图最简单 教你一行Python代码去除照片背景
  8. 小米员工面试阿里感慨:base太低时,HR都不要流水了,网友:我3000都要背调
  9. 枚举及其结构的相关知识点
  10. 华为的深度学习框架介绍一下