A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨纯纯 初级黑马   /  2018-11-26 17:17  /  613 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

IO的概念和分类:
1.什么是IO流?
2.什么是输入?
3.什么是输出?
4.IO流有哪些分类?
(1.)IO流就是 读入,写出流。
(2.)输入就是读取文件内容
FileInputStream fis = new FileInputStream(文件地址\\文件名.文件类型);
(3.)输出就是输出指定内容到制定路径下的文件中
FileOutputStream fos = new FileOutputStream(文件地址\\文件名.文件类型)
(4.)IO流有 字节流,字符流
字节流:
字节输入流: java.io.InputStream 抽象类
字节输出流: java.io.OutputStream 抽象类
字符流:
字符输入流: java.io.Reader 抽象类
字符输出流: java.io.Writer 抽象类
5.字节输出流: OutputStream和FileOutputStream
OutputStream是抽象类 有哪些共性方法?
OutputStream的共性方法有.close  .flush
FileOutputStream是普通类 可以做什么
C:/Users/win/AppData/Local/YNote/data/qq51705C22557BC4566B6FB12F9448BCB0/4c609a6d49cb404baf09ca6b86113349/clipboard.png

java.io.OutputStream抽象类: 字节输出流 (顶层类)
// 成员方法
void close() :释放资源
void flush() :刷新缓冲区(对于字节流来说没有作用)
// 写字节的成员方法
abstract void write(int b): 一次写一个字节 (参数int便于传递byte的整数不用强转)
void write(byte[] b): 一次写一个字节数组
void write(byte[] b, int offset, int len): 一次写一个字节数组的一部分
java.io.FileOutputStream类: 文件字节输出流 (向文件写数据)
// 构造方法
FileOutputStream(String name): 通过文件路径创建文件字节输出流
FileOutputStream(File file): 通过File对象创建文件字节输出流
构造方法的作用:
1. 创建一个FileOutputStream对象
2. 根据构造方法传递的路径, 在磁盘上创建一个空文件 ("如果文件存在则会清空数据")
3. 将创建的FileOutputStream对象指向这个磁盘上的文件

字节输出流: 一次写一个字节到文件
了解Java程序将数据写入文件的原理
FileOutputStream写数据到文件需要哪3步
写数据的原理:
Java程序 -> JVM虚拟机 -> OS操作系统 -> OS调用写数据的方法 -> 将数据写入文件
使用字节输出流写数据到文件的步骤:
1. 创建对象: 创建FileOutputStream对象, 构造方法中传递文件路径
2. 写入数据: 使用FileOutputStream对象调用 write(int b) 方法, 将字节写入文件
3. 释放资源: 使用FileOutpu

5分钟练习: 使用FileOutputStream写数据到文件
需求:
创建FileOutputStream对象, 路径传递当前模块下的testOutputStream1.txt文件
"day09\\testOutputStream1.txt"
write() 写入 97, 98, 99
close() 释放资源
打开文件查看
public class Test {
public static void main(String[] args) throws IOException { // 为了学习IO流时不让try
catch打乱代码结构, 我们先throws声明抛出
// 1. 创建文件字节输出流对象
FileOutputStream fos = new FileOutputStream("day09\\testOutputStream1.txt");
// 2. 写数据
fos.write(97);
fos.write(98);
fos.write(99);
// 3. 释放资源
fos.close();
}
}

文件存储原理和记事本打开文件的原理
向文件中写入字节数据时, 写入的是什么进制的数据
写入文件的是数字, 但文本编辑器打开后为什么会显示为字符
向文件中写入字节数据时, 十进制的数字会被转换为"二进制"的数字写入文件
文本编辑器打开文本文件时, 会先查询编码表, 将二进制数字转换为对应的字符进行显示
0-127: 查询ASCII码表 -128~127
其他: 查询系统默认码表
Windows简体中文系统的程序打开是按 GBK 码表
IDEA中使用的是 UTF-8 码表
ASCII编码表: 1个byte就是一个字符 97 a

