JAVA从零开始学习知识整理——day09—【字节流、字符流】

一、IO概述
1.1 什么是IO
数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 和 输出output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
根据数据的流向分为:输入流和输出流。
输入流 :把数据从其他设备上读取到内存中的流。
输出流 :把数据从内存中写出到其他设备上的流。
格局数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。
字符流 :以字符为单位,读写数据的流。

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

public class FileOutputStreamConstructor throws IOException {
				public static void main(String[] args) {
					// 使用File对象创建流对象
					File file = new File("a.txt");
					FileOutputStream fos = new FileOutputStream(file);
					// 使用文件名称创建流对象
					FileOutputStream fos = new FileOutputStream("b.txt");
		}
}

——write(int b) 方法,每次可以写出一个字节数据。
——创建byte数组进行多个字节的写入:write(byte[] b) ,每次可以写出数组中的数据
—— write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节。

数据追加续写:
public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的
文件。
public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。
写出换行:
Windows系统里,换行符号是 \r\n 。
2.3 字节输入流
java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

	public class FileInputStreamConstructor throws IOException{
			public static void main(String[] args) {
				// 使用File对象创建流对象
				File file = new File("a.txt");
				FileInputStream fos = new FileInputStream(file);
				// 使用文件名称创建流对象
				FileInputStream fos = new FileInputStream("b.txt");
		}
}

读取字节数据:

  1. 读取字节: read 方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回 -1。
  2. 使用字节数组读取: read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读
    取到末尾时,返回 -1 。
    2.4 字节流练习:图片复制
    public class Copy {
    public static void main(String[] args) throws IOException {
    // 1.创建流对象
    // 1.1 指定数据源
    FileInputStream fis = new FileInputStream(“D:\test.jpg”);
    // 1.2 指定目的地
    FileOutputStream fos = new FileOutputStream(“test_copy.jpg”);
    // 2.读写数据
    // 2.1 定义数组
    byte[] b = new byte[1024];
    // 2.2 定义长度
    int len;
    // 2.3 循环读取
    while ((len = fis.read(b))!=‐1) {
    // 2.4 写出数据
    fos.write(b, 0 , len);
    }
    // 3.关闭资源
    fos.close();
    fis.close();
    }
    }
    三、字符流
    java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
    3.1 FileReader类
    public void close() :关闭此流并释放与此流相关联的任何系统资源。
    public int read() : 从输入流读取一个字符。
    public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
    3.2FileWriter类
    java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节
    输出流的基本共性功能方法。
    void write(int c) 写入单个字符。
    void write(char[] cbuf) 写入字符数组。
    abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
    void write(String str) 写入字符串。
    void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
    void flush() 刷新该流的缓冲。
    void close() 关闭此流,但要先刷新它
    写入方法:
    ——write(int b) 方法,每次可以写出一个字符数据。
    ——写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据,用法类似FileOutputStream。
    ——写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的
    数据,

关闭和刷新
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了。
flush :刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

四、IO异常的处理
JDK7的处理:还可以使用JDK7优化后的 try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。

	try (创建流对象语句,如果多个,使用';'隔开) {
	// 读写数据
	} catch (IOException e) {
	e.printStackTrace();
}
代码演示:
			public static void main(String[] args) {
					// 创建流对象
					try ( FileWriter fw = new FileWriter("fw.txt"); ) {
					// 写出数据
					fw.write("黑马程序员"); //黑马程序员
			} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

JDK9的处理:
JDK9中 try-with-resource 的改进,对于引入对象的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,无需手动close,我们来了解一下格式。

		// 被final修饰的对象
		final Resource resource1 = new Resource("resource1");
		// 普通对象
		Resource resource2 = new Resource("resource2");
		// 引入方式:直接引入
		try (resource1; resource2) {
		// 使用对象
}
代码演示:
			public class TryDemo {
			public static void main(String[] args) throws IOException {
			// 创建流对象
			final FileReader fr = new FileReader("in.txt");
			FileWriter fw = new FileWriter("out.txt");
			// 引入到try中
			try (fr; fw) {
			// 定义变量
			int b;
			// 读取数据
			while ((b = fr.read())!=‐1) {
				// 写出数据
			fw.write(b);
			}
			} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

五、属性集
java.util.Properties 继承于 Hashtable ,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其
对应值都是一个字符串。该类也被许多Java类使用,比如获取系统属性时, System.getProperties 方法就是返回一个 Properties 对象。
5.1 propertuesles
基本的存储方法
——public Object setProperty(String key, String value) : 保存一对属性。
——public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
——public Set stringPropertyNames() :所有键的名称的集合。
5.2 与流相关的方法
public void load(InputStream inStream) : 从字节输入流中读取键值对。

	public class ProDemo2 {
			public static void main(String[] args) throws FileNotFoundException {
				// 创建属性集对象
				Properties pro = new Properties();
				// 加载文本中信息到属性集
				pro.load(new FileInputStream("read.txt"));
				// 遍历集合并打印
				Set strings = pro.stringPropertyNames();
				for (String key : strings ) {
				System.out.println(key+" ‐‐ "+pro.getProperty(key));
				}
		}
}

你可能感兴趣的:(JAVA学习日记,JAVA学习日记,JAVA知识整理,JAVA从零开始)