1、数据输入输出流
2、内存操作流
3、打印流
4、序列化流
5、随机访问流
6、Properties
1、数据输入输出流
特点:
可以写基本数据类型, 可以读取基本数据类型
public class IODemo {
public static void main(String[] args) throws IOException {
// A:
// // 数据输入输出流的概述
// // 通过API查看
// // 数据输入和输出流:
// //*数据输入流:
// // DataInputStream
// // * 数据输出流:DataOutputStream
// // *
// //*特点:
// // 可以写基本数据类型, 可以读取基本数据类型
//数据输出流:能够写入一些基本数据类型
//DataOutputStream out = new DataOutputStream(new FileOutputStream("a.txt"));
//out.writeInt(100);
//out.writeDouble(3.14);
//out.writeBoolean(true);
//out.writeUTF("你好啊");
System.out.println("--------------------------------");
//怎么写的怎么读,顺序不要乱
DataInputStream in = new DataInputStream(new FileInputStream("a.txt"));
int i = in.readInt();
double v = in.readDouble();
boolean b = in.readBoolean();
String s = in.readUTF();
System.out.println(i);
System.out.println(v);
System.out.println(b);
System.out.println(s);
in.close();
// out.close();
}
}
总结:怎么写进去的就怎么读出来
2、内存操作流
特点:内存操作流:在内存中进行读写,不关联任何文件
//ByteArrayOutputStream 内存输出流
//此类实现了一个输出流,其中的数据被写入一个 byte 数组。
//缓冲区会随着数据的不断写入而自动增长。
//可使用 toByteArray () 和 toString () 获取数据。
//
//关闭 ByteArrayOutputStream 无效。
//此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
字节数组操作流:
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write("你好".getBytes());
out.write("中国".getBytes());
out.write("祖国强大".getBytes());
//获取缓冲区种的数据
byte[] bytes = out.toByteArray();
// //String s = new String(bytes);
// //System.out.println(s);
String string = out.toString();
System.out.println(string);
System.out.println("--------------------------------------");
byte[] bytes2 = new byte[1024 * 8];
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
int read = in.read(bytes2);
String string1 = new String(bytes2);
System.out.println(string1);
运行结果:你好中国祖国强大
--------------------------------------
你好中国祖国强大
字符数组操作流:
CharArrayWriter writer = new CharArrayWriter();
writer.write(new char[]{'a','b','c'});
writer.write(new char[]{'a', 'b', 'c'});
writer.write(new char[]{'a', 'b', 'c'});
char[] chars = writer.toCharArray();
String s = String.valueOf(chars);
System.out.println(s);
CharArrayReader charArrayReader = new CharArrayReader(chars);
int len=0;
while ((len=charArrayReader.read())!=-1){
System.out.println((char)len);
}
}
字符串操作流:
writer.write("abc");
writer.write("abc");
writer.write("abc");
writer.write("abc");
writer.write("abc");
writer.write("abc");
String string = writer.toString();
System.out.println(string);
System.out.println("----------------");
writer.close();
3、打印流
只有输入流PrintWriter
a: 可以操作任意数据类型的数据 调用print() 方法可以写任意数据类型
b: 如果我们启用自动刷新,那么在调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新
/**
通过以下构造创建对象 能够启动自动刷新 然后调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新
public PrintWriter(OutputStream out, boolean autoFlush) 启动 自动刷新
public PrintWriter(Writer out, boolean autoFlush) 启动自动刷新
*/
c: 这个流可以直接对文件进行操作(可以直接操作文件的流: 就是构造方法的参数可以传递文件或者文件路径
案例演示:
//打印流复制文本文件
BufferedReader in = new BufferedReader(new FileReader("IODemo.java"));
// BufferedWriter writer = new BufferedWriter(new FileWriter("abc.java"));
PrintWriter printWriter = new PrintWriter(new FileOutputStream("Demo.java"), true);
String line = null;
while ((line = in.readLine()) != null) {
printWriter.println(line);
}
in.close();
printWriter.close();
public static final InputStream in: 标准输入流, 对应的设备是键盘
public static final PrintStream out: 标准输出流 , 对应的设备就是显示器
System.in的类型是InputStream.
System.out的类型是PrintStream是OutputStream的孙子类FilterOutputStream 的子类.
B:案例演示: 输出语句的本质
// 获取标准输出流
PrintStream ps = System.out ;
// 写数据
ps.println(23) ;
ps.println(“你好呀”) ;
System.out.println(“你好呀”) ;
System.out.println();
键盘录入的俩种方式:
//键盘录入数据的两种方式
//方式1
// Scanner sc = new Scanner(System.in);
//方式2
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
while (true){
System.out.println("请输入一行数据");
String s = bfr.readLine();
//自定义一个结束标记
if ("886".equals(s)) {
break;
}
System.out.println(s);
}
4、序列化流
序列化流的概述
所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要重写Serializable 接口才能被序列化
反序列化:就是把文件中存储的对象以流的方式还原成对象
序列化流: ObjectOutputStream
反序列化流: ObjectInputStream
//Serializable 序列化 接口,标记接口,里面没有抽象方法让你重写
public class Student implements Serializable {
//添加一个序列号 为了保证读写的是同一个对象
private static final long serialVersionUID = 7917737762266178722L;
private String name;
//transient 修饰此字段后,此字段不会被序列到硬盘上,不会改变成员变量的值
public transient int age;
可以快速拿到我们想要的元素
Student student = new Student("张三", 23);
Student student2 = new Student("李四", 24);
ArrayList<Student> list = new ArrayList<>();
list.add(student);
list.add(student2);
ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream("student2.txt"));
obj.writeObject(list);
System.out.println("------------------------------");
ObjectInputStream in = new ObjectInputStream(new FileInputStream("student2.txt"));
Object object = in.readObject();斜体样式
ArrayList<Student> list1= (ArrayList) object;
Student student1 = list1.get(1);
System.out.println(student1.getName()+"==="+student1.getAge());
5、随机访问流
随机访问流概述:
RandomAccessFile概述 最大特点 能读能写
RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
支持对随机访问文件的读取和写入。
RandomAccessFile的父类是Object , 这个流对象可以用来读取数据也可以用来写数据.可以操作任意数据类型的数据.
案例演示: 随机访问流读取数据和操作文件指针
// 创建对象
RandomAccessFile raf = new RandomAccessFile("raf.txt" , "rw");
// 读取数据
int a = raf.readInt() ;
System.out.println(a);
System.out.println(raf.getFilePointer());//4 获取文件指针 按字节获取的 写了个int 所以是4
char ch = raf.readChar() ;
System.out.println(ch);
System.out.println(raf.getFilePointer());// 获取文件指针
String result = raf.readUTF() ;//这里会多读两个字节 是因为writeUTF("你好") 会多写两个字节
System.out.println(result);
System.out.println(raf.getFilePointer());
// 设置文件指针的位置 可以往回读
raf.seek(4) ;
ch = raf.readChar() ;
System.out.println(ch);
// 释放资源
raf.close() ;
6、Properties
Properties 类表示了一个持久的属性集。
//Properties 可保存在流中或从流中加载。
//属性列表中每个键及其对应值都是一个字符串。
列1:
Properties properties = new Properties();
properties.put("username", "zhangsan");
//properties.put("passowrd", "123456");
//
//Set<Object> objects = properties.keySet();
//for (Object object : objects) {
// String key= (String) object;
// System.out.println(properties.get(key));
//}
//用Properties特有的方法来添加取出数据
properties.setProperty("username", "zhangsan");
properties.setProperty("password", "123456");
//键找值
String username = properties.getProperty("username");
//键找值,如果没有找到,会返回默认值
String password = properties.getProperty("password","654321");
System.out.println(username);
System.out.println(password);
列2:
Properties properties = new Properties();
properties.setProperty("username","李四");
properties.setProperty("password","123456");
//把属性集合中的数据写入到 文件中去comments
properties.store(new FileOutputStream("u.properties"),null);
System.out.println("------------------------------------");
properties.load(new FileReader("u.properties"));
//通过键找值取出你要的值
String username = properties.getProperty("username");
System.out.println(username);
String password = properties.getProperty("password");
System.out.println(password);
列3:
//A:
//案例演示
//需求:我有一个文本文件,我知道数据是键值对形式的,但是不知道内容是什么。
//请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其值为”100”
Properties properties = new Properties();
properties.load(new FileInputStream("demo.txt"));
boolean b = properties.containsKey("lisi");
if(b){
properties.put("lisi","100");
}
//又写回去
properties.store(new FileOutputStream("demo.txt"),null);