字节输出流: 一次写多个
如何一次性写入多个byte
如何获取一个字符串对应的byte
String -> byte
"abc" -> byte byte byte
补充:
java.lang.String类:
byte[] getBytes(): 使用平台的默认字符集将此String编码为byte数组
java.io.FileOutputStream类: 文件字节输出流 (向文件写数据)
void write(byte[] b): 一次写一个字节数组
void write(byte[] b, int off, int len): 一次写一个字节数组的一部分
Java中, byte的范围是 -128 ~ 127 共256个数值
编码表中字符范围是 0 ~ 255 共256个数值
写多个字节时:
如果第一个字节是正数中的 0~127, 则记事本会查询 ASCII码表 显示字符
如果第一个字节是负数中的:-128~-1, 则记事本会查询 GBK码表 显示字符.(将两个连续的byte组合为一个中
文)
FileOutputStream fos = new FileOutputStream(new File("09_IOAndProperties\\b.txt"));
byte[] bytes2 = "你好".getBytes();
System.out.println(Arrays.toString(bytes2));//[-28, -67, -96, -27, -91, -67]
fos.write(bytes2);
//释放资源
fos.close();
字节输出流: 续写, 换行
如何在文件已有内容之后, 接着写入内容 (续写)?
如何在文件中写入换行, Windows系统的换行符号是什么?
java.io.FileOutputStream类: 文件字节输出流
// 带有 续写 功能的构造方法, 不会清空文件
FileOutputStream(String name, boolean append): 通过文件路径创建流, true可以续写
FileOutputStream(File file, boolean append): 通过File对象创建流, true可以续写
换行符:
Windows系统: "\r\n"
Linux系统: "\n"
MacOS系统: "\r"
字节输入流: 一次读取一个字节原理:
C:/Users/win/AppData/Local/YNote/data/qq51705C22557BC4566B6FB12F9448BCB0/ab90326e7d45490fa723573579a5c6eb/clipboard.png

如何一次读取多个byte
一次读取多个byte是如何实现的, 相比于一次读取一个byte效率上哪个更高
补充:
java.lang.String类:
String(byte[] bytes): 使用平台默认字符集解码将byte数组转换为String
String(byte[] bytes, int offset, int length): 使用平台默认字符集将数组一部分转换为String
总结:
java.io.InputStream抽象类: 字节输入流 (顶层类)
int read(byte[] b): 一次读一个字节数组
参数 byte[] b 作用: 存储每次读到的字节, 起到缓冲作用
返回值作用: 每次读到的字节个数, 读到文件末尾返回-1

// 示例代码
FileInputStream fis = new FileInputStream("模块名\\文件名");
byte[] bytes = new byte[1024]; // 定义字节数组, 用于保存每次读取到的数据
int len; // 定义int变量, 用于保存每次读取到的长度
while ((len = fis.read(bytes)) != -1) {
String s = new String(bytes, 0, len); // 将读取到的字节转换为字符串, 读到多少个就转换多少个
System.out.print(s);
}
fis.close(); // 释放资源
C:/Users/win/AppData/Local/YNote/data/qq51705C22557BC4566B6FB12F9448BCB0/76f05812ef5b4885b93835544477710a/clipboard.png
字符输出流: Writer和FileWriter
Writer类有哪些共性方法
FileWriter类可以做什么
创建FileWriter对象时有哪3个作用
java.io.Writer抽象类: 字符输出流 (顶层类) 'a''b' 缓冲区 97 98
// 常用成员方法
abstract void close(): 刷新缓冲区并释放资源
abstract void flush() :刷新缓冲区
// 写
void write(int c): 写一个字符 (int类型为了代码编写方便)
void write(char[] cbuf): 写一个字符数组
abstract void write(char[] b, int off, int len): 写一个字符数组的一部分
void write(String str): 写一个字符串
void write(String str, int off, int len): 写一个字符串的一部分
注意: write()方法只是将数据写到内存缓冲区, 最后必须调用flush()或close()才能将数据真正写入磁盘
java.io.FileWriter类: 文件字符输出流
// 构造方法
FileWriter(File file): 通过File对象创建文件字符输出流
FileWriter(String fileName): 通过文件路径创建文件字符输出流
作用:
1. 创建FileWriter对象
2. 根据构造方法中的路径, 在磁盘上创建文件 ("如果文件已存在, 则清空文件内容")
3. 将FileWriter对象指向磁盘上的文件
字符输出流: flush与close区别
区别:
flush(): 刷新缓冲区 (将数据从内存中写入到磁盘)
close(): 刷新缓冲区, 并释放资源. 关闭流后不能再用同一个流对象操作
flush() 可以省略, 只用 close()来 刷新并释放资源
字符输出流: 其他方法
写的其他方法:
void write(char[] cbuf): 写一个字符数组
abstract void write(char[] b, int off, int len): 写一个字符数组的一部分
void write(String str): 写一个字符串
void write(String str, int off, int len): 写一个字符串的一部分

Properties
Properties存储数据和
Properties双列集合:
键和值都是 String 类型
java.util.Properties类: 属性集, 属于Map的双列集合, 继承自Hashtable
// 构造方法
Properties(): 创建一个Properties集合
// 可以使用Map接口中的方法
// 特有成员方法
Object setProperty(String key, String value): 保存/替换键值对
String getProperty(String key): 通过键获取值. 键不存在返回null
Set<String> stringPropertyNames(): 返回键的集合
void store(OutputStream out, String comments):
将集合用字节流写入文件(不能中文),并写入注释
void store(Writer writer, String comments): 将集合用字符流写入文件(可以中文),并写入注释
void load(InputStream inStream): 从配置文件中通过字节流加载数据到Properties集合(不能中文)
void load(Reader reader): 从配置文件中通过字符流加载数据到Properties集合(可以中


1 个回复

倒序浏览
优秀,。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马