使用指定的码表读写字符
/*
* FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
* FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)*/
private static void demo1() throws UnsupportedEncodingException,
FileNotFoundException, IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("UTF-8.txt"),"UTF-8");
//(字节流,编码表)通过指定编码表读写
OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK");
//(字节流,编码表)通过指定编码表写
int b;
while((b = isr.read()) != -1){
osr.write(b);
}
isr.close();
osr.close();
}
private static void demo2() throws UnsupportedEncodingException,
FileNotFoundException, IOException {
BufferedReader br = //高效转换流
new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"),"UTF-8"));
BufferedWriter bw = //InputStreamReader是字节通向字符的桥梁
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK"));
//OutputStreamWriter是字符通向字节的桥梁
int b;
while((b = br.read()) != -1){
bw.write(b);
}
br.close();
bw.close();
内存输出流
/* 1.什么是内存输出流
* 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
2.使用方式
* 创建对象: new ByteArrayOutputStream()
* 写出数据: write(int), write(byte[])
* 获取数据: toByteArray()*/
/*定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)*/
public class Test1 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("ddd.txt");//创建字节输入流,并关联ddd.txt
ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建内存输出流
int len;
byte[] b = new byte[5];//创建大小为5 的数组
while((len = fis.read(b)) != -1){//将文件上内容读到字节数组中
bos.write(b,0,len); //将数组中的数据写出到内存缓冲区中
}
打印流
/*打印流
* 该流可以很方便的将对象的toString()结果输出, 并且自动加上换行, 而且可以使用自动刷出的模式
* 只操作数据目的 对应是是FileOutputStream*/
private static void demo2() throws FileNotFoundException {
//字符打印流
PrintWriter pw = new PrintWriter(new FileOutputStream("ddd.txt"),true);
//是autoFlush方法 是boolean类型的给true就自动刷新
pw.print(97);
pw.write(45);
pw.println(97);//autoFlush自动刷新还针对println有效
pw.close();//关流也能刷新所以意义不大
}
private static void demo1() {
//打印字节流
PrintStream ps = System.out;
ps.println(97);//打印a//其实底层用的是Integer.toString(x),将x转换为数字字符串打印
ps.println(new Peason("小李",23));
Peason p = null;
ps.println(p);//如果是null,就返回null,如果不是null,就调用对象的toString(),这里是默认toString方法
}
}
随机访问流
RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
* 支持对随机访问文件的读取和写入。
*/
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("ddd.txt","rw");
System.out.println( raf.read()); //可以读也可以写
raf.seek(3);//设置指针在指定位置写入
raf.write(98);
raf.close();
}
Properties
/*:Properties 是MAP集合Hashtable 的子类
* 可以没有泛型,可以说是一个配置工具
* Properties 类表示了一个持久的属性集。
* Properties 可保存在流中或从流中加载。
* 属性列表中每个键及其对应值都是一个字符串。 */
//demo1();
//demo2();
//list 和load 方法
Properties pr = new Properties();
pr.load(new FileInputStream("ddd.properties"));//获取文件上的数据
pr.setProperty("name", "zhangsan"); //进行修改和填充
pr.list(new PrintStream("ddd.properties")); //写回到文件中
System.out.println(pr);
}
private static void demo2() {
Properties pr = new Properties();
pr.setProperty("姓名","四" );
pr.setProperty("qq","12345676" );
pr.setProperty("工号","234" );
pr.setProperty("电话","18945679876" );
@SuppressWarnings("unchecked")
Enumeration<String> en = (Enumeration<String>)pr.propertyNames();//调用迭代器
while(en.hasMoreElements()){ //判断集合中是否有元素
String key =en.nextElement(); //获取键
String value = pr.getProperty(key);//根据键获取值
System.out.println(key+"-"+value);
}
}
private static void demo1() {
Properties pr = new Properties();//创建集合对象
pr.setProperty("姓名","四" ); //添加内容因为是hashtable的子类所以是双列集合
pr.setProperty("qq","12345676" );
pr.setProperty("工号","234" );
pr.setProperty("电话","18945679876" );
System.out.println(pr);
String value = pr.getProperty("姓名");//通过键获取值
System.out.println(value);
}
}
File类
File类简介
File类不属于java流系统,但它是文件流进行文件操作的辅助类,主要用于操纵文件及文件目录,包括删除、重命名文件或目录、查询文件的属性,创建子目录、列出目录下的文件等。
File类的构造
给File类构造函数传一个String类型的路径就可以创建对象
File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
File类的几大动能
创建功能:
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
注意: 如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
判断功能:
public boolean isDirectory():判断是否是目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏
删除功能 :
public boolean delete():删除文件或者文件夹
注意事项:
Java中的删除不走回收站,所以使用时一定要谨慎使用。
要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹,要想删除必须把里面内容先删掉,这里用递归比较多。
重命名功能:
注意事项:
如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切
public static void main(String[] args) {
File file = new File("ddd");
File file2 = new File("fff");//如果路径相同就直接改名,路径不同就剪切并改名
boolean b = file.renameTo(file2);//此处只能放一个file对象
System.out.println(b);
获取功能:
public class File类的获取功能 {
public static void main(String[] args) {
/*获取功能
* public String getAbsolutePath():获取绝对路径
* public String getPath():获取相对路径
* public String getName():获取名称
* public long length():获取长度。字节数
* public long lastModified():获取最后一次的修改时间,毫秒值
* public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
* public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组 */
//demo();
//demo2();
File file2 = new File("F:\\day14java基础\\19");
String[] arr1 = file2.list();//获取指定目录下的所有文件或者文件夹的名称数组
for (String string : arr1) {
System.out.println(string);
}
System.out.println("-------------");
File[] subFiles = file2.listFiles();//获取指定目录下的所有文件或者文件夹的File数组
for (File file : subFiles) {
System.out.println(file);
}
}
private static void demo2() {
File file2 = new File("F:\\day14java基础\\19\\he.txt");
long l = file2.length();//获取的是文件的长度,返回的是文件的字节数
System.out.println(l);
File file3 = new File("C:\\drivers");
long l1 = file3.length();// 获取的是文件夹的长度,返回的是零
System.out.println(l1);
}
private static void demo() {
File file1 = new File("he.txt");
System.out.println(file1.getAbsolutePath());//获取绝对路径
System.out.println(file1.getPath());//获取相对路径
System.out.println(file1.getName());//获取名称
}
}
文件名称过滤器的概述
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
通过一个练习了解过滤器的使用
/*需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称*/
public static void main(String[] args) {
File file = new File("E:\\"); //创建File对象并关联E文件夹
/*第一种方法
* String[] arr = file.list(); //获取这个文件路径下所有的文件和文件夹路径
*
for (String string : arr) {
if (string.endsWith(".jpg")) {
System.out.println(string);
}
}*/
/*第二种方法 这种方法以后用的较多
* File[] subFiles = file.listFiles();//获取文件夹路径
for (File file2 : subFiles) { //将文件夹内容进行遍历
if (file2.isFile()&&file.getName().endsWith(".jpg")) {//判断是文件并且后缀是.jpg
System.out.println(file.getName());
}
}*/
//第三种方法 这里用的是文件名称的过滤器
String[] arr = file.list(new FilenameFilter(){//传入过滤器对象
@Override
public boolean accept(File file, String name) {
File file2 = new File(file,name);//创建File对象
//父 子
return file2.isFile()&&file2.getName().endsWith(".jpg");
}});//判断
for (String s : arr) {
System.out.println(s);//遍历并打印
}
}
}
File类的递归
public static void main(String[] args) {
//普通方法 如果太大了就不能运行
/* int result = 1;
for (int i = 0; i < 5; i++) {
result = result * i;
}
System.out.println(result);*/
System.out.println(fun(5));
}
//利用递归进行运算
/** 递归
* 方法自己调用自己
* 弊端:容易栈内存溢出
* 好处:不用知道调用次数
*
* 构造函数不能使用递归
* 递归调用是否必须有返回值?
* 不一定(可以有也可以没有)*/
public static int fun(int num){
if(num == 1){
return 1;
}else{
return num * fun(num-1);//自身方法的不断调用
}
}
}