IO流-初探IO

版权声明:转载需声明本人出品 https://blog.csdn.net/weixin_40288381/article/details/88597276

概述

在这里插入图片描述
我们将数据的传输比作数据的流动,按照流动的方向,以内存为基准,即流向内存是输入流,流出内存为输出流。可以将Java对象当作第一人称,读取外部即为输入,写到外部即为输出
根据数据的流向

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

根据数据类型

  1. 字节流:以字节为单位进行读写数据的流
  2. 字符流:以字符为单元进行读写数据的流

一个字节为8个二进制位–对应Java数据类型为byte;一个字符为两个字节–对应Java数据类型为char

顶级父类

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

字节流

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

字节输出流(OutputStream)

public abstract class OutputStream implements Closeable, Flushable {
  
  	//指定的字节输出流
    public abstract void write(int b) throws IOException;

 	//将b.length字节从指定的字节数组写入此输出流
    public void write(byte b[]) throws IOException {
        write(b, 0, b.length);
    }

    //从指定的字节数组写入len字节,从偏移量off开始输出此输出流
    public void write(byte b[], int off, int len) throws IOException {
        if (b == null) {
            throw new NullPointerException();
        } else if ((off < 0) || (off > b.length) || (len < 0) ||
                   ((off + len) > b.length) || ((off + len) < 0)) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return;
        }
        for (int i = 0 ; i < len ; i++) {
            write(b[off + i]);
        }
    }

  	//刷新此输出流并强制任何缓冲的输出字节被写出
    public void flush() throws IOException {
    }

 	//关闭此输出流并释放与此流相关联的的任何资源
    public void close() throws IOException {
    }

}
FileOutputStream类

OutputStream有很多子类,我们从最简单的一个开始。
java.io.FileOutputStream类是文件输出流,用于将数据写入到文件中。

构造方法
//创建文件输出流以写入由指定的 File对象表示的文件
public FileOutputStream(File file) 
//创建文件输出流以指定的名称写入文件
public FileOutputStream(String name) 

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

File file = new File("D:\\test\\test5\\abc.txt");
//传入File对象创建输出流
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] bytes = "abcdefg".getBytes();
//写入bytes数组,从偏移0开始写入全部
fileOutputStream.write(bytes,0,bytes.length);
//关闭资源
fileOutputStream.close();
数据追加读写

每次程序运行,创建输出流对象,都会清空目标文件中的信息。只需在构造输出流对象时,追加true即可实现数据续写

//创建文件输出流以写入由指定的 File对象表示的文件
public FileOutputStream(File file, boolean append) 
//创建文件输出流以指定的名称写入文件
public FileOutputStream(String name, boolean append)
写出换行

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

File file = new File("D:\\test\\test5\\abc.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file,true);
byte[] bytes = "abcdefg".getBytes();
fileOutputStream.write(bytes,0,bytes.length);
fileOutputStream.write("\r\n".getBytes());
fileOutputStream.close();

在这里插入图片描述

字节输入流(InputStream)

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

//关闭此输入流并释放与此流相关联的任何系统资源
public void close()
//从输入流读取数据的下一个字节
public abstract int read()
//从输入流中读取一些字节数,并将它们存储到字节数组 b中
public int read(byte[] b) 
FileInputStream类
构造方法
FileInputStream(String name)
FileInputStream(File file)
读取字节数据
File file = new File("D:\\test\\test5\\abc.txt");
FileInputStream fileInputStream = new FileInputStream(file);
//输入流读取到文件末尾,返回-1,用此来判断是否读取完毕
int len;
//作为装字节数据的容器
byte[] bytes = new byte[100];
while((len= fileInputStream.read(bytes))!=-1) {
	System.out.println(new String(bytes));
}
fileInputStream.close();
字节流实现复制

在这里插入图片描述

扫描二维码关注公众号,回复: 5556326 查看本文章
File file = new File("D:\\test\\test5\\abc.txt");
File file_copy = new File("D:\\test\\test5\\abc_copy.txt");
FileInputStream fileInputStream = new FileInputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream(file_copy);
int len;
byte[] bytes = new byte[1024];
while((len= fileInputStream.read(bytes))!=-1) {
	fileOutputStream.write(bytes,0,len);
	}
fileInputStream.close();
fileOutputStream.close();

字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件

字符输入流(Reader)

java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中

//关闭流且关联的系统资源
public void close()
//从输入流读取一个字符
public int read() 
//从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
public int read(char[] cbuf)
FileReader类

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

windows下中文编码默认为GBK编码表

构造方法
FileReader(File file) 
FileReader(String fileName) 
读取字符数据
File file = new File("D:\\test\\test5\\abc.txt");
FileReader fileReader = new FileReader(file);
char[] data = new char[1024];
int len;
 while((len=fileReader.read(data))!=-1) {
	System.out.println(new String(data));//追梦的小狼狗
  }
fileReader.close();

字符输出流(Writer)

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

//写入单个字符
void write(int c)
//写入字符数组
void write(char[] cbuf)
//写入字符数组的某一部分,off数组的开始索引,len写的字符个数
abstract void write(char[] cbuf, int off, int len)
//写入字符串
void write(String str)
//写入字符串的某一部分,off字符串的开始索引,len写的字符个数
void write(String str, int off, int len)
//刷新该流的缓冲
void flush()
FileWriter类

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

构造方法
FileWriter(File file)
FileWriter(String fileName) 

其他用法类似以上流,故省略。


属性集

java.util.Properties 继承于Hashtable,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其
对应值都是一个字符串
。该类也被许多Java类使用,比如获取系统属性时, System.getProperties 方法就是返回一个 Properties 对象。在许多文件配置中,比如MyBatis中对应数据库源的配置,常常建立一个datasource.properties,在datasource.properties中设置数据库相关信息,在MyBatis配置文件中,通过${ key}引入数据。

构造方法
//创建一个空的属性列表
public Properties()
基本的存储方法
//保存一对属性
public Object setProperty(String key, String value)
//使用此属性列表中指定的键搜索属性值
public String getProperty(String key)
//所有键的名称的集合
public Set<String> stringPropertyNames() 
Properties properties = new Properties();
properties.setProperty("name","Reyco");
properties.setProperty("age","21");
properties.setProperty("gender","man");
		
Set<String> strings = properties.stringPropertyNames();
for(String item :strings) {
	System.out.println(item+"--"+properties.getProperty(item));
}

//age--21
//name--Reyco
//gender--man
与流相关的方法
//从字节输入流中读取键值对
public void load(InputStream inStream)

在这里插入图片描述

File file = new File("D:\\test\\test5\\data.txt");
Properties properties = new Properties();
//加载文本信息到属性集
properties.load(new FileInputStream(file));
Set<String> strings = properties.stringPropertyNames();
for(String item : strings) {
	System.out.println(item+"--"+properties.getProperty(item));
}

age–21
name–Reyco
gender–men

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/88597276