IO
input—硬盘—output
流:数据(字符,字节)1字符=2字节 1字节=8bit 二进制
字节流
字节输出流OutputStream:是表示字节输出流的所有类的超类
public abstract class OutputStream //抽象方法是不能直接调用
成员方法:
close:关闭输出流,释放相关系统资源
flush:刷新输出流,强制任何缓冲的输出字节被写出
write(byte[] b):将b.length字节写入到此输出流
write(byte[] b, int off, int len):写入len字节,从偏移量off开始
abstract void write(int b):写入一个字节
FileOutputStream
FileOutputStream extends OutputStream 文件字节输出流
构造方法:
FileOutputStream (String name):创建一个指定名称的文件中写入数据的文件输出流,name文件路径。
FileOutputStream (File file):创建一个指定File对象表示的文件中写入数据的文件输出流。file文件。
FileOutputStream 会根据构造方法中传递的文件/文件路径,创建一个空的文件。
写入原理
java程序—>JVM—>OS—>OS调用写数据方法—>写入数据
步骤
- 创建FileOutputStream 对象,在构造方法中写入数据目的地
- 使用FileOutputStream 的write,写入
- 释放资源–close
write(byte[] b):一次写入多个字节,第一个字节是正数,查询ASCII表。
第一个字节是负数,第一个字节和第二个字节,组成一个中文显示,查询默认码表(GBK)。
UTF-8,三个字节组成一个中文显示。
写入字符串方法:使用byte[ ] getBytes() 将字符串转换为字节数组–“xx”.getBytes()
数据追加写
使用重载:
FileOutputStream (String name, boolean append)
FileOutputStream (File file, boolean append)
boolean append:追加写开关,true:创建对象不覆盖源文件,默认false
写换行:win:\r\n linux:/n mac:/r
InputStream
字节输入流InputStream:是表示字节输入流的所有类的超类
int read():从输入流中读取数据的下一个字节
int read(byte[ ] b):从输入流中读取数据的一些字节,存储到缓冲区数组b中
void close
FileInputStream
构造方法: FileInputStream (String name) FileInputStream (File file)
步骤:创建一个FileInputStream对象,构造中绑定要读取的数据源,read读取,close释放资源
char(byte b),String(byte[ ] b),String(byte[ ] b, int offset, int length),将字节转换为字符
int read(byte[ ] b):一次读取多个,每一个读取会覆盖之前的数组b的数值,如果当前读取长度小于数值b长度,则数值b剩余的部分还是上传读取的数值。
字符流
字节流中文读取有误。
Reader
字符输入流:abstract Reader
成员方法:int read() int read(char[ ] cbuf)
FileReader
FileReader extends InputStreamReader extends Reader
FileReader 文件字符输入流:把文件数据以字符的方式读取到内存中
构造方法:FileReader (String fileName) FileReader (File file)
fileName路径,file文件,构造方法将FileReader对象指向要读取的文件
Writer
write(int c):写入单个字符
write(char[] cbuf):写入字符数组
abstract write(char[] cbuf, int off, int len):写入len字节,从偏移量off开始
void write(String str):写入字符串
void write(String str, int off, int len):写入字符串一部分
flush:刷新输出流的缓冲
close:关闭输出流,先要刷新
FileWriter
FileWriter extends InputStreamWriter extends Writer
文件字符输出流
构造方法:FileWriter (String fileName) FileWriter (File file)
字符输出流步骤:
创建一个FileInputStream对象,构造中绑定要读取的数据源
使用write( ),将数据写入到内存缓冲区中(字符转换为字节的过程)
使用flush,把内存缓存区中的数据,刷新到文件中。并且流对象可以继续使用。
close释放资源(也会刷新缓冲区)。
数据追加写
FileWriter (String fileName , boolean append) FileWriter (File file , boolean append)
与字节流一致
处理异常 try catch finally
如果使用 try (定义流对象) 则finally可以不用写,直接关闭流对象
直接关闭流对象:try (流对象名称) :A a = new A(); try(a){ }catch( ){ }
属性集
Properties extends Hashtable<k,v> implements Map<k,v>
Properties 类表示了一个持久属性集,Properties 可保存在流中或者从流中加载
Properties 集合是唯一一个和IO流相结合的集合
使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘存储
使用Properties集合中的方法load,把硬盘存储文件(键值对),读取到集合中
属性列表中的每一个键及其对应值都是一个字符串。Properties集合是一个双列集合,key和value默认是字符串。
Properties集合操作字符串
-
Object setProperty(String key, String value ) 调用Hashtable的方法put()。
-
Object getProperty(String key ) 通过key找到value,相当Map集合的方法get()。
-
Set stringPropertyNames( ) 返回此属性列表的键值,键对应值是字符串,相当Map集合的keyset方法。
Properties prop = new Properties (); prop .setProperty("xx","xx"); Set<String> set = prop.stringPropertyNames( ); for (String kay:set){ String value = prop.getProperty(key); }
方法
store
void store( OutputStream out, String comments )
void store( Writer writer, String comments )
OutputStream out 字节输出流,Writer writer 字符输出流 FileWriter
String comments 注释,解释保存的文件作用,使用Unicode编码,一般使用""空字符串
FileWriter fw = new FileWriter ("XX");
prop.store(fw, "XXX");
fw.close();
load
viod load( InputStream inStream)
InputStream inStream 字节输入流,不能读取含有中文的键值对
void load(Reader reader)
Reader reader 字符输入流 FileReader
注意:
存储键值对的文件中,键与值默认的连接符合可以使用= ,空格等待
存储键值对的文件中,可以使用#进行注释,并且不会被读取
存储键值对的文件中,键与值默认都是字符串,不用加引号