IO:指的是设备之间进行数据传入的流
按照流向分类:
输入流
输出流
按照数据类型分类:
字节流
A:字节输入流 InputStream
FileInputStream:
FileInputStream fis = new FileInputStream("读取数据的文件名");
字节缓冲输入流:BufferedInputStream
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("读取数据的文件名"));
//注意:这里的文件必须提前存在
字节输入流读取数据两种方式:
1、一次读取一个字节
int b = 0;
while((b=bis.read())!=-1){
System.out.print((char)b);
}
bis.close();
2、一次读取一个字节数组
byte[] bytes = new byte[1024];
int length = 0;
while((length = bis.read(bytes))!=-1){
System.out.print(new String(bytes,0,length));
}
bis.close();
package com.shujia.wyh.day23;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class BufferedInputStreamDemo1 {
public static void main(String[] args) throws Exception {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("g.txt"));
//读取数据
//一次读取一个字节
// int b = 0;
// while ((b=bis.read())!=-1){
// System.out.print((char) b);
// }
System.out.println("======================");
byte[] bytes = new byte[1024];
int length = 0;
while ((length = bis.read(bytes)) != -1) { //bis.read(bytes)调用这个方法,将实际获取到的字节存储到数组中,返回的是数组实际读取到的字节数
System.out.println(new String(bytes, 0, length));
}
//释放资源
bis.close();
}
}
B: 字节输出流 OutputStream
FileOutputStream:
FileOutputStream fos = new FileOutputStream("写文件的名字");
字节缓冲输出流:BufferedOutputStream
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(写文件的名字));
//注意:这里文件,可以不存在,之后会自动创建
写数据的方式:bos.write()
1、一次写一个字节
2、一次写一个字节数组
3、一次写一个字节数组的一部分
package com.shujia.wyh.day23;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
public class BufferedOuputStreamDemo1 {
public static void main(String[] args) throws Exception {
//BufferedOutputStream(OutputStream out)
//创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("g.txt"));
//一次性写一个字节数组
bos.write("大数据".getBytes());
bos.close();
}
}
FileOutputStream(String name, boolean append)
创建文件输出流以指定的名称写入文件。
true表示的是可以追加写入数据
package com.shujia.wyh.day22;
import java.io.FileOutputStream;
public class FileOutputStreamDemo3 {
public static void main(String[] args) throws Exception {
//FileOutputStream(String name, boolean append)
//创建文件输出流以指定的名称写入文件。
//true表示的是可以追加写入数据
FileOutputStream fos = new FileOutputStream("e.txt", true);
fos.write("今天下雪了\r\n".getBytes());
fos.write("但是没有看到积雪".getBytes());
//释放资源
fos.close();
}
}
字符流(转换流) = 字节流 + 编码表
A: 字符输入流 Reader
InputStreamReader:
InputStreamReader isr = new InputStreamReader(new FileInputStream("读取数据的文件名"));
简化写法:FileReader
FileReader fr = new FileReader("读取数据的文件名");
普通字符输入流读取数据两种方式:
1、一次读取一个字符
int ch = 0;
while((ch = fr.read())!=-1){
System.out.print((char) ch);
}
fr.close();
2、一次读取一个字符数组
char[] chars = new char[1024];
int length = 0;
while((length = fr.read(chars))!=-1){
System.out.print(new String(chars,0,length));
}
fr.close();
package com.shujia.wyh.day23;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class InputStreamReaderDemo2 {
public static void main(String[] args) throws Exception {
//1、创建字符输入流对象
FileReader fr = new FileReader("e.txt");
//一次只读一个字符
//字符读取,如果已经达到流的结尾,则为-1
// int i = 0;
// while ((i=fr.read())!=-1){
// System.out.print((char) i);
// }
//一次读取一个字符数组
//读取的字符数,如果已经达到流的结尾,则为-1
char[] chars = new char[1024];
int length = 0;
while ((length = fr.read(chars)) != -1) {
System.out.print(new String(chars, 0, length));
}
//释放资源
isr.close();
}
}
字符缓冲输入流:BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("读取数据的文件名")));
BufferedReader br = new BufferedReader(new FileReader("读取数据的文件名"));
字符流读取数据的第三种方式:一次读取一行 readLine()
String s = null;
while((s = br.readLine())!=null){
System.out.print(s);
}
br.close();
package com.shujia.wyh.day23;
import java.io.BufferedReader;
import java.io.FileReader;
public class BufferedReaderDEmo1 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
String s = null;
while((s = br.readLine())!=null){
System.out.print(s);
}
//释放资源
br.close();
}
}
B: 字符输出流 Writer
OutputStreamWriter:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("写文件的名字"));
简化写法:FileWriter
FileWriter fw = new FileWriter("写文件的名字");
写数据的方式:fw.write()
一次写一个字符
一次写一个字符数组
一次写一个字符数组的一部分
一次写一个字符串
字符缓冲输出流:BufferedWriter
BufferedWriter bw = new BufferedWriter(new FileWriter("写文件的名字"));
package com.shujia.wyh.day23;
import java.io.BufferedWriter;
import java.io.FileWriter;
public class BufferedWriterDemo1 {
public static void main(String[] args) throws Exception {
BufferedWriter bw = new BufferedWriter(new FileWriter("a2.txt"));
bw.write("hello");
bw.write("world");
bw.flush();
//释放资源
bw.close();
}
}
字符流特殊的写数据方法:
newLine() 写一个换行符,根据系统不同,这里换行符也是不一样的。
flush()和close()的区别:
1、调用完flush()后,流对象并没有关闭,还能继续写数据。
2、调用完close()后,流对象关闭了,后续无法再通过这个对象写数据。
例:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
package com.shujia.wyh.day23;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class CopyFileDemo4 {
public static void main(String[] args) throws Exception {
//1、创建字符缓冲输入流对象和字符缓冲输出流对象
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b2.txt"));
//一次读写一个字符数组
char[] chars = new char[1024];
int length = 0;
while ((length= br.read(chars))!=-1){
bw.write(chars,0,length); //直接写出不需要强转
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
操作基本数据类型的流
DataInputStream
DataOutputStream
注:读的顺序与写顺序一致
package com.shujia.wyh.day24;
import java.io.*;
public class DataInputStreamDemo1 {
public static void main(String[] args) throws IOException {
// write();
read();
}
private static void read() throws FileNotFoundException, IOException {
DataInputStream dis = new DataInputStream(new FileInputStream("b3.txt"));
byte b = dis.readByte();
System.out.println(b);
short s = dis.readShort();
System.out.println(s);
int i = dis.readInt();
System.out.println(i);
long l = dis.readLong();
System.out.println(l);
float f = dis.readFloat();
System.out.println(f);
double d = dis.readDouble();
System.out.println(d);
char ch = dis.readChar();
System.out.println(ch);
boolean bb = dis.readBoolean();
System.out.println(bb);
dis.close();
}
private static void write() throws IOException {
DataOutputStream dos = new DataOutputStream(new FileOutputStream(
"dos.txt"));
dos.writeByte(1);
dos.writeShort(20);
dos.writeInt(300);
dos.writeLong(4000);
dos.writeFloat(12.34f);
dos.writeDouble(12.56);
dos.writeChar('a');
dos.writeBoolean(true);
dos.close();
}
}
序列化流
序列化:把对象按照流一样的方式存到文本文件或者数据库或者在网络中传输
对象 -- 流数据: ObjectOutputStream
反序列化:把文本文件中的流对象数据或者网络中的流数据还原成一个对象
流数据 -- 对象: ObjectInputStream
serialVersionUID 不允许出现多次插入相同的数据
transient 序列化过程中选择哪些成员不被序列化
package com.shujia.wyh.day24;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectStringDemo {
public static void main(String[] args) throws Exception{
//写方法,将对象存入到文件中,其实就是将对象进行持久化
// write();
//读方法:把文本文件中的流对象数据或者网络中的流数据还原成一个对象
read();
}
public static void read() throws Exception{
//创建对象输入流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));
Object object = ois.readObject();
System.out.println(object);
//释放资源
ois.close();
}
public static void write() throws Exception{
//创建对象输出流对象
//ObjectOutputStream(OutputStream out)
//创建一个写入指定的OutputStream的ObjectOutputStream。
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
//创建一个对象
Person p1 = new Person("小周", 18);
oos.writeObject(p1);
//释放资源
oos.close();
}
}
class Person implements Serializable {
private static final long serialVersionUID = 2880662336900677170L;
private String name;
private transient int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Properties集合
Properties的特殊功能
public Object setProperty(String key,String value)
public String getProperty(String key)
package com.shujia.wyh.day24;
import java.util.Properties;
public class PropertiesDemo {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "123456");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
System.out.println(user + "--" + password);
}
}