1.PrintWriter(高级字符输出流)
|
构造器示例 |
说明 |
|
|
直接关联文件路径(自动创建文件,覆盖原有内容) |
|
|
关联 |
|
|
包装基础字符输出流(如 |
|
|
包装字节输出流(自动转换为字符流,默认使用系统编码) |
|
|
第二个参数为 |
2.小程序练习
① 扫描指定目录 , 找到名称中包含指定关键字的所有普通文件(不包含目录) , 并且后续询问是否要删除文件
import java.io.File;
import java.util.Scanner;
public class demo12 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要搜索的目录:");
String rootDir = scanner.nextLine();
File rootFile = new File(rootDir);
if(!rootFile.isDirectory()){
System.out.println("输入的不是目录");
return;
}
System.out.println("请输入要删除的关键字:");
String keyword = scanner.nextLine();
scanDir(rootFile,keyword);
}
private static void scanDir(File rootFile, String keyword) {
File[] files = rootFile.listFiles();
if(files == null){
return;
}
for (File file:files) {
System.out.println("遍历目录或文件"+file.getAbsolutePath());
if(file.isFile()){
dealFile(file,keyword);
}else {
scanDir(file,keyword);
}
}
}
private static void dealFile(File file, String keyword) {
if(file.getName().contains(keyword)){
System.out.println("发现文件"+file.getAbsolutePath()+", 包含关键字! 是否删除? (y/n)");
Scanner sc = new Scanner(System.in);
String choice = sc.next();
if(choice.equalsIgnoreCase("y")){
file.delete();
System.out.println("文件删除"+file.getAbsolutePath());
}
}
}
}
- 先复制所在文件目录地址
- 文件名
② 进行普通文件复制
import java.io.*;
import java.util.Scanner;
public class demo13 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入源文件路径");
String srcPath = sc.nextLine();
System.out.println("请输入目标文件路径");
String destPath = sc.nextLine();
File scrFile = new File(srcPath);
if(!scrFile.isFile()){
System.out.println("源文件不存在");
return;
}
File destFile = new File(destPath);
if(!destFile.isFile()){
System.out.println("目标文件不存在");
return;
}
try(InputStream inputStream = new FileInputStream(scrFile);
OutputStream outputStream = new FileOutputStream(destFile)) {
while(true){
byte[] data = new byte[1024];
int len = inputStream.read(data);
if(len == -1){
break;
}
outputStream.write(data,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
③ 扫描指定目录 , 并找到名称或内容中包含指定字符的所有普通文件(不包括目录)
import java.io.*;
import java.util.Scanner;
public class demo14 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要搜索的路径");
String srcPath = sc.nextLine();
File srcFile = new File(srcPath);
if (!srcFile.isDirectory()) {
System.out.println("输入的路径不是目录!");
return;
}
System.out.println("请输入要搜索的关键字");
String keyword = sc.nextLine();
scanDir(srcFile,keyword);
}
private static void scanDir(File srcFile, String keyword) {
File[] files = srcFile.listFiles();
if(files == null){
return;
}
for (File file:files) {
System.out.println("遍历目录或文件"+file.getAbsolutePath());
if(file.isFile()){
dealFile(file,keyword);
}else {
scanDir(file,keyword);
}
}
}
private static void dealFile(File file, String keyword) {
if(file.getName().contains(keyword)){
System.out.println("发现文件"+file.getAbsolutePath());
}
StringBuilder stringBuilder = new StringBuilder();
try(Reader reader = new FileReader(file)) {
while (true) {
char[] data = new char[1024];
int len = reader.read(data);//此处必须传入data数组,否则会报空指针异常
if(len == -1 ) {
break;
}
stringBuilder.append(data,0,len);
}
}catch (IOException e) {
e.printStackTrace();
}
if(stringBuilder.toString().contains(keyword)){
System.out.println("发现文件包含关键字"+file.getAbsolutePath());
}
// if(stringBuilder.indexOf(keyword)>=0){
// System.out.println("发现文件包含关键字"+file.getAbsolutePath());
// }
return;
}
}
- 判断文件名是否包含关键字 ; 若包含关键字打印文件名
- 判断文件内容是否包含关键字(字符流 Reader)并追加写入 stringBuilder
- 判断 stringBuilder 是否包含关键字
3.代码参考
① 如何按字节进行数据读
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class demo15 {
public static void main(String[] args) {
try(InputStream is = new FileInputStream("test.tst")){
byte[] data = new byte[1024];
while(true){
int n = is.read(data);
if (n == -1) {
break;
}
//后续业务逻辑
System.out.println(new String(data,0,n));
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
② 如何按字节进行数据写
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class demo17 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要写入文件的内容");
String content = sc.nextLine();//只读取一行
byte[] data = content.getBytes();
try(OutputStream os = new FileOutputStream("test.txt")) {
os.write(data);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
③ 如何按字符进行数据读
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class demo18 {
public static void main(String[] args) {
String fileName = "test.txt";
try(InputStream is = new FileInputStream(fileName)) {
try(Scanner sc = new Scanner(is)){//封装为Scanner对象
while(sc.hasNextLine()){
String line = sc.nextLine();
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
④ 如何按照字符进行数据写
import java.io.*;
public class demo19 {
public static void main(String[] args) {
String fileName = "test.txt";
String[] data = {"hello world\n", "hello java\n"};
try(OutputStream os = new FileOutputStream(fileName)) {//获取字节输出流
try(OutputStreamWriter osw = new OutputStreamWriter(os)){//封装为字符输出流
try(PrintWriter ow = new PrintWriter(osw)){//使用PrintWriter简化写入
for (String s : data) {
ow.println(s);
}
ow.flush();
System.out.println("写入完成");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
752






