Java学习笔记(Java中的IO字符流、File类)
一、概述
IO流是用来传输数据的,如文件的读写,有字节流和字符流之分,字节流可以处理任何文件数据,字符流只能处理纯文本文件,这里说的是字符流。
1、字符流分类:
字符输入流:FileReader、BufferedReader
字符输出流:FileWriter、BufferedWriter
2、FileWriter使用:
创建:FileWriter fw = new FileWriter("xxx.txt");
写入:fw.write("Hoello");
关闭:fw.close();
3、追加写入:
FileWriter fw = new FileWriter("xxx.txt",true); //第二个参数为 true
4、实现换行
在Windows中: \r\n
在macOS中:\r或\n
在Linux中:\n
5、五种writer方法的重载
写字符串的整体:public void writer(String str);
写字符串的部分:public void writer(String str,int offset,int count);
写字符数组的整体:public void writer(Char[] array);
写字符数组的部分:public void writer(Char[] array,int offset,int count);
写单个字符对应的数字(参考ASCII码或Unicode表):public void writer(int ch);
6、FileReader的使用
创建:FileReader fr = new FileReader("xxx.txt");
读单个字符:
int ch; //单个字符的ASCII值
while((ch = fr.read()) != -1)
{
//......
}
读字符数组:
char[] buf = new char[1024];
int len; //有效个数
while((len = fr.read(buf)) != -1)
{
String str = new String(buf,0,len);
}
7、BufferedXxx和FileXxx的区别:
BufferedXxx有一个8192长度的char[]字符数组作为缓冲区
BufferedXxx性能更高
8、BufferedWriter额外方法:
public void newLine(),根据操作系统自动换行
9、BufferedReader额外方法:
public void newLine(),读取一行字符串,不包含换行符
10、代码实例:
FileWriter & FileReader
package File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
FileWriter fw1 = new FileWriter("test1.txt"); //创建FileWrite对象(覆盖写入)
//重载一:写字符串的整体
fw1.write("Hello,my love!"); //调用writer方法写数据
fw1.write("\r\n"); //Windows系统中的换行方式
fw1.write("LongRu\r\n");
//重载二:写字符串的部分
String str = "Hello,my love,Longru!";
fw1.write(str,14,7);
fw1.write("\r\n");
//重载三:写字符数组的整体
char[] array1 = {'H','e','l','l','o'};
fw1.write(array1);
fw1.write("\r\n");
//重载四:写字符数组的部分
char[] array2 = {'M','y',' ','l','o','v','e'};
fw1.write(array2,3,4);
fw1.write("\r\n");
//重载五:写单个字符
fw1.write(65);
fw1.write(48);
fw1.write("\r\n");
fw1.close(); //调用close方法关闭流
FileWriter fw2 = new FileWriter("test2.txt",true); //创建FileWrite对象(追加写入)
fw2.write("Hello,my love!"); //调用writer方法写数据
fw2.write("LongRu");
fw2.close(); //调用close方法关闭流
System.out.println("==================================================");
//重载一:读取单个字符
FileReader fr1 = new FileReader("test1.txt");
int ch;
while ((ch = fr1.read()) != -1)
{
System.out.println((char) ch);
}
//重载二:读取指定长度字符
FileReader fr2 = new FileReader("test2.txt");
char[] buf = new char[2];
int len; //代表有效个数
while ((len = fr2.read(buf)) != -1)
{
String str3 = new String(buf,0,len);
System.out.println(str3);
}
fr2.close();
}
}
BufferedWriter & BufferedReader
package BufferFile;
import java.io.*;
public class Main {
public static void main(String[] ages) throws IOException {
FileWriter fw = new FileWriter("test3.txt"); //创建BufferedWriter
BufferedWriter bw = new BufferedWriter(fw);
bw.write("hello"); //写入
bw.newLine(); //BufferedWriter特有的自动根据操作系统换行功能
bw.write("My love!");
bw.close(); //关闭
//读单个字符,其实是从8192的缓冲区读取单个字符
FileReader fr = new FileReader("test3.txt"); // 创建BufferedReader
BufferedReader br = new BufferedReader(fr);
int ch;
while ((ch = br.read()) != -1)
{
System.out.println((char)ch);
}
br.close();
//BufferedReader提供了一个读取一行字符串的方法
FileReader fr2 = new FileReader("test1.txt"); // 创建BufferedReader
BufferedReader br2 = new BufferedReader(fr2);
String line; //代表一行字符串
while ((line = br2.readLine()) != null)
{
System.out.println(line);
}
}
}
二、File 类
1、File类的概述和作用
File类是文件和目录路径名的抽象表示形式
Java中把文件或者目录(文件夹)都封装成File对象
在硬盘上操作文件,直接使用 File 类
2、File类静态的成员变量
pathSeparator:与系统有关的路径分隔符,为了方便,它被表示为一个字符串
separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串
public static void main(String[] args) {
//File类静态成员变量
//与系统有关的路径分隔符
String separator = File.pathSeparator;
System.out.println(separator);// 是一个分号,目录的分割(window中环境变量配置各个路径用分号分割,表示一个完整的路径结束) Linux中是冒号 :
//与系统有关的默认名称分隔符
separator = File.separator;
System.out.println(separator);// 向右 \ 目录名称分割 Linux /
}
3、File 类的构造方法
File(String pathname):将路径封装File类型对象
File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 对象
File(File parent,String child):将parent封装成file对象
public static void main(String[] args){
//将路径封装File类型对象
String pathName = "F:\\TestPath";
File f1 = new File(pathName);//将Test22文件封装成File对象。注意;有可以封装不存在文件或者文件夹,变成对象。
System.out.println(f1);
//根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 对象
File f2 = new File("F:\\TestPath","a.txt");
System.out.println(f2);
//将parent封装成file对象。
File dir = new File("F:\\TestPath");
File f3 = new File(dir,"a.txt");
System.out.println(f3);
}
4、File 类创建、删除文件(文件、文件夹)
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
public boolean delete():删除文件或者文件夹
public static void main(String[] args) throws IOException {
//创建文件
File F1 = new File("F:\\TestPath\\a.txt");
boolean B1 = F1.createNewFile();
System.out.println(B1);
//创建文件夹
File F2 = new File("F:\\TestPath\\a");
boolean B2 = F2.mkdir();
System.out.println(B2);
//删除文件
File F3 = new File("F:\\TestPath\\a.txt");
boolean B3 = F3.delete();
System.out.println(B3);
}
5、File 类获取功能
String getName():返回路径中表示的文件或者文件夹名(获取路径中的最后部分的名字)
long length(): 返回路径中表示的文件的字节数
String getAbsolutePath():获取绝对路径,返回String对象
File getAbsoluteFile() :获取绝对路径,返回File对象
String getParent():获取父路径,返回String对象
File getParentFile():获取父路径,返回File对象
public static void main(String[] args) throws IOException {
File F1 = new File("F:\\TestPath\\a.txt");
F1.createNewFile();
String S1 = F1.getName(); //返回路径中表示的文件或者文件夹名,即获取路径中最后部分的名字
long L1 = F1.length(); //返回路径中表示的文件的字节数
File absolute = F1.getAbsoluteFile(); //获取绝对路径,返回File对象
File parent = F1.getParentFile(); //获取父路径,返回File对象
System.out.println(S1);
System.out.println(L1);
System.out.println(absolute);
System.out.println(parent);
}
6、File 类判断功能
boolean exists():判断File构造方法中封装路径是否存在
boolean isDirectory():判断File构造方法中封装的路径是不是文件夹
boolean isFile():判断File构造方法中封装的路径是不是文件
7、File 类 list 获取功能
String[] list():获取到File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
File[] listFiles():获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
static File[] listRoots(): 列出可用的文件系统根
public static void main(String[] args)
{
File dir = new File("F:\\TestPath");
//获取的是目录下的当前的文件以及文件夹的名称。
String[] names = dir.list();
for(String name : names){
System.out.println(name);
}
System.out.println("========================");
//获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
File[] files = dir.listFiles();
for(File file : files){
System.out.println(file);
}
}
注意:
指定的目录必须存在
指定的必须是目录,否则容易返回数组null,出现NullPointerException
8、文件过滤器
使用文件过滤器可以删选出某些关键字的文件或文件夹,即过滤一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹
常用方法:
public String[] list(FilenameFilter filter):
public File[] listFiles(FileFilter filter):
自定义过滤器类
//自定义过滤器实现FileFilter接口,重写抽象方法
public class myFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".txt");
}
}
在main中调用
public static void main(String[] args)
{
File F = new File("F:\\TestPath");
File[] filearr = F.listFiles(new myFilter());
for(File f : filearr)
{
System.out.println(f);
}
}
分析:
listFiles()遍历目录的同时,获取到了文件名全路径,调用过滤器的方法accept,将获取到的路径传递给accept方法的参数pathname
accept方法接收了参数pathname,参数是listFiles传递来的
在accept方法中,进行判断,如果这个路径是txt文件,返回true,走着返回false
一旦方法返回了true,listFiles将路径保存到File数组中
9、递归全目录,寻找指定文件
自定义过滤器
//自定义过滤器实现FileFilter接口,重写抽象方法
public class myFilter implements FileFilter {
public boolean accept(File pathname) {
if(pathname.isDirectory()) {
return true;
}
return pathname.getName().endsWith(".txt");
}
}
在main中递归调用
public static void main(String[] args)
{
File F = new File("F:\\TestPath");
gitAllDir(F); //递归遍历所有目录
gitAllTxt(F); //递归遍历所有txt文件
}
public static void gitAllDir(File F)
{
//System.out.println(F);
//调用方法listFiles()对目录,dir进行遍历
File[] allFile = F.listFiles();
for(File f : allFile)
{
//System.out.println(f);
//判断变量f表示的路径是不是文件夹
if(f.isDirectory())
{
//是一个目录,就要去调用getAllDir递归遍历这个目录
gitAllDir(f);
}
else
{
System.out.println(f);
}
}
}
private static void gitAllTxt(File F)
{
File[] fileTxt = F.listFiles(new myFilter());
for(File f : fileTxt)
{
//System.out.println(f);
if(f.isDirectory())
{
gitAllTxt(f);
}
else
{
System.out.println(f);
}
}
}