# java之IO操作
一.文件的概念
文件是数据源(保存数据的地方)的一种,比如大家经常使用的word文档,txt文件,excel文件…都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音…
二.文件流
文件在程序中是以流的形式来操作的。
流:数据在数据源(文件)和程序(内存)之间经历的路径。
输入流:数据从数据源(文件)到程序(内存)的路径。
输出流:数据从程序(内存)到数据源(文件)的路径。
注:如何判断是输入流还是输出流?
以内存为参照,如果数据向内存流动则是输入流,反之是输出流。
三.java流分类
1.字节流:可以用于读写二进制文件以及任何类型文件。 byte
2.字符流:可以用于读写文本文件。不能操作二进制文件。
字节流 | 字符流 | |
---|---|---|
输入 | InputStream | Reader |
输出 | OutputStream | Writer |
四.常用io流 之文件对象
案例:文件数据源File类介绍
public static void fileDemo(){
//创建一个文件对象
File f = new File("src/test.txt");
//得到文件的路径
System.out.println("文件路径:"+f.getAbsolutePath());
//得到文件的大小
System.out.println("文件字节的大小:"+f.length() );
//判断文件是否可读或可写
System.out.println("可读:"+f.canRead());
//创建文件和文件夹
File f2 = new File("d:/demo.txt");
if (!f2.exists()){
//可以创建
try {
f2.createNewFile();
System.out.println("创建成功");
} catch (IOException e) {
e.printStackTrace();
}
}else {
System.out.println("有文件,不能创建");
}
}
结果:
文件路径:D:\study\jiebademo2\src\test.txt
文件字节的大小:2102
可读:true
创建成功
在D盘下创建了demo.txt文件。
若想创建创建文件夹,代码如下:
public static void demo2(){
File f = new File("d:/ff");
//判断文件夹是否存在
if (f.isDirectory()){
System.out.println("该文件夹已存在");
}else {
//创建文件夹
f.mkdir();
}
}
列出一个文件夹下的所有文件:
//列出文件夹下的所有文件
public static void demo3(){
File f = new File("d:/study");
if(f.isDirectory()){
File[] files = f.listFiles(); //返回文件对象数组
for(int i=0;i<files.length;i++){
System.out.println("文件名 "+files[i].getName());
}
}
}
结果是:
文件名 apache-tomcat-9.0.14
文件名 campus_live_platform-master.zip
文件名 icutword
文件名 jar包
文件名 jiebademo
文件名 jiebademo2
文件名 jieba分词
文件名 navicat for mysql10.0.11简体中文破解版
文件名 springbootmybatisplus
文件名 springboot实战资料
文件名 test.txt
文件名 笔记
五.常用io流 之文件字节流
案例1.读取文件(文件字节输入流使用。FileInputStream类),用FileInputStream的对象把文件读入到内存。
public static void demo(){
File f = new File("d:/demo.txt");
FileInputStream fis = null;
System.out.println("文件字节的大小:"+f.length() );
//因为File没有读写的能力,所以需要使用InputStream
try {
fis = new FileInputStream(f);
//定义一个字节数组,相当于缓存
byte[] bytes = new byte[1024];
int n = 0;//得到实际读取到的字节数
//循环读取
while ((n=fis.read(bytes))!=-1){
//把字节转成String
String s = new String(bytes,0,n);
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭文件流
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
案例2.在内存中写入字符串,并保存到文件中(文件字节输出流,FileOutputStream类)。
public static void demo(){
//如果有这个文件,则在这个文件写入,如果没有则创建一个文件并写入
File f = new File("d:/demo.txt");
//字节输出流
FileOutputStream fos = null;
try {
fos = new FileOutputStream(f);
String s = "你好!";
//定义字节数组
byte[] bytes = new byte[1024];
//如何把String转化成一个bytes数组
fos.write(s.getBytes());
} catch (Exception e){
e.printStackTrace();
}finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
六.常用io流 之文件字符流
案例.(文件字符输入输出流 FileReader FileWriter类)读取一个文件,并写入到另一个文件中。
注意:FiileReader和FilerWriter是针对字符操作!而不是字节!
public static void demo(){
//文件读取字符流对象(输入流)
FileReader fr = null;
//写入到文件(输出流)
FileWriter fw = null;
try{
//创建fr对象
fr = new FileReader("D://demo.txt");
//创建输出对象
fw = new FileWriter("D:/test2.txt");
int n = 0;//记录实际读取到的字符数
//读取到内存
char[] c = new char[1024];
while((n=fr.read(c)) != -1){
fw.write(c);
}
}catch(Exception e){
e.printStackTrace();
} finally {
try {
fr.close();
fw.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
七.缓冲字符流
为了提高效率引入了缓冲字符流 BufferReader 和BufferWriter。直接操作String。
public static void demo2(){
BufferedReader br = null;
BufferedWriter bw = null;
FileWriter fw =null;
FileReader fr = null;
try{
fr = new FileReader("D:/demo.txt");
br = new BufferedReader(fr);
fw = new FileWriter("D:/test3.txt");
bw = new BufferedWriter(fw);
String s="";
while ((s = br.readLine()) != null){
//输出到磁盘
fw.write(s+"\r\n");
}
} catch (Exception e){
e.printStackTrace();
} finally {
try {
fr.close();
fw.close();
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}