1.什么是流
内存与存储设备之间传输数据的通道。
2.流的分类
2.1根据方向分为输入流与输出流
输入流:将存储设备中的内容读取到内存中。
输出流:将内存中的内容写入到存储设备中。
2.2根据单位分为字节流与字符流
字节流:以字节为单位读取输入流,支持所有数据。
字符流:以字符为单位读取输入流,只能是文本数据。
2.3根据功能分为节点流与过滤流
节点流:实际传输数据的读写功能。
过滤流:在节点流的基础之上增强功能。
3.字节流
字节流的父类InputStream与OutputStream,都是抽象类。
InputStream:字节输入流
int read() | 读取下一个字节,字节值范围是0-255。如果返回-1代表已到流的末尾。 |
int read(byte[] b) | 以指定长度的字节数组读取流。返回读取到的实际字节数组个数,如果返回-1代表已到流的末尾。 |
int read(byte[] b,int off,int len) | 以指定的字节数组读取流,并可以通过off指定字节数组覆盖位置,len指定字节输入覆盖的长度。如果返回-1代表已到流的末尾。 |
OutputStream:字节输出流
void write(int b) | 将指定的字节写入该输出流中 |
void write(byte[] b) | 将指定的字节数组写入该输出流 |
void write(byte[] b,int off,int len) | 将指定的字节数组写入该输出流,off指定字节输入写入的起始位置,len指定写入的字节数组长度。 |
4.FileInputStream
文件读取流。
FileInputStreamStudy.txt内容:
abcdefg
示例代码:
package com.gisapartment.java.io;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class FileInputStreamStudy {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("FileInputStreamStudy.txt");
System.out.println("方法1:使用read()方法:");
int t;
while ((t=fileInputStream.read())!=-1){
System.out.print((char) t);
}
fileInputStream.close();
fileInputStream = new FileInputStream("FileInputStreamStudy.txt");
System.out.println();
System.out.println("方法2:使用read(byte b[])方法:");
byte[] temp = new byte[3];
int count;
while ((count=fileInputStream.read(temp))!=-1){
System.out.print(new String(temp,0,count));
}
fileInputStream.close();
System.out.println();
System.out.println("读取完毕!");
}
}
5.FileOutputStream
文件输出流。
注意:可以通过FileOutputStream构造函数指定是否追加输出,而不是覆盖输出。
示例代码:
package com.gisapartment.java.io;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class FileOutputStreamStudy {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("FileOutputStreamStudy.txt",true);
String content = "www.gisapartment.com\n";
fileOutputStream.write(content.getBytes());
fileOutputStream.close();
System.out.println("输出完毕!");
}
}
6.字节流复制文件
示例代码:
package com.gisapartment.java.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class CopyFile {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("FileInputStreamStudy.txt");
FileOutputStream fileOutputStream = new FileOutputStream("FileInputStreamStudyCopy.txt");
byte[] content = new byte[1024];
int count = 0;
while ((count=fileInputStream.read(content))!=-1){
fileOutputStream.write(content, 0, count);
}
fileInputStream.close();
fileOutputStream.close();
}
}
7.字节缓冲流
缓冲流:BufferedInputStream/BufferedOutputStream
- 提高IO效率,减少访问磁盘的次数。
- 数据存储在缓冲区中,flush将缓冲区的内容写入文件中,也可以直接close。
BufferedInputStream示例代码:
package com.gisapartment.java.io;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class BufferedInputStreamStudy {
public static void main(String[] args) throws IOException {
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("FileInputStreamStudy.txt"));
byte[] content = new byte[1024];
int count = 0;
while ((count=bufferedInputStream.read(content))!=-1){
System.out.print(new String(content,0,count));
}
bufferedInputStream.close();
}
}
BufferedOutputStream示例代码:
package com.gisapartment.java.io;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class BufferedOutputStreamStudy {
public static void main(String[] args) throws Exception {
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("BufferedOutputStreamStudy.txt"));
for (int i = 0; i < 10; i++) {
bufferedOutputStream.write("www.gisapartment.com\n".getBytes());
bufferedOutputStream.flush();
}
bufferedOutputStream.close();
}
}
8.对象流
ObjectInputStream/ObjectOuputStream
- 增强了缓冲区功能。
- 增强了读写8种基本数据类型和字符串功能。
- 增强了读写对象的功能:readObject() 从流种读取一个对象;writeObject(Object obj)向流中写入一个对象。
序列化示例代码:
package com.gisapartment.java.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class SerializationStudy {
public static void main(String[] args) throws IOException {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("SerializationStudy.object"));
Person person = new Person();
person.setAge(20);
person.setName("GIS公寓");
objectOutputStream.writeObject(person);
objectOutputStream.close();
}
}
反序列化示例代码:
package com.gisapartment.java.io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class DeserializationStudy {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("SerializationStudy.object"));
Object object = objectInputStream.readObject();
if (object instanceof Person){
System.out.println(object);
}
objectInputStream.close();
}
}
输出结果:
Person{name='GIS公寓', age=20}
注意:
- 序列化的类必须实现Serializable接口。
- 序列化类中的每个对象属性必须实现Serializable接口。
- 序列化ID(serialVersionUID)是对象版本号,保证序列化的类与反序列化的类是同一个类。
- 使用transient(短暂的)修饰的属性,不能被序列化。
- 静态属性不能被序列化。
- 序列化多个对象,可以通过集合实现。
9.常见字符编码
编码方式与解码方式不一致时,会出现乱码。
名称 | 范围 | 字节数 |
ISO-8859-1 | 收录ASCII、西欧、希腊语、泰语、阿拉伯语、希伯来语 | 1 |
UTF-8 | 针对Unicode码表的的可变长度字符编码,包含所有国家常见字符 | 1、2、3 |
GB2312 | 简体中文 | 1、2 |
GBK | 简体中文、扩充 | 1、2 |
BIG5 | 台湾,繁体中文 | 2 |
10.字符流
字符流的父类Reader与Writer,都是抽象类。
Reader:字符输入流
- int read()
- int read(char[] c)
- int read(char[] b,int off,int len)
Writer:字符输出流
- void write(int n)
- void write(String str)
- void write(char[] c)
11.文件字符流
FileReader:文件字符读取流。
示例代码:
package com.gisapartment.java.io;
import java.io.FileReader;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class FileReaderStudy {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("FileReaderStudy.txt");
System.out.println("方法1:使用read()方法:");
int count = 0;
while ((count=fileReader.read())!=-1){
System.out.print((char) count);
}
fileReader.close();
System.out.println();
System.out.println("方法2:使用read(byte b[])方法:");
char[] content = new char[1024];
fileReader = new FileReader("FileReaderStudy.txt");
while ((count=fileReader.read(content))!=-1){
System.out.print(new String(content, 0, count));
}
System.out.println();
fileReader.close();
}
}
FileWriter:文件字符写入流。
示例代码:
package com.gisapartment.java.io;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class FileWriterStudy {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("FileWriterStudy.txt");
for (int i = 0; i < 10; i++) {
fileWriter.write("GIS公寓\n");
fileWriter.flush();
}
fileWriter.close();
}
}
12.字符流复制文件
注意:只能复制文本文件,不能复制图片、视频等其它文件。
示例代码:
package com.gisapartment.java.io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class CopyFileUseCharStream {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("FileWriterStudy.txt");
FileWriter fileWriter = new FileWriter("CopyFileUseCharStream.txt");
int count = 0;
while ((count=fileReader.read())!=-1){
fileWriter.write(count);
}
fileWriter.close();
fileReader.close();
}
}
13.字符缓冲流
缓冲流:BufferedReader/BufferedWriter。
- 高效读写。
- 支持输入换行符,调用指定的方法。
- 可一次写一行、读一行。
BufferedReader示例代码:
package com.gisapartment.java.io;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class BufferedReaderStudy {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader("BufferWriterStudy.txt"));
String line = null;
while ((line=bufferedReader.readLine())!=null){
System.out.println(line);
}
bufferedReader.close();
}
}
BufferedWriter示例代码:
package com.gisapartment.java.io;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class BufferedWriterStudy {
public static void main(String[] args) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("BufferWriterStudy.txt"));
for (int i = 0; i < 10; i++) {
bufferedWriter.write("GIS公寓");
bufferedWriter.newLine();
bufferedWriter.flush();
}
bufferedWriter.close();
}
}
14.打印流
PrintWriter:
- 封装了print()/println()方法,支持写入后换行。
- 支持数据原样打印。
示例代码:
package com.gisapartment.java.io;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class PrintWriterStudy {
public static void main(String[] args) throws FileNotFoundException {
PrintWriter printWriter = new PrintWriter("PrintWriterStudy.txt");
printWriter.println(1024);
printWriter.println("GIS公寓");
printWriter.println(13.14);
printWriter.println(true);
printWriter.close();
}
}
15.转换流
桥转换流:InputStreamReader/OutputStreamWriter
- 可将字节流转换为字符流。
- 可设置字符的编码方式。
InputStreamReader示例代码:
package com.gisapartment.java.io;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class InputStreamReaderStudy {
public static void main(String[] args) throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("InputStreamReaderStudy.txt"), StandardCharsets.UTF_8);
int data = 0;
while ((data=inputStreamReader.read())!=-1){
System.out.print((char) data);
}
inputStreamReader.close();
}
}
OutputStreamWriter示例代码:
package com.gisapartment.java.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class OutputStreamWriterStudy {
public static void main(String[] args) throws IOException {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("OutputStreamWriterStudy.txt"), StandardCharsets.UTF_8);
for (int i = 0; i < 10; i++) {
outputStreamWriter.write("GIS公寓\n");
outputStreamWriter.flush();
}
outputStreamWriter.close();
}
}
16.File类
概念:代表物理盘符中的一个文件或者文件夹。
常用方法:
方法名 | 解释 |
createNewFile() | 创建一个新文件 |
mkdir() | 创建一个新目录 |
delete() | 删除文件或空目录 |
exists() | 判断文件或文件夹是否存在 |
getAbsolutePath() | 获取文件的绝对路径 |
getName() | 获取文件名,注意会带文件后缀 |
getParent() | 获取文件/目录所在的目录 |
isDirectory() | 判断是否是目录 |
isFile() | 是否为文件 |
length() | 获取文件的长度 |
listFiles() | 列出目录中的所有内容 |
renameTo() | 修改文件名为 |
deleteOnExit() | jvm退出后删除文件 |
canWrite() | 判断文件是否可写入 |
FileFilter示例代码:
package com.gisapartment.java.io;
import java.io.File;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class FileFilterStudy {
public static void main(String[] args) {
File file = new File(System.getProperty("user.dir"));
File[] files = file.listFiles(pathname -> pathname.getName().endsWith("txt"));
for (File file1 : files) {
System.out.println(file1);
}
}
}
17.Properties
属性集合,线程安全。
特点:
- 存储属性名和属性值。
- 属性名和属性值都是字符串类型。
- 没有泛型。
- 和流有关。
示例代码:
package com.gisapartment.java.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;
import java.util.Set;
/**
* @author www.gisapartment.com
* Copyright © www.gisapartment.com
*/
public class PropertiesStudy {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
properties.setProperty("String_Title", "PropertiesStudy");
properties.setProperty("String_Name", "Properties");
Set<String> strings = properties.stringPropertyNames();
for (String string : strings) {
System.out.println("Key:"+string+";"+properties.getProperty(string));
}
// 输出
PrintWriter printWriter = new PrintWriter("PropertiesStudy.txt");
properties.list(printWriter);
printWriter.close();
// 加载
FileOutputStream fileOutputStream = new FileOutputStream("PropertiesStudyStore.txt");
properties.store(fileOutputStream, "www.gisapartment.com");
fileOutputStream.close();
}
}
PropertiesStudy.txt内容:
-- listing properties --
String_Name=Properties
String_Title=PropertiesStudy
PropertiesStudyStore.txt内容:
#www.gisapartment.com
#Wed Apr 28 21:27:36 CST 2021
String_Name=Properties
String_Title=PropertiesStudy