IO流就是输入输出流,在Java中用File对文件和目录进行抽象,用输入流和输出流对数据的读取和写入进行抽象。
File
InputStream
FileInputStream
ObjectInputStream
ByteArrayInputStream
BufferedInputStream
OutputStream
FileOutputStream
ObjectOutputStream
ByteArrayOutputStream
BufferedOutputStream
Reader
FileReader
BufferedReader
Writer
FileWriter
BufferedWriter
Properties
File
File是对文件和目录的抽象。
String fileStr = "/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/logback.xml";
File file = new File(fileStr);
//获取文件名称
System.out.println(file.getName());
//获取文件的绝对路径
System.out.println(file.getAbsolutePath());
//获取文件所在目录
System.out.println(file.getParent());
//获取文件长度
System.out.println(file.length());
//判断文件是否存在
System.out.println(file.exists());
//判断是否是文件
System.out.println(file.isFile());
//判断是否是目录
System.out.println(file.isDirectory());
//如果文件/目录不存在,创建文件或目录
if (!file.exists()) {
file.createNewFile();
file.mkdir();
}
I/O流
I/O流是对数据读写的抽象,输入流对应数据的读取,输出流对应数据的写入,另外从操作数据的角度还可以把I/O流分为字节流和字符流,其中字符流用于操作字符数据,虽然字节流也能够完成对字符数据的操作,但在api上没有字符流使用起来方便。
字节流
FileInput/OutputStream
主要用来操作文件。
String fileStr = "/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/logback.xml";
String fileStr1 = "/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/logback1.xml";
FileInputStream fileInputStream = new FileInputStream(new File(fileStr));
FileOutputStream fileOutputStream = new FileOutputStream(new File(fileStr1));
byte[] bs = new byte[1024];
int len = -1;
while ((len = fileInputStream.read(bs)) != -1) {
fileOutputStream.write(bs);
}
fileInputStream.close();
fileOutputStream.close();
//文件拷贝
public static void main(String[] args) throws Exception {
FileInputStream fileInputStream = null;// new FileInputStream(new File("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/girl.jpeg"));
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(new File("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/girl.jpeg"));
fileOutputStream = new FileOutputStream(new File("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/girl1.jpeg"));
byte[] bs = new byte[1024];
int len = -1;
while ((len = fileInputStream.read(bs)) != -1) {
fileOutputStream.write(bs, 0, len);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (fileInputStream != null) {
fileInputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
}
}
ObjectInput/OutputStream
主要用来做对象的序列化和反序列化,static和transition变量不会被序列化。
public class ObjectStreamTest {
public static void main(String[] args) throws Exception {
ObjectStreamTest.out();
ObjectStreamTest.in();
}
public static void out() throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/person.obj"));
Person person = new Person("zhangsan", 10);
oos.writeObject(person);
oos.flush();
oos.close();
}
public static void in() throws Exception {
ObjectInputStream ooi = new ObjectInputStream(new FileInputStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/person.obj"));
Person person = (Person)ooi.readObject();
ooi.close();
System.out.println(person);
}
public static class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
ByteArrayInput/OutputStream
略。
BufferedInput/OutputStream
public static void main(String[] args) throws Exception {
BufferedInputStream inputStream = null;
BufferedOutputStream outputStream = null;
try {
inputStream = new BufferedInputStream(new FileInputStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/girl.jpeg"));
outputStream = new BufferedOutputStream(new FileOutputStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/girl2.jpeg"));
int len = -1;
byte[] bs = new byte[1024];
while ((len = inputStream.read(bs)) != -1) {
outputStream.write(bs, 0, len);
}
outputStream.flush();
}catch (Exception ex) {
ex.printStackTrace();
}finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
字符流
FileReader/FileWriter
处理字符。
public static void main(String[] args) throws Exception {
FileReader fileReader = null;
FileWriter fileWriter = null;
try {
fileReader = new FileReader(new File("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/傲慢与偏见.txt"));
fileWriter = new FileWriter(new File("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/傲慢与偏见1.txt"));
int len = -1;
char[] chars = new char[1024];
while ((len = fileReader.read(chars)) != -1) {
//System.out.println(new String(chars));
fileWriter.write(chars, 0, len);
}
}catch (Exception ex) {
} finally {
if (fileReader != null) {
fileReader.close();
}
if (fileWriter != null) {
fileWriter.close();
}
}
}
BufferedReader/Writer
带缓冲区,效率更高,功能更强大(装饰设计模式)。
public static void main(String[] args) throws Exception {
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
bufferedReader = new BufferedReader(new FileReader(new File("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/傲慢与偏见.txt")));
bufferedWriter = new BufferedWriter(new BufferedWriter(new FileWriter("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/傲慢与偏见2.txt")));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
bufferedWriter.write(line);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
if (bufferedWriter != null) {
bufferedWriter.close();
}
}
}
标准输入输出流
System.in(BufferedInputStream) 是标准输入,System.out(PrintStream) 是标准输出。
public static void main(String[] args) {
//java.io.BufferedInputStream
System.out.println(System.in.getClass());
//java.io.PrintStream
System.out.println(System.out.getClass());
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
System.out.println("input -> " + input);
}
转换流
InputStreamReader和OutputStreamReader,将字节流转换成字符流。
public static void main(String[] args) throws Exception {
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/傲慢与偏见.txt"), StandardCharsets.UTF_8));
bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/傲慢与偏见3.txt"), StandardCharsets.UTF_8));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
bufferedWriter.write(line);
bufferedWriter.newLine();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
if (bufferedWriter != null) {
bufferedWriter.close();
}
}
}
打印流
PrintStream和PrintWriter,打印流只有输出流,没有输入流,将数据打印到指定的输出流中,PrintStream处理字节流,PrintWriter负责处理字符流。
//PrintStream
public static void main(String[] args) throws Exception{
PrintStream printStream = System.out;
printStream.println("print stream");
//修改标准输出的位置
System.setOut(new PrintStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/sys.out"));
System.out.println("print stream");
printStream.close();
}
//PrintWriter
public static void main(String[] args) throws Exception {
PrintWriter printWriter = new PrintWriter(System.out);
printWriter.println("print writer");
printWriter.close();
PrintWriter printWriter1 = new PrintWriter(new FileOutputStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/printwrite.out"));
printWriter1.println("print writer");
printWriter1.close();
}
Properties
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
//加载
properties.load(new FileInputStream("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/p.properties"));
System.out.println(properties.getProperty("id"));
properties.setProperty("name", "lisi");
//写出
properties.store(new FileWriter("/Users/dongzhang/develop/workspace/echo20222022/java-base/src/main/resources/p1.properties"), "");
}