java基础——IO流
目录
1. 文件与常见文件操作
1.1 文件概念
1.2 常见文件操作
2. Java IO 流原理及分类
2.1 原理
2.2 分类
3. 基本流类介绍
3.1 FileInputStream
3.2 FileOutputStream
3.3 FileReader
编辑
3.4 FileWriter
编辑
4. 节点流和处理流
4.1 节点流
4.2 处理流(包装流)
4.3 节点流和处理流的区别和联系
5. 打印流
5.1 PrintStream 和 PrintWriter
6. Properties 类
1. 文件与常见文件操作
1.1 文件概念
在计算机中,文件是存储在存储设备(如硬盘、U 盘等)上的数据集合,可以是文本文件(如
.txt
、.java
)、二进制文件(如.jpg
、.mp3
)等。大家经常使用的word文档,txt文件、excel文件...都是文件。
文件在程序中是以流的形式操作的
1.2 常见文件操作
创建文件对象相关构造器和方法
new File(String pathname) //根据路径构建一个File对象
new File(File parent,String child)//根据父目录文件+子路径构建
new File(String parent,String child)//根据父目录+子路径构建
文件创建、获取文件的信息、删除
import java.io.File;
import java.io.IOException;
public class FileExample {
public static void main(String[] args) {
// 创建一个 File 对象,指向一个文件
File file = new File("test.txt");
try {
// 创建新文件
if (file.createNewFile()) {
System.out.println("文件创建成功");
} else {
System.out.println("文件已存在");
}
// 获取文件信息
System.out.println("文件名称: " + file.getName());
System.out.println("文件路径: " + file.getAbsolutePath());
System.out.println("文件大小: " + file.length() + " 字节");
// 删除文件
if (file.delete()) {
System.out.println("文件删除成功");
} else {
System.out.println("文件删除失败");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. Java IO 流原理及分类
2.1 原理
Java IO 流是一种用于处理输入输出的机制,它通过流的方式将数据从一个源(如文件、网络连接等)传输到另一个目标(如另一个文件、控制台等)。可以把流想象成一个管道,数据在管道中流动。
2.2 分类
- 按数据流向分:
- 输入流:用于从数据源读取数据到程序中。
- 输出流:用于将程序中的数据写入到目标位置。
- 按处理数据的单位分:
- 字节流:以字节(8 位)为单位处理数据,适合处理二进制数据。
- 字符流:以字符(16 位)为单位处理数据,适合处理文本数据。
3. 基本流类介绍
3.1 FileInputStream
FileInputStream
是字节输入流,用于从文件中读取字节数据。
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("test.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.2 FileOutputStream
FileOutputStream
是字节输出流,用于将字节数据写入到文件中。
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamExample {
public static void main(String[] args) {
String content = "Hello, Java IO!";
try (FileOutputStream fos = new FileOutputStream("test.txt")) {
byte[] bytes = content.getBytes();
fos.write(bytes);
System.out.println("数据写入成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.3 FileReader
FileReader
是字符输入流,用于从文件中读取字符数据。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Filereader {
public static void main(String[] args) throws IOException {
String filePath = "d://news1.txt";
String fileOut = "d://news2.txt";
FileReader fileReader = new FileReader(filePath);
FileWriter fileWriter = new FileWriter(fileOut);
int readLen = 0;
char[] buf = new char[8];
while((readLen = fileReader.read(buf)) != -1){
fileWriter.write(buf,0,readLen);
}
fileWriter.close();
fileReader.close();
}
}
3.4 FileWriter
FileWriter
是字符输出流,用于将字符数据写入到文件中。
import org.junit.jupiter.api.Test;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class Fileoutputstream {
@Test
public void WriteFile(){
String filePath = "d://news2.txt";
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(filePath);
String str = "hello韩顺平";
fileOutputStream.write(str.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileOutputStream.close();//文件流关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4. 节点流和处理流
4.1 节点流
节点流是直接与数据源或目标相连的流,如 FileInputStream
、FileOutputStream
、FileReader
、FileWriter
等,它们可以直接从文件、内存等数据源读取或写入数据。
4.2 处理流(包装流)
处理流是对节点流进行包装的流,它可以增强节点流的功能,如提供缓冲、转换等功能。例如 BufferedInputStream
、BufferedOutputStream
、BufferedReader
、BufferedWriter
等。
分类 | 字节处理流 | 字节输出流 | 字符输入流 | 字符输出流 |
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataInputStream | DataOutputStream |
4.3 节点流和处理流的区别和联系
- 节点流是底层流/低级流, 直接和数据源相接
- 处理流包装节点流, 既可以消除不同节点流之间的实现差异, 也可以提供更方便的方法来完成输入输出
- 处理流对节点流进行包装,使用了修饰器设计模式, 不会直接与数据源相连
示例:使用 BufferedInputStream
和 BufferedOutputStream
复制文件
import java.io.*;
public class BufferedStreamExample {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
System.out.println("文件复制成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
5. 打印流
5.1 PrintStream
和 PrintWriter
打印流提供了方便的打印方法,如 print()
、println()
等。PrintStream
是字节打印流,PrintWriter
是字符打印流。
示例:使用 PrintWriter
写入数据到文件
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class PrintWriterExample {
public static void main(String[] args) {
try (PrintWriter pw = new PrintWriter(new FileWriter("test.txt"))) {
pw.println("Hello, PrintWriter!");
pw.print("This is a test.");
System.out.println("数据写入成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
6. Properties
类
Properties
类是 Hashtable
的子类,用于处理属性文件,属性文件通常以 .properties
为扩展名,文件内容以键值对的形式存储。
示例:读取和写入属性文件
import java.io.*;
import java.util.Properties;
public class PropertiesExample {
public static void main(String[] args) {
Properties properties = new Properties();
// 写入属性文件
try (FileOutputStream fos = new FileOutputStream("config.properties")) {
properties.setProperty("username", "admin");
properties.setProperty("password", "123456");
properties.store(fos, "Configuration");
System.out.println("属性文件写入成功");
} catch (IOException e) {
e.printStackTrace();
}
// 读取属性文件
try (FileInputStream fis = new FileInputStream("config.properties")) {
properties.load(fis);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println("Username: " + username);
System.out.println("Password: " + password);
} catch (IOException e) {
e.printStackTrace();
}
}
}
通过以上内容,你可以对 Java IO 流有一个较为全面的了解,包括文件操作、流的原理和分类、基本流类的使用、节点流和处理流、打印流以及 Properties
类的应用。