Java文件操作(超详细+代码示例)「建议收藏」

Java文件操作(超详细+代码示例)「建议收藏」Java文件操作一、Java.io包1.1File类1.2Stream流1.2.1使用FileInputStream类1.2.2使用FileOutputStream类二、序列化我们日常使用电脑的时候,基本都会和文件打交道,比如我们做ppt,或者写论文的时候,我们打开的word,ppt等等都是一个文件,这些文件不一样的主要是因为后缀名不一样,所以计算机才可以分辨出来这些文件的区别。文件一…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

2020 最新更新:
Java IO 系列内容

我们日常使用电脑的时候,基本都会和文件打交道,比如我们做ppt,或者写论文的时候,我们打开的word,ppt等等都是一个文件,这些文件不一样的主要是因为后缀名不一样,所以计算机才可以分辨出来这些文件的区别。

文件一般都存放在硬盘中,在上世纪还会存储在光驱还有软盘等等

一、Java.io包

  • 现在大家看到 “i/o” 想必也不会陌生了吧,这是Java中一个内置的包,专门用于文件读写的一个操作的类
  • 在程序中使用 文件或者的操作就要导入import java.io.*;
1.1 File类
  • File类可以表示一个文件,还可以表示一个目录(Directory),所以我们可以在程序中用File 类的对象可以表示一个文件 或者 目录
  • 当创建了 File 对象之后,我们可以利用该对象来对文件或者目录进行书属性修改:例如:文件的名称,修改日期的日期等等
  • File 类的对象 还不能直接对文件进行读写操作,只能修改文件的属性

File类 示例:

import java.io.*;

public class FileDemo { 
   
	public static void main(String[] args) { 
   
		File f1=new File("src\\aa.txt");//相对路径,如果没有前面的src,就在当前目录创建文件
		if(f1.exists()) { 
   
			System.out.println("文件已经存在");
		}else { 
   
			try { 
   
				f1.createNewFile();
				System.out.println("文件创建成功");
			} catch (Exception e) { 
   
				// TODO: handle exception
			}
		}
		System.out.println("文件已经存在:"+f1.exists());
		System.out.println("文件的名字:"+f1.getName());
		System.out.println("文件的路径:"+f1.getPath());
		System.out.println("文件的绝对路径:"+f1.getAbsolutePath());
		System.out.println("是目录吗:"+f1.isDirectory());
		System.out.println("文件大小:"+f1.length());
	}
}

在这里插入图片描述
Tips:这里我运行了两次,一开始文件是不存在的,所以程序会进入else,完成创建这个文件的操作,上面的图片我截图是第二次运行的情况

1.2 Stream流(字节流)

流是指一连串流动的数据信号,通过FiFO(先进先出) 的方式接收和发送数据

  • 数据流又分为输入流输出流
  • 输入输出流又分为字节流字符流
  1. 字节流:以字节为基本单位 , 在 java.io包中,大部分操作继承InputStream(输入字节流)类和OutputStream(输出字节流)类
  2. 字符流:两个字节为基本单位,专门处理字符串和文本,对于字符流进行操作的类主要是Reader(读取流)类和 Writer(写入流)类。
1.2.1 使用FileInputStream类
  • 继承于InputStream类,这是一个文件输入流,进行文件读操作的最基本的类
  • 作用是将文件中的数据输入到内存中,我们可以用它来读文件操作
  • 由于字节流的缘故,因此无法读取中文字符

我们现在之前创建的aa.txt文件中加入如下的一句话
在这里插入图片描述
示例代码:

import java.io.*;

public class FileStreamDemo { 
   
	public static void main(String[] args) { 
   
		try { 
   
			File file=new File("src\\aa.txt");
			FileInputStream f1=new FileInputStream(file);//这里需要进行抛出异常处理
			for (int i = 0; i < file.length(); i++) { 
   
				char ch=(char)(f1.read());//循环读取字符
				System.out.print(ch+" ");
			}
			System.out.println();//换行操作
			f1.close();//关闭文件
		} catch (Exception e) { 
   
			// TODO: handle exception
			System.out.println("文件打开失败");
		}

	}
}

在这里插入图片描述
这里我在文件中的感叹号打的是中文的字符,所以字节流是无法读取的

这里我们使用了一个新的知识点,try catch的一个异常捕获的知识点,这样操作的好处,即使报错了,程序也可以正常的运行下去,并显示报错信息

1.2.2 使用FileOutputStream类
  • FileOutputStream类称为文件输出流,继承于OutputStream类,是文件的基本读写的一个类
  • 它的作用和上面读文件恰恰相反,将内存中的数据输出到文件中,所以我们可以用这个类来进行写文件的操作

我们先按aa,txt文件的内容清空,然后实现下边的代码进行写操作
代码示例:

import java.io.*;

public class FileOuputDemo { 
   
