文件流: 程序和文件做IO操作.
FileInputStream
FileOutputStream
FileReader
FileWriter
转换流: 把字节流转换为字符流.
InputStreamReader
OutputStreamWriter
内存流: 把数据先临时的缓存在内存中,(收集数据).先不讲.
ByteArrayInputStream
ByteArrayOutputStream
CharArrayReader
CharArrayWrier
-----------------------------------------------------
缓冲流:属于包装流,(内部提高了8Kb的缓冲区)
包装流(缓冲流):使用该流对象的时候,需要包裹另一个流,来提高IO性能.
节点流:没有使用其他包转流的流.
在IO中存在一个装饰设计模式(包装设计模式),大神班讲非法文字过滤.
装饰设计模式的目的:在不改变原有对象的基础之上,对原有对象做增强操作.
BufferedInputStream: 字节输入流的缓冲流,专门用来包装InputStream的.
BufferedOutputStream: ,专门用来包装 OutputStream的.
BufferedReader:
BufferedWriter:
字节包装流
package _01_Buffer;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class BufferDemo {
public static void main(String[] args) throws Exception {
String src = "123.txt";
String dest = "456.txt";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
int len = -1;
byte[] buffer = new byte[1024];
while((len=bis.read(buffer)) != -1){
bos.write(buffer,0,len);
}
}
}
字符包装流以及readline()
package _01_Buffer;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class BufferReadLineDemo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("123.txt"));
//读取一行,如果没有了则会返回null
//System.out.println(br.readLine());
char[] buffer = new char[1024];
int len= -1;
while((len=br.read(buffer)) != -1){
System.out.println(new String(buffer,0,len));
}
/* readLine的使用
System.out.println("----------------------------------------");
String str = null;
while((str = br.readLine()) != null){
System.out.println(str);
}
*/
br.close();
}
}
标准输入输出流
标准的输入和输出流:System类有常量:
标准输入流: 通过键盘录入的数据的方式.InputStream input =System.in;//接受键盘录入的数据
标准输出流: 在控制台输出结果的方式. OutputStream output = System.out;//在控制台中输出数据
标准输入流的重定向:
标准输入流表示从键盘接受输入数据, 把接收的位置变成一个文件.
System.setIn(...);
标准输出流的重定向:
标准输出流表示把数据输出在控制台中,我可以改变输出方向到一个文件中去.
System.setOut(...);
打印流
打印流: 令人最Happy的一点,可以输出任意的数据类型.
PrintStream: 字节打印流.
PrintWriter: 字符打印流.
package _02_printstream; import java.io.PrintStream; import java.io.PrintWriter; public class Demo1 { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { PrintStream ps = new PrintStream("qixi.txt"); ps.write("传统的打印方式".getBytes()); //执行后会打印到文件qixi.txt ps.print("新颖的方式"); System.out.println("----------------------------------------"); //下面是字符打印 PrintWriter pw = new PrintWriter("qixi2.txt"); pw.print("我是谁!!!"); //字符流必须关闭,不然没内容 pw.close(); } }
package _02_printstream; public class Demo2 { /** * @param args */ public static void main(String[] args) { String name = "tt"; int age = 19; System.out.printf("我是%s,今年%s", name,age); } }
Properties类
Hashtable类是Map的实现类,而Properties类又是Hashtable的子类.
---->Properties本身就是Map接口的实现类,体现着key-value.
然而我们一般称之为属性类.
我们把key称之为属性名,把value称之为属性值.
和Hashtable相比:
Hashtable中的key和value都可以是Object类型.
而在Properties类中所有的属性名和属性值都是String类型.
package _03_Properties; import java.util.Properties; public class Demo1 { /** * @param args */ public static void main(String[] args) { Properties pro = new Properties(); pro.setProperty("name", "wqy"); String name = pro.getProperty("name"); System.out.println(name); System.out.println(pro); } }
为什么需要使用配置文件--->为了避免硬编码:
所谓硬编码,可以简单的理解为在代码中把某一个或多个数据给写死了(若需要修改必须修改源代码).
比如:学习数据库,数据库有账号和密码,我们做开发就需要在Java中去连接数据库.
String username = "root";
String password = "admin";
...省略的代码....
此时若实施人员,需要修改密码,只能修改源代码.
解决方案:把这种写死的数据,提取到专门的配置文件中来,即使需要修改,只需要修改配置文件即可.
-------------------------------------------------------
在Java中:配置文件(XML/properties).
--------------------------------------------------------
文件名.properties文件,我们称之为属性文件,是Java中配置文件的一种.
属性名=属性值
对象流和序列化package _03_Properties; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Properties; public class DbProperties { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { Properties pro = new Properties(); InputStream in = new FileInputStream("db.properties"); pro.load(in); String username = pro.getProperty("username"); System.out.println(username); System.out.println(pro); } }
什么是序列化:
把对象值的数据信息以二进制的格式保存起来.
反序列化: 把二进制的对象信息,恢复成对象.
为什么要做序列化:
1):方便网络传输.
2):把对象数据持久化在磁盘中.
序列化和对象流有何关系:
为了方便把对象信息存储到磁盘,java的IO就提供了对象流,专门用来操作对象和二进制之间的转换操作.
ObjectOutputStream: 把对象转换为二进制.
ObejctInputStream: 把二进制数据读进程序,恢复成对象.
-----------------------------------------------------------------------------
怎么做序列化:
注意:被对象流操作的对象,必须实现java.io.Serializable接口.
实现java.io.Serializable接口的类中:
若字段使用static,或者transient修饰,则不会被序列化.
static:因为static表示类的成员,不是对象的成员.
transient:限定某个字段不被序列化的,比如密码.
-----------------------------------------------------------------------------
为了检验对象和二进制文件中的数据的一致性,习惯生产出一个序列化ID.这里有个User类是实现了Serializable接口的,提供了三个变量的有参构造器和无参构造器