Java文件内容读写:对于文件,按其逻辑结构可以分为无结构文件和有结构文件。其中无结构文件又称之为流式文件,具体又可以细分为二进制文件和文本文件。在Java中,提供了一组类来完成流式文件的读写操作,主要分为两类,它们的继承关系如下
-
字节流:以
byte
为单位读取,针对二进制文件-
读取:
InputStream
(父类)FileInputStream
(普通读取)BufferedInputStream
(高级读取)ObjectInputStream
(对象读取)
-
写出:
OutputStream
(父类)FileOutputStream
(普通写出)BufferedInputStream
(高级写出)ObjectInputStream
(对象写出)
-
-
字符流:以
char
为单位读取,针对文本文件-
读取:
Reader
(父类)InputStreamReader
(高级读取)BufferedReader
(普通读取)
-
写出:
Writer
(父类)OutputStreamWriter
(高级写出)BufferedWriter
(普通写出)
-
这里我们只介绍FileInputStream
、FileReader
和FileOutputStream
、FileWriter
一:FileInputStream和FileReader
(1)FileInputStream
InputStream
(父类)涉及方法如下
FileInputStream
构造方法如下
如下,创建一个文件test.txt
,然后在其中写入"Hello World
",然后再使用FileInputStream
读取
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class TestDemo7 {
public static void main(String[] args) throws IOException {
try(InputStream inputStream = new FileInputStream("./test.txt")) {
while (true) {
int b = inputStream.read();
if (b == -1) {
//返回-1读取完毕
break;
}
System.out.println(b);
}
}
}
}
(2)Reader
Readr
涉及方法如下
FileReadr
构造方法如下
使用FileReadr
读取test.txt
文件中的Hello World!
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class TestDemoo9 {
public static void main(String[] args) throws IOException {
try(Reader reader = new FileReader("./test.txt")){
while (true) {
int ret = reader.read();
if (ret == -1) {
break;
}
char ch = (char) ret;
System.out.println(ch);
}
}
}
}
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class TestDemo15 {
public static void main(String[] args) throws IOException {
// 输入
Scanner scanner = new Scanner(System.in);
System.out.println("请输入扫描路径:");
File rootDir = new File(scanner.next());
String toFind = scanner.next();
// 扫描
scanDir(rootDir, toFind);
}
private static void scanDir(File rootDir, String toFind) throws IOException {
File[] files = rootDir.listFiles();
if (files == null) {
return;
}
for (File f : files) {
if (f.isDirectory()) {
scanDir(f, toFind);
} else {
checkFile(f, toFind);
}
}
}
private static void checkFile(File f, String toFind) throws IOException {
// 检查文件名
if (f.getName().contains(toFind)) {
System.out.println(f.getCanonicalFile() + "文件中包含 " + toFind);
}
// 检查文件内容
try (InputStream inputStream = new FileInputStream(f)) {
StringBuilder stringBuilder = new StringBuilder();
Scanner scanner = new Scanner(inputStream);
// 按行读取
while (scanner.hasNextLine()) {
stringBuilder.append(scanner.nextLine() + "\n");
}
if (stringBuilder.indexOf(toFind) > -1) {
System.out.println(f.getCanonicalPath() + "文件内容包含" + toFind);
}
}
}
}
二:FileOutputStream和FileReader
(1)FileOutputStream
FileOutputStream
构造方法如下
如下,对之前的test.txt
文件进行写入操作,在其中写入"aAbBcC
",然后再次运行程序,这次写入"defgh
"
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class TestDemo8 {
public static void main(String[] args) throws IOException {
try(OutputStream outputStream = new FileOutputStream("./test.txt", true)) {
outputStream.write(97); // a
outputStream.write(65); // A
outputStream.write(98); // b
outputStream.write(66); // B
outputStream.write(99); // c
outputStream.write(67); // C
}
}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class TestDemo8 {
public static void main(String[] args) throws IOException {
try(OutputStream outputStream = new FileOutputStream("./test.txt", true)) {
byte[] arr = {100, 101, 102, 103, 104}; // defgh
outputStream.write(arr);
// outputStream.write(97); // a
// outputStream.write(65); // A
// outputStream.write(98); // b
// outputStream.write(66); // B
// outputStream.write(99); // c
// outputStream.write(67); // C
}
}
}
(2)Writer
Writer
涉及方法如下
FileWriter
构造方法如下
使用Writer
向test.txt
中写入"Have a nice day!
"
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class TestDemo10 {
public static void main(String[] args) throws IOException {
try(Writer writer = new FileWriter("./test.txt", true)) {
String str = "Have a nice day!";
writer.write(str);
}
}
}
三:使用Scanner进行读取和PrintWriter进行写入
前面学习到过的Scanner
可以配合FileInputStream
使用,十分方便
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class TestDemo11 {
public static void main(String[] args) throws IOException {
try(InputStream inputStream = new FileInputStream("./test.txt")) {
try(Scanner sc = new Scanner(inputStream)){
while (sc.hasNext()) {
System.out.println(sc.next());
}
}
}
}
}
PrintWriter
可以配合FileOutputStream
使用,十分方便
import java.io.*;
public class TestDemo12 {
public static void main(String[] args) throws IOException {
try (OutputStream outputStream = new FileOutputStream("./test.txt")) {
try(PrintWriter writer = new PrintWriter(outputStream)) {
writer.println("Have a nice day please");
writer.printf("a = %d\n", 10);
}
}
}
}
评论区