	public static void main(String[] args) throws FileNotFoundException { 
   
		File file=new File("src\\aa.txt");
		FileOutputStream f1=new FileOutputStream(file);//(file,true),这里有true的话,代表可以在文件后面追加内容
		String str="I love coding";
		byte[] buff=str.getBytes();//将字符串转换为字节数组
		try { 
   
			f1.write(buff);//把字节数组的内容写进去文件
		} catch (Exception e) { 
   
			// TODO: handle exception
		}finally { 
   
			try { 
   
				f1.close();
			} catch (IOException e) { 
   
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

在这里插入图片描述

1.2.3 小总结
  • FileInputStream类 和 FileOutputStream类总是成对出现的,一个用作输入流,另一个自然是输出流
  • 我们在输入流中使用 byte(字节)数组 来存储我们的数据,因此我们不必考虑数据格式,所以说这两种操作的效率会比较高
1.3 Stream流(字符流)

字符串的读取,以及解决中文字符无法读入的问题

1.3.1 FileWriter类 与 BufferedWriter类使用

问题描述:

前面我们FileInputStream时,使用的是字节流,但是有个问题无法解决,它只能读取英文字符,而中文字符是无法读取的,会出现奇怪的东西。

这个操作就可以直接读入字符串了
示例:

import java.io.*;

public class FileWriterDemo { 
   
	public static void main(String[] args) { 
   
		String[] str= { 
   "春眠不觉晓,","处处闻啼鸟,","夜来风雨声,","花落知多少,"};
		File file=new File("src\\cc.txt");//我们在该类的位置创建一个新文件
		FileWriter f=null;//创建文件写入对象
		BufferedWriter f1=null;//创建字符流写入对象
	
		try { 
   
			//这里把文件写入对象和字符流写入对象分开写了
			f=new FileWriter("src\\cc.txt");//创建一个名为cc.txt的文件
			f1=new BufferedWriter(f);
			//通过循环遍历上面的String 数组中的元素
			for (int i = 0; i < str.length; i++) { 
   
				f1.write(str[i]);//把String中的字符写入文件
				f1.newLine();//换行操作
				}
		} catch (Exception e) { 
   
			// TODO: handle exception
		}finally { 
   //如果没有catch 异常,程序最终会执行到这里
			try { 
   
				f1.close();
				f.close();//关闭文件
			} catch (Exception e2) { 
   
				// TODO: handle exception
			}
		}
	}
}

在这里插入图片描述
反思与总结:

这段代码我在调试的过程中,犯下了一个致命的错误,就是文件关闭的先后的顺序,我们应该先关闭输入流,然后再关闭文件,我之前是先关闭文件,导致写进去的内容还没保存就关掉了。这里一定要注意!!!

1.3.2 FileReader类 与 BufferedReader类使用

读取上面写入文件的数据

import java.io.*;

public class FileReaderDemo { 
   
	public static void main(String[] args) { 
   
		File file=new File("src\\cc.txt");
		FileReader f=null;//文件读取对象
		BufferedReader f1=null;//字符流对象
		try { 
   
			f=new FileReader(file);
			f1=new BufferedReader(f);
			//循环打印cc文件中的每行数据
			String str=null;
			while((str=f1.readLine())!=null) { 
   
				System.out.println(str);
			}
				
		} catch (Exception e) { 
   
			// TODO: handle exception
		}finally { 
   
			try { 
   
				f1.close();
				f.close();
			} catch (Exception e2) { 
   
				// TODO: handle exception
			}
		}
	}
}

运行结果:
在这里插入图片描述

二、序列化与反序列化

简化成一句话、序列化是把Java对象存在一个硬盘,网络,以便传输
也就是把我们的数据永久的存放到计算机当中

2.1 FileOutputStream类 以及 ObjectOutputStream类的使用

这也成为序列化的操作

将你的数据存入计算机中
示例:

import java.io.*;
import java.util.*;

/** * 序列化操作 * */
public class Xl { 
   
	public static void main(String[] args) { 
   
		//数据完成持久化的操作
		List<String> list=new ArrayList<String>();
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		FileOutputStream f1=null;
		ObjectOutputStream f2=null;
		try { 
   
			//第一行省略了前面的 File file = new File(~)的操作,直接创建一个文件
			f1=new FileOutputStream(new File("src\\dd.txt"));
			f2=new ObjectOutputStream(f1);
			f2.writeObject(list);
		} catch (Exception e) { 
   
			// TODO: handle exception
		}finally { 
   
			try { 
   
				f2.close();
				f1.close();
			} catch (Exception e2) { 
   
				// TODO: handle exception
			}
		}
	}

我们来看看我们写入的数据
在这里插入图片描述
虽然我们看不懂,但是计算机看得懂呀

2.1 FileInputStream类 以及 ObjectInputStream类的使用

反序列化

import java.io.*;
import java.util.*;

//反序列化操作
public class FXL { 
   
	public static void main(String[] args) { 
   
		FileInputStream f=null;
		ObjectInputStream f1=null;
		List list=null;
		try { 
   
			f=new FileInputStream("src\\dd.txt");//对应我们前面往输入dd.txt 文件的内容
			f1=new ObjectInputStream(f);
			list=(List<String>)f1.readObject();
		} catch (Exception e) { 
   
			// TODO: handle exception
		}finally { 
   
			try { 
   
				f1.close();
				f.close();
			} catch (Exception e2) { 
   
				// TODO: handle exception
			}
		}
		//这种方法就不必循环打印数据了,可以一步到位
		System.out.println(list);
	}
}

在这里插入图片描述
如果我们读入的是字符流数据,在反序列化的操作,我们需要实现Serializable 接口,如下代码所示

import java.io.*;
import java.util.*;

/** * 2:将三个学生对象序列化进去,在取出来(参考一下txt里面的做法) * 对象需要实现Serializable * */
public class Work2 implements Serializable{ 
   
	public static void main(String[] args) { 
   
		Student stu[]=new Student[3];
		FileOutputStream f1=null;
		ObjectOutputStream f2=null;
		
		//初始化三个学生的数据
		stu[0]=new Student("小明",18,"男");
		stu[1]=new Student("小白",19,"女");
		stu[2]=new Student("小张",20,"男");
		
		//学生信息的序列化
		try { 
   
			f1=new FileOutputStream("Student.txt");
			f2=new ObjectOutputStream(f1);
			for (int i = 0; i < stu.length; i++) { 
   
				f2.writeObject(stu[i]);
			}
	
		} catch (Exception e) { 
   
			// TODO: handle exception
		}finally { 
   
			try { 
   
				f2.close();
				f1.close();
			} catch (Exception e2) { 
   
				// TODO: handle exception
			}
		}
		
		
		//学生信息的取出(反序列化)
		FileInputStream f3=null;
		ObjectInputStream f4=null;
		List<Object> list1=null;
		
		try { 
   
			f3=new FileInputStream("Student.txt");
			f4=new ObjectInputStream(f3);
			System.out.println("学生的姓名\t年龄\t性别\t");
				for (int i = 0; i < stu.length; i++) { 
   
					System.out.println(stu[i].getStudentName()+"\t"+stu[i].getAge()+"\t"+stu[i].getGender());
				}
			
		} catch (Exception e) { 
   
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally { 
   
			try { 
   
				f4.close();
				f3.close();
			} catch (IOException e) { 
   
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

在这里插入图片描述

三、彩蛋

  • 是不是感觉意犹未尽
  • 没有找到你想要的答案
  • 那就试试看这篇文章 —— 系统学习 Java io

这篇文章是我在疫情期间,把 Java SE,EE 的知识体系构建出来了,欢迎大家来指正
Java IO 系列内容 (最全内容)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159346.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 常用的电容分类[通俗易懂]

    常用的电容分类[通俗易懂]电容的常用分类1.铝电解电容特点:项目中大型体积、大容量、耐压适中、有极性、高ESR(ESR解释:内阻)用于储能、价格低廉项目缺点:过压失效,反向击穿、物理连接开路失效、漏液失效(电解液挥发)…

  • 1.缓存Redis实战操作记录

    1.缓存Redis实战操作记录

  • R语言安装~R,Rstudio

    R语言安装~R,Rstudio一、R语言安装首先进入官网:https://cran.r-project.org下载相应版本的安装包点击base点击DownloadR4.1.2forWindows,即可开始下载下载完成后,点击该安装包,开始下载我要安装的是64bit,把32bit的勾划掉,继续点击下一步,直到安装完成二、Rstudio安装下载地址为:DownloadtheRStudioIDE-RStudio点击free下的download…

  • 谷歌chrome运行activeX控件

    谷歌chrome运行activeX控件在谷歌chrome浏览器下,安装IE_Tab_Multi_extension_1_0_0_1控件即可具体操作:将IE_Tab_Multi_extension_1_0_0_1拖入谷歌浏览器然后点击:添加即可谷歌浏览器不能直接用activeX原因:因为Activex是由微软开发,因而目前只支持原生态支持的IE,最新版Edge已经不再支持了。其他浏览器想要支持activex,需要额外做一些设置或安装补丁包,其中谷歌浏览器的话,需要安装IE-Tab-Multi控件IE_Tab_Multi_exte

  • 基于FPGA的CAN接口开发

    基于FPGA的CAN接口开发基于Xilinx的A7系列FPGA的CAN总线协议开发一、CAN总线协议介绍CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。可以用来满足“多总线通信时,线束的数量过多”、“通过多个LAN,进行大量数据的高速通信”的需要。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化

  • 超分辨率重建总结(超分辨率重建算法程序)

    1.SRCNN:—2,3改进开山之作,三个卷积层,输入图像是低分辨率图像经过双三次(bicubic)插值和高分辨率一个尺寸后输入CNN。图像块的提取和特征表示,特征非线性映射和最终的重建。使用均方误差(MSE)作为损失函数。2.FSRCNN特征提取:低分辨率图像,选取的核9×9设置为5×5。收缩:1×1的卷积核进行降维。非线性映射:用两个串联的3×3的卷积核可以替代一个5×5…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号