目录
一、引言
本篇博客继续讲解文件IO的知识,本次讲解的是File类的用法以及InputStream,OutputStream的用法。
二、File类
2.1属性
修饰符及类型 | 属性 | 说明 |
static String | pathSeparator | 依赖于系统的路径分隔符,String类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char类型的表示 |
2.2构造方法
签名 | 说明 |
File(File paren,String child) | 根据父目录+孩子文件路径,创建一个新的File实例 |
File(String pathname) | 根据文件路径创建一个新的File实例,路径可以是绝对路径或者相对路径 |
File(String parent,String child) | 根据父目录+孩子文件路径,创建一个新的File实例,父目录用路径表示 |
2.3方法
代码示例:
public class Main{
public static void main(String args[]){
File file= new File("..\\test.txt");
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
}
File的创建以及删除:
public class Test {
public static void main(String[] args) throws IOException {
File file= new File("text.txt");
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.createNewFile());
}
}
普通文件的删除:
public class Test2 {
public static void main(String[] args) throws IOException {
File file=new File("test2.txt");
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.delete());
System.out.println(file.exists());
}
}
观察deleteOnExit的现象:
public class Test3 {
public static void main(String[] args) throws IOException {
File file=new File("test.txt");
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
file.deleteOnExit();
System.out.println(file.exists());
}
}
观察目录的创建:
public class Test4 {
public static void main(String[] args) {
File dir = new File("some-dir");
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
观察目录创建2:
public class Test5 {
public static void main(String[] args) {
File dir =new File("some-dir2\\some-dir1");
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
//上述结果全是false,与上面一个代码结果不同,
//这是因为mkdir()若中间目录不存在,
//则无法创建成功,这时需要使用mkdirs();
观察文件重命名:
public class Test6 {
public static void main(String[] args) {
File file=new File("test.txt");
File dest=new File("dest.txt");
System.out.println(file.exists());
System.out.println(dest.exists());
System.out.println(file.renameTo(dest));
System.out.println(file.exists());
System.out.println(dest.exists());
}
}
三、文件内容的读写--数据流
3.1InputStream概述
1.方法
修饰符及返回值类型 | 方法签名 | 说明 |
int | read() | 读取一个字节的数据,返回-1代表已经完全读完了。 |
int | read(byte [] b) | 最多读取b.length字节的数据到b中,返回实际读到的数量,-1代表以及读完了。 |
int | read(byte[] b ,int off,int len) | 最多读取len-off字节的数据到b中,返回实际读取的数量,-1代表以及读完了 |
void | close() | 关闭字节流 |
说明
InputStream只是一个抽象类,要使用还需要具体的类。
FileInputStream
构造方法:
签名 | 说明 |
FileInputStream(File file) | 利用File构造文件输入流 |
FIleInputStream(String name) | 利用文件路径构造文件输入流 |
代码示例:
public class Test7 {
public static void main(String[] args) {
try(InputStream is =new FileInputStream("test.txt")){
while(true){
int b=is.read();
if(b==-1){
break;
}
System.out.printf("%c",b);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public class Test8 {
public static void main(String[] args) throws FileNotFoundException {
try(InputStream is =new FileInputStream("test.txt")){
byte [] buf =new byte[1024];
int len;
while(true){
len= is.read(buf);
if(len==-1){
break;
}
for (int i = 0; i < len; i++) {
System.out.printf("%c",buf[i]);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
利用Scanner进行字符读取
public class Test9 {
public static void main(String[] args) {
try(InputStream is =new FileInputStream("test.txt")){
try(Scanner scanner = new Scanner(is,"UFT-8")){
while(scanner.hasNext()){
String s=scanner.next();
System.out.print(s);
}
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
3.2OutputStream概述
1.方法
代码示例:
public class Test10 {
public static void main(String[] args) {
try(OutputStream os =new FileOutputStream("output.txt")){
os.write('H');
os.write('E');
os.write('L');
os.write('L');
os.write('O');
os.flush();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
四、小程序练习
1.扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
public class Demo11 {
public static void main(String[] args) {
//1.输入必要的信息
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要搜索的目录:");
String rootPath=scanner.next();
System.out.println("请输入要查询的词:");
String searchWord=scanner.next();
//构造File对象,检查路径是否合法
File rootFile=new File(rootPath);
if(!rootFile.isDirectory()){
System.out.println("输入的路径非法!");
return;
}
//3.进行递归搜索
searchFile(rootFile,searchWord);
}
private static void searchFile(File rootFile,String searchWord){
//1.列出当前目录有哪些内容
File [] files=rootFile.listFiles();
if(files==null){
//空目录,返回
return;
}
//2.遍历目录下的每个结果,进行判定。
for(File f:files){
if(f.isFile()){
String fileName =f.getName();
if(fileName.contains(searchWord)){
System.out.println("找到匹配结果为:"+f.getAbsolutePath());
}
}else if (f.isDirectory()){
searchFile(f,searchWord);
}
}
}
}
2.进行普通文件的复制
public class Demo12 {
public static void main(String[] args) {
//1.输入必要信息
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要复制的文件路径:");
String srcPath=scanner.next();
System.out.println("请输入要复制到的目标路径:");
String destPath=scanner.next();
//2.验证上述路径是否合法
File srcFile=new File(srcPath);
if(!srcFile.isFile()){
System.out.println("输入的要复制的文件路径非法!");
return ;
}
File destFile=new File(destPath);
if(!destFile.getAbsoluteFile().isDirectory()){
System.out.println("输入的要复制的目标路径非法!");
return ;
}
//3.读写文件
try(InputStream inputStream=new FileInputStream(srcFile);
OutputStream outputStream=new FileOutputStream(destFile)){
while(true){
byte [] bytes=new byte[1024];
int n=inputStream.read(bytes);
if(n==-1){
break;
}
outputStream.write(bytes,0,n);
}
}catch (IOException e){
e.printStackTrace();
}
}
}
3. 扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)
public class Demo13 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要搜索的路径:");
String path=scanner.next();
System.out.println("请输入要查询的词:");
String searchWord=scanner.next();
File rootFile =new File(path);
if(!rootFile.isDirectory()){
System.out.println("当前输入的路径非法!");
return ;
}
search(rootFile,searchWord);
}
private static void search(File rootFile,String searchWord){
File [] files=rootFile.listFiles();
if(files==null){
return ;
}
for(File f:files){
if(f.isFile()){
matchWord(f,searchWord);
}else if(f.isDirectory()){
search(f,searchWord);
}
}
}
private static void matchWord(File f,String searchWord){
try(Reader reader=new FileReader(f)){
StringBuilder stringBuilder=new StringBuilder();
while(true){
int c=reader.read();
if(c==-1){
break;
}
stringBuilder.append((char)c);
}
// 循环结束, 此时文件所有的内容, 就都进入 stringBuilder 了
if(stringBuilder.indexOf(searchWord)>=0){
System.out.println("找到了匹配的结果:"+f.getAbsolutePath());
}
}catch (IOException e){
e.printStackTrace();
}
}
}
五、总结
本篇博客简单介绍了IO中的InputStream和OutputStream的方法以及小程序练习,欢迎大家在评论区讨论,感谢观看!