java文件操作字节流和字符流
【摘要】 大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN java领域新星创作者blog.csdn.net/bug…掘金LV3用户 juejin.cn/user/bug…阿里云社区专家博主,星级博主,developer.a...
大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN java领域新星创作者blog.csdn.net/bug…
- 掘金LV3用户 juejin.cn/user/bug…
- 阿里云社区专家博主,星级博主,developer.aliyun.com/bug…
- 华为云云享专家 bbs.huaweicloud.com/bug…
字符流读操作:
//字符流读操作!
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class File3 {
public static void main(String[] args){
Reader reader = null;
try {
//打开文件!
reader = new FileReader("./hello.txt");
while (true){
//一次读取一个字符!
int x = reader.read();
if(x==-1){//读取结束!
break;
}
//输出该字符!
System.out.print((char)x);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//关闭文件!
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我们可以看到上面的代码比较繁琐,因为要处理好多异常,还有关闭文件操作!
我们可以简化一下代码,将文件流在try
语句块创建,语句块结束就会自动关闭资源!
//优化后的代码!
public static void main(String[] args){
///try() 中语句块结束自动关闭资源!
try (Reader reader = new FileReader("./hello.txt")){
//打开文件!
while (true){
//一次读取一个字符!
int x = reader.read();
if(x==-1){//读取结束!
break;
}
//输出该字符!
System.out.print((char)x);
}
} catch (IOException e) {
e.printStackTrace();
}
}
注意:
只要实现了Closeable
这个接口的类都可以进行这样的操作!
而我们的文件操作流对象实现了这个接口!
字符流的读取和字节流的读取大同小异!
int read()
读一个字符int read(char[] cbuf)
将字符读入数组。abstract int read(char[] cbuf, int off, int len)
将字符读入数组的一部分。int read(CharBuffer target)
尝试将字符读入指定的字符缓冲区。
字符流写操作:
//字符流写操作!
public static void main(String[] args) {
//打开文件!
try(Writer writer = new FileWriter("./4_22.txt",true)){
String string = "加油!";
writer.write(string);
System.out.println("追加写入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
常用方法:
Writer append(char c)
将指定的字符附加到此作者。Writer append(CharSequence csq)
将指定的字符序列附加到此作者。Writer append(CharSequence csq, int start, int end)
将指定字符序列的子序列附加到此作者。abstract void close()
关闭流,先刷新。abstract void flush()
刷新流。void write(char[] cbuf)
写入一个字符数组。abstract void write(char[] cbuf, int off, int len)
写入字符数组的一部分。void write(int c)
写一个字符void write(String str)
写一个字符串void write(String str, int off, int len)
写一个字符串的一部分。
上述方法就可以对字符流进行写操作了!
文件操作案例
我们通过下面3个案例进一步巩固学习!
问题一:
扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
//实例一
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class File4 {
public static void main(String[] args) throws IOException {
// 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),
// 并且后续询问用户是否要删除该文件
Scanner scanner = new Scanner(System.in);
//获取要扫描的目录文件!
System.out.print("目录文件->");
String dirctoryString = scanner.next();
File dirctoryFile = new File(dirctoryString);
//获取要删除的文件
System.out.printf("要删除的文件->");
String fileString = scanner.next();
//扫描文件!
scanFile(dirctoryFile,fileString);
}
private static void scanFile(File dirctoryFile,String fileString) throws IOException {
//将该目录下的文件列出!
File[] files = dirctoryFile.listFiles();
for (File file:files) {
System.out.println(file.getCanonicalFile());
if(file.isDirectory()){
//目录文件继续遍历!
scanFile(file,fileString);
}else {
//文件判断是否要删除!
if(file.getName().contains(fileString)){
//进行删除!
file.delete();
}
}
}
}
}
我们可以找到test
文件,然后进行了删除操作!
问题二:
进行普通文件的复制
//实例二:
import java.io.*;
import java.util.Scanner;
public class File5 {
public static void main(String[] args) throws IOException {
//进行文件复制操作!
Scanner scanner = new Scanner(System.in);
//获取要复制的源文件!
System.out.print("源文件->");
String srcString = scanner.next();
File srcFile = new File(srcString);
//获取源文件目录:
String parentString = srcFile.getParent();
System.out.println("目录文件:"+parentString);
//目录文件
File parentFile = new File(parentString);
//获取目标文件
System.out.printf("目标文件->");
String desString = scanner.next();
File desFile = new File(desString);
//扫描文件!
scanner(parentFile,srcFile,desFile);
}
private static void scanner(File parentFile,File srcFile, File desFile) {
File[] files = parentFile.listFiles();
for (File file:files) {
System.out.println(file.getName());
if(file.isDirectory()) {//目录文件继续遍历
scanner(file, srcFile,desFile);
}
if(file.getName().equals(desFile.getName())){
//找到了目标文件!
//进行复制操作!
copyfile(srcFile,desFile);
return;
}
}
}
private static void copyfile(File srcFile, File desFile) {
try(Reader reader = new FileReader(srcFile)){//读src文件!
//存放读取结果
char[] chars = new char[1024];
while (true){
int len = reader.read(chars);
if(len==-1){//读取结束!
break;
}
//写入到目标文件!
try(Writer writer = new FileWriter(desFile,true)){
String string = new String(chars,0,len);
System.out.println("复制内容:"+string);
writer.write(string);
}
System.out.println("复制成功!");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
源文件:
目标文件:
注意这里的目标文件要写绝对或相对路径!
问题三:
扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)
注意 :我们现在的方案性能较差,所以尽量不要在太复杂的目录下或者大文件下实验!
//实例三
import java.io.*;
import java.util.Scanner;
public class File6 {
public static void main(String[] args) throws IOException {
// 扫描指定目录,并找到名称中包含指定字符或者内容的所有普通文件(不包含目录),
Scanner scanner = new Scanner(System.in);
//获取要扫描的目录文件!
System.out.print("目录文件->");
String dirctoryString = scanner.next();
File dirctoryFile = new File(dirctoryString);
//获取要删除的关键字
System.out.printf("要删除的关键字->");
String fileString = scanner.next();
//扫描文件!
scanFile(dirctoryFile,fileString);
}
private static void scanFile(File dirctoryFile,String fileString) throws IOException {
//将该目录下的文件列出!
File[] files = dirctoryFile.listFiles();
for (File file:files) {
System.out.println(file.getCanonicalFile());
if(file.isDirectory()){
//目录文件继续遍历!
scanFile(file,fileString);
}else {
//文件判断是否要删除!
if(file.getName().contains(fileString)){
//文件名称有该关键字进行删除!
file.delete();
System.out.println(file.getName()+" 删除成功!");
}else {
//查看文件内容是否含该关键字!
if(isdelete(file,fileString)){
file.delete();
System.out.println(file.getName()+" 删除成功!");
}
}
}
}
}
private static boolean isdelete(File file, String fileString) {
try(Reader reader = new FileReader(file)){
char[] chars = new char[1024];
while (true){
int len = reader.read(chars);
if(len==-1){
break;
}
String str = new String(chars,0,len);
System.out.println(file.getName()+" 内容:"+str);
if (str.contains(fileString)) {
//如果内容中包含了该关键字!
return true;
}
}
}catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)