整体概述
系统中分为临时储存和硬盘两大块
临时储存:当前正在运行的程序提供资源
硬盘:文件中的资源
IO流就是在这两者之间进行操作的
IO流分为字节流和字符流
- 字节流:
InputStream,OutputStream
- 字符流:
Reader, Writer
字节流
一切皆字节
字节输出流OutputStream
把临时存储的东西存到硬盘上(文件中)
常用方法
void writer();
void flash();
void close();
其中输出字节流子类中最常用的就是FileOutputStream
写数据的时候会把97转化为二进制数据,然后软件把二进制文件解码成a;
//一次写一个字节
public void write(byte b);
//一次写多个字节
public void write(byte[] bytes);
public void write(byte[] bytes, int offset, int len);
附加: 字符串怎么转化为字节数组
byte[] bytes = "HelloWorld".getBytes();
数据的追加,续写
//构造方法
FileOutputStream(String pathname, boolean append);
FileOutputStream(File file, boolean append);
字节输入流InputSream
共有的方法
int read()// 返回值是字符的编码值
int read(byte[] bytes)// 返回值是数组的长度,bytes是读取的数组
void close()
构造方法
FileInputStream(FIle file);
FileInputStream(String name);
一般的读取工作是这样的
FileInputStream fis = new FileInputStream("D:\\Java\\javaExmaple1\\src\\practice\\IOStream\\a.txt");
int len = 0;
while((len = fis.read()) != -1)
{
System.out.println((char) len);
}
fis.close();
附加:String类的构造方法
String(byte[] bytes);
//比如
String s = new String(bytes);
先关闭写的流,再关闭读的流
字符流
分为字符输入流和字符输出流
Reader: 常用 FileReader
Writer: 常用FileWriter
字符输入流Reader
通用的方法
int read();
int read(char[] cbuf);
void close();
接下来介绍FileReader
FileReader extends InputStreamReader
构造方法
FileReader(String pathname);
FileReader(File file);
附加:
String构造方法
String(char[] chars);
String (byte[] bytes);
字符输出流Writer
公用的方法
(可以直接写如字符串)
void write(char[] cbuf);
void write(char[] cbuf, int offset, int len);
void write(String str);
void write(String str, int offset, int len);
void flush();//把缓冲流中的数据刷新到临时存储中去
void close();
FileWriter extends OutputStreamWriter
构造方法
FileWriter(File file, boolean append);
FileWriter(String pathname,bollean append);
附加:异常处理
try{
//可能会产生异常的代码
}catch(异常类变量 变量名)
{
//异常处理逻辑
}finally{
//一定会执行的代码,一般是资源释放
}
JDK7新特性
try(定义流对象,之后会自动释放,就不需要finally中间用分号){
//可能会产生异常的代码
}catch(异常类变量 变量名)
{
//异常处理逻辑
}
JDK9新特性
A a = new A();
B b = new B();
//这边也是自动释放
try(a;b){
//可能会产生异常的代码
}catch(异常类变量 变量名)
{
//异常处理逻辑
}
Properties属性集
java.util.Properties extends Hashtable<K,V>
实现了map类的方法
有两个特有方法
void store(OutputStream out, String comments)//后面的那个是注解的意思
void store(Writer writer,String comments);//写入把properties实现类的对象的内容写入writer了
void load(InputStream in);//读出把in中的数据读出到properties实现类的对象中
void load(Reader reader);
还有一些作为hasetable的子类的特有方法,k,v都是字符串
prop.setProperty("lwt","173");//设置,存入键值对,相当于put
Set<String> set = prop.stringPropertyNames();// 得到键的集合 ,通过键获取值
String value = prop.getProperty(key);//通过键获取值
具体实现代码
(哈希表的遍历不能忘)
public class Demo10Property {
public static void main(String[] args) throws IOException {
show03();
}
private static void show02() throws IOException {
Properties prop = new Properties();
prop.setProperty("lwt","173");//设置,存入键值对,相当于put
prop.setProperty("ljy","187");
prop.setProperty("zth","184");
FileWriter fw = new FileWriter("D:\\Java\\javaExmaple1\\src\\practice\\IOStream\\prop.txt");
prop.store(fw,"save data");
fw.close();
}
public static void show01()
{
// Properties继承了HashTable
// 有三个方法
Properties prop = new Properties();
prop.setProperty("lwt","173");//设置,存入键值对,相当于put
prop.setProperty("ljy","187");
prop.setProperty("zth","184");
// 得到键的集合 ,通过键获取值
Set<String> set = prop.stringPropertyNames();
for (String key : set) {
// 通过键获取值
String value = prop.getProperty(key);
System.out.println(key + "=" + value);
}
}
public static void show03() throws IOException {
Properties prop = new Properties();
prop.load(new FileReader("D:\\Java\\javaExmaple1\\src\\practice\\IOStream\\prop.txt"));
Set<String> set = prop.stringPropertyNames();
for (String key : set) {
String value = prop.getProperty(key);
System.out.println(key + "=" + value);
}
}
}