import java.io.File;

import java.io.FileFilter;

import java.io.FileOutputStream;

import java.io.IOException;

/*

  • 递归遍历指定路径下指定后缀名的文件,输出文件名 d盘下找txt文件
  • 分析:
  • 1,封装路径
  • 2,获取该路径下所有内容的File数组
  • 3,遍历,获取每一个File
  • 4,判断File是否是文件夹
  • 是:回到2继续
  • 不是:判断是否是.txt结尾
  • 是:输出
  • 不是:不用管

  • 因为不知道将来会有多少层文件夹,所以使用递归
  • */

public class Main {

public static void main(String[] args) throws IOException {

// 获取指定目录下所有指定格式的文件

test1(new File("D:\新建文件夹"), ".txt");

}

public static void test1(File src, String regex) throws IOException {

File[] files = src.listFiles();

for (File file : files) {

if(file.isDirectory()){

System.out.println(file.getAbsolutePath());

test1(file,regex);

}else{

if(file.getName().endsWith(regex)){

//System.out.println(file.getAbsolutePath());

System.out.println("\t"+file.getName());

/* FileOutputStream fos = new FileOutputStream("log.txt",true);

fos.write(file.getAbsolutePath().getBytes());

fos.write("\r\n".getBytes());

fos.close();*/

}

}

}

}

}


package com.momo.demo;

import java.io.File;

/*

  • 递归删除带内容的文件夹

  • 分析:
  • 1 封装路径
  • 2 获取该路径下所哟内容File数组
  • 3 遍历数组获取每一个file
  • 4 判断是否是文件夹
  • 是:继续 回到2
  • 不是:删除
  • */

public class Demo2 {

public static void main(String[] args) {

File f = new File("D:\新建文件夹");

deleteDir(f);

}

public static void deleteDir(File src){

File[] files = src.listFiles();

if(files!=null){

for (File file : files) {

if(file.isDirectory()){

deleteDir(file);

}else{

System.out.println(file.getName()+"--"+file.delete());

}

}

System.out.println(src.getAbsolutePath()+"---"+src.delete());

}

}

}


package com.momo.demo;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

/*

  • 我们通过这个案例,很明显能感觉到一次一个字节数组要快很多,因为加入了字节数组一次可以
  • 读写多个,我们用字节数组作为缓冲区一次缓冲多个进行读写

  • java本身在设计的时候也考虑到了这样的设计思想(装饰设计模式)
  • 所以java还提供了 字节缓冲流(自带缓冲区) 提高效率
  • */

public class Demo3 {

public static void main(String[] args) throws IOException {

FileInputStream fis = new FileInputStream("C:\Users\67823540\Desktop\11.mp3");

FileOutputStream fos = new FileOutputStream("111.mp3");

//一次一个字节

/* int i=0;

while ((i=fis.read())!=-1){

fos.write(i);

}*/

//一次一个字节数组 int i=0; byte[] bys = new byte[1024]; while ((i=fis.read(bys))!=-1){ fos.write(bys,0,i); } fos.close(); fis.close();

}

}

一,字节缓冲流

1,概述

-为了提高效率,提供的自带缓冲区的字节流

2,分类

-字节缓冲输入流 BufferedInputStream

-字节缓冲输出流 BufferedOutputStream

3,BufferedOutputStream

-该类实现缓冲输出流。 通过设置这样的输出流,

应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。

-成员变量

protected byte[] buf

存储数据的内部缓冲区。

protected int count

缓冲区中有效字节的数量。

-构造方法

BufferedOutputStream(OutputStream out)

创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

BufferedOutputStream(OutputStream out, int size)

创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。

构造方法之所以传递的是基本字节流,而不是文件路径名,

是因为缓冲流只是提供缓冲效果,读写方法还是在基本的字节流中

所以参数要的是基本字节流

-成员方法

void close()

关闭此输出流并释放与流相关联的任何系统资源。

void flush()

刷新此输出流,并强制将任何缓冲的输出字节写入流。

void write(byte[] b)

将 b.length个字节写入此输出流。

void write(byte[] b, int off, int len)

将 len字节从位于偏移量 off的指定 byte阵列写入此输出流。

void write(int b)

写入指定 byte此输出流。

package com.momo.demo;

import java.io.BufferedOutputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Scanner;

/*

  • 字节缓冲流写数据

  • flush和close的区别?
  • flush:刷新缓冲区,把缓冲区中的内容写出入,flush之后对象还可以继续使用,继续写数据
  • close:关闭对象,关闭之前会把缓冲区的数据写出入,然后在关闭,close之后就不能写数据了

  • 注意: 缓冲流写数据,数据会先存入缓冲区中,最后必须调用flush或者close方法,才能把数据写出去
  • /

public class Demo4 {public static void main(String[] args) throws IOException {BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));/

//bos.flush();

//bos.close();

bos.write(99);

bos.close();*/

//System.out.println(bos);

// bos.write(100);

// bos.write("hello".getBytes());

bos.write("hello".getBytes(),1,2);

bos.close();

}

}

4,BufferedInputStream

-A BufferedInputStream为另一个输入流添加了功能,

即缓冲输入和支持mark和reset方法的功能。

-构造方法

BufferedInputStream(InputStream in)

创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。

BufferedInputStream(InputStream in, int size)

创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。

-成员方法

void close()

关闭此输入流并释放与流相关联的任何系统资源。

int read()

从该输入流读取下一个数据字节。

int read(byte[] b)

从该输入流读取最多 byte.length个字节的数据到字节数组。

int read(byte[] b, int off, int len)

从该输入流读取最多 len字节的数据到字节数组。

package com.momo.demo;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

/*

  • 字节缓冲流读取数据
  • /

public class Demo5 {public static void main(String[] args) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));/

while ((i=bis.read())!=-1){

System.out.println((char)i);

}*/

int i = 0; byte[] bys = new byte[5]; while ((i=bis.read(bys))!=-1){ System.out.println(new String(bys,0,i)); } bis.close();

}

}


package com.momo.demo;

import java.io.*;

/*

*

  • 字节流4种方式复制文件对比
  • 基本字节流
  • 一次一个字节 27906
  • 一次一个字节数组 46
  • 字节缓冲流
  • 一次一个字节 147
  • 一次一个字节数组 16
  • */

public class Demo6 {

public static void main(String[] args) throws IOException {

long start = System.currentTimeMillis();

// fun1();

// fun2();

// fun3();

fun4();

long end = System.currentTimeMillis();

System.out.println(end-start);

}

public static void fun4() throws IOException {

BufferedInputStream fis = new BufferedInputStream(new FileInputStream("11.mp3"));

BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("4.mp3"));

int i=0; byte[] bys = new byte[1024]; while ((i=fis.read(bys))!=-1){ fos.write(bys,0,i); } fos.close(); fis.close();

}

public static void fun3() throws IOException {

BufferedInputStream fis = new BufferedInputStream(new FileInputStream("11.mp3"));

BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("3.mp3"));

int i=0; while ((i=fis.read())!=-1){ fos.write(i); } fos.close(); fis.close();

}

public static void fun2() throws IOException {

FileInputStream fis = new FileInputStream("11.mp3");

FileOutputStream fos = new FileOutputStream("2.mp3");

int i=0; byte[] bys = new byte[1024]; while ((i=fis.read(bys))!=-1){ fos.write(bys,0,i); } fos.close(); fis.close();

}

public static void fun1() throws IOException {

FileInputStream fis = new FileInputStream("11.mp3");

FileOutputStream fos = new FileOutputStream("1.mp3");

int i=0; while ((i=fis.read())!=-1){ fos.write(i); } fos.close(); fis.close();

}

}


一,编码表(常见)

1,编码表

-由现实世界的字符和对应的数值组成的一张表

2,常见的编码表

-ascii 表

-iso8859-1 拉丁码表,欧洲码表

-gb2312 中国码表

-gbk 升级版,融合了更多的符号

-utf-8 定义了区间规则

能用一个字节表示就用一个

一个不够用2个

2个不够最多用3个来表示

3,字符串的编码和解码问题

-编码:把我们能看懂的变成计算机能看懂的

byte[] getBytes()

使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。

byte[] getBytes(String charsetName)

使用命名的字符集将此 String编码为字节序列,将结果存储到新的字节数组中。

-解码:把计算机能看懂的变成我们能看懂的

String(byte[] bytes, String charsetName)

构造一个新的String由指定用指定的字节的数组解码charset 。

String(byte[] bytes)

通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。

package com.momo.demo;

import java.io.UnsupportedEncodingException;

import java.util.Arrays;

/*

  • 字符串
  • 编码: String---byte[]
  • 解码:byte[]---String
  • 注意:编码表要一致
  • */

public class Demo8 {

public static void main(String[] args) throws UnsupportedEncodingException {

String s = "今天晚上发起总攻";

//byte[] bytes = s.getBytes();

//[-28, -69, -118, -27, -92, -87, -26, -103, -102, -28, -72, -118, -27, -113, -111, -24, -75, -73, -26, -128, -69, -26, -108, -69]

// byte[] bytes = s.getBytes("utf-8"); //[-28, -69, -118, -27, -92, -87, -26, -103, -102, -28, -72, -118, -27, -113, -111, -24, -75, -73, -26, -128, -69, -26, -108, -69] // byte[] bytes = s.getBytes("gbk"); //[-67, -15, -52, -20, -51, -19, -55, -49, -73, -94, -58, -16, -41, -36, -71, -91] //System.out.println(Arrays.toString(bytes)); byte[] bys = {-67, -15, -52, -20, -51, -19, -55, -49, -73, -94, -58, -16, -41, -36, -71, -91}; // String ss = new String(bys);//?????????????? // String ss = new String(bys,"utf-8");//?????????????? String ss = new String(bys,"gbk");//今天晚上发起总攻 System.out.println(ss);

}

}

二,字符流

-字符流是通过字节流转换而来的,所以我们在这里先给大家讲解一下转换流

-字符流 = 字节流 + 编码表

1,Reader

-InputStreamReader

FileReader

...

2,Writer

-OutputStreamWriter

FileWriter

...

3, 因为字节流操作中文不方便,所以java提供了转换流,转换流也是字符流

-InputStreamReader

-OutputStreamWriter

4,OutputStreamWriter

-把字节流输出流转成了字符输出流

-可以使用默认的编码,或者指定编码来转换

-构造方法

OutputStreamWriter(OutputStream out)

创建一个使用默认字符编码的OutputStreamWriter。

OutputStreamWriter(OutputStream out, Charset cs)

创建一个使用给定字符集的OutputStreamWriter。

OutputStreamWriter(OutputStream out, CharsetEncoder enc)

创建一个使用给定字符集编码器的OutputStreamWriter。

OutputStreamWriter(OutputStream out, String charsetName)

创建一个使用命名字符集的OutputStreamWriter。

-成员方法

void close()

关闭流,先刷新。

void flush()

刷新流。

String getEncoding()

返回此流使用的字符编码的名称。

void write(char[] cbuf)

写入一个字符数组。

void write(char[] cbuf, int off, int len)

写入字符数组的一部分。

void write(int c)

写一个字符

void write(String str)

写一个字符串

void write(String str, int off, int len)

写一个字符串的一部分。

package com.momo.demo;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

/*

  • 字符流
  • 转换输出流写数据
  • */

public class Demo7 {

public static void main(String[] args) throws IOException {

//默认编码表 utf8

// OutputStreamWriter oow = new OutputStreamWriter(new FileOutputStream("c.txt"));

//指定 utf8

// OutputStreamWriter oow = new OutputStreamWriter(new FileOutputStream("c.txt"),"utf-8");

//指定 gbk OutputStreamWriter oow = new OutputStreamWriter(new FileOutputStream("c.txt"),"gbk"); //oow.append("abc"); // oow.write(101); // oow.write('f'); /* char[] chs = {97,98,99,100,101,102}; oow.write(chs); oow.flush(); oow.write(chs,2,2); // oow.flush();*/ oow.write("默默是帅哥"); // oow.write("momoshishuaige",7,7); oow.close(); // oow.write(chs,2,2);IOException: Stream closed

}

}

5,InputStreamReader

-把字节流输入流转成了字符输入流

-可以使用默认的编码,或者指定编码来转换

-构造方法

InputStreamReader(InputStream in)

创建一个使用默认字符集的InputStreamReader。

InputStreamReader(InputStream in, Charset cs)

创建一个使用给定字符集的InputStreamReader。

InputStreamReader(InputStream in, CharsetDecoder dec)

创建一个使用给定字符集解码器的InputStreamReader。

InputStreamReader(InputStream in, String charsetName)

创建一个使用命名字符集的InputStreamReader。

-成员方法

void close()

关闭流并释放与之相关联的任何系统资源。

String getEncoding()

返回此流使用的字符编码的名称。

int read()

读一个字符

int read(char[] cbuf)

将字符读入数组。

int read(char[] cbuf, int off, int len)

将字符读入数组的一部分。

package com.momo.demo;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStreamReader;

/*

  • 转换输入流读取数据
  • /

public class Demo9 {public static void main(String[] args) throws IOException {//InputStreamReader isr = new InputStreamReader(new FileInputStream("c.txt"));InputStreamReader isr = new InputStreamReader(new FileInputStream("c.txt"),"utf-8");// InputStreamReader isr = new InputStreamReader(new FileInputStream("c.txt"),"gbk");/

while ((i=isr.read())!=-1){

System.out.println((char)i);

}*/

int i=0; char[] chs = new char[1024]; while ((i=isr.read(chs))!=-1){ System.out.println(new String(chs,0,i)); } isr.close();

}

}

package com.momo.demo;

import java.io.*;

/*

  • 转换流复制文件
  • 注意:转换流已经是字符流了,不能读写(图片,音频,视频等文件了)
  • /

public class Demo10 {public static void main(String[] args) throws IOException {//这个是错误演示,不能操作图片,音频,视频等文件了/

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.webp"));

int i = 0; while ((i=isr.read())!=-1){ osw.write(i); osw.flush(); } osw.close(); isr.close();*/ InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt")); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c.txt")); /* int i = 0; while ((i=isr.read())!=-1){ osw.write(i); osw.flush(); }*/ int i = 0; char[] chs = new char[1024]; while ((i=isr.read(chs))!=-1){ osw.write(chs,0,i); osw.flush(); } osw.close(); isr.close();

}

}

6,转换流名字太长,还要传递字节流和编码表,麻烦,

而且我们常见的操作都是按照本地默认编码实现的,所以

为了简化使用和书写,转换流提供了对应的子类

-FileReader

-FileWriter

7,FileWriter

-简化字符的写入,有默认字符编码和默认字节缓冲区大小

-构造方法:

FileWriter(File file)

给一个File对象构造一个FileWriter对象。

FileWriter(File file, boolean append)

给一个File对象构造一个FileWriter对象。

FileWriter(String fileName)

构造一个给定文件名的FileWriter对象。

FileWriter(String fileName, boolean append)

构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。

-成员方法:

都是父类中讲过的

package com.momo.demo;

import java.io.FileWriter;

import java.io.IOException;

public class Demo11 {

public static void main(String[] args) throws IOException {

FileWriter fw = new FileWriter("a.txt",true);

fw.write("默默是大帅逼");

fw.write("\r\n");

fw.close();

}

}

8,FileReader

-简化字符的读取,有默认字符编码和默认字节缓冲区大小

-构造方法:

FileReader(File file)

创建一个新的 FileReader ,给出 File读取。

FileReader(String fileName)

创建一个新的 FileReader ,给定要读取的文件的名称。

-成员方法:

都是父类中讲过的

package com.momo.demo;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

public class Demo12 {

public static void main(String[] args) throws IOException {

FileReader fr = new FileReader("a.txt");

/* int i = 0; while ((i=fr.read())!=-1){ System.out.println((char)i); }*/ int i = 0; char[] chs = new char[1024]; while ((i=fr.read(chs))!=-1){ System.out.println(new String(chs,0,i)); } fr.close(); }

}

package com.momo.demo;

import java.io.*;

public class Demo13 {

public static void main(String[] args) throws IOException {

FileReader isr = new FileReader("a.txt");

FileWriter osw = new FileWriter("c.txt");

/* int i = 0; while ((i=isr.read())!=-1){ osw.write(i); osw.flush(); }*/ int i = 0; char[] chs = new char[1024]; while ((i=isr.read(chs))!=-1){ osw.write(chs,0,i); osw.flush(); } osw.close(); isr.close(); }

}

三 ,字符缓冲流

1, BufferedWriter

-将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。

-可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。

-构造方法:

BufferedWriter(Writer out)

创建使用默认大小的输出缓冲区的缓冲字符输出流。

BufferedWriter(Writer out, int sz)

创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。

-成员方法:

写数据的方法都是讲过的

特有:void newLine()

会根据当前系统自动决定换行符

package com.momo.demo;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

/*

  • 字符缓冲流写数据
  • */

public class Demo14 {

public static void main(String[] args) throws IOException {

BufferedWriter bw =new BufferedWriter(new FileWriter("a.txt"));

for (int i = 0; i < 5; i++) {

bw.write("默默是帅哥");

bw.newLine();

bw.flush();

}

bw.close();

}

}

2,BufferedReader

-从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。

-可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。

-构造方法:

BufferedReader(Reader in)

创建使用默认大小的输入缓冲区的缓冲字符输入流。

BufferedReader(Reader in, int sz)

创建使用指定大小的输入缓冲区的缓冲字符输入流。

-成员方法:

特点:String readLine() 读取到文件末尾返回null

读一行文字。

package com.momo.demo;

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

/*

  • 字符缓冲流读取数据
  • /

public class Demo15 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("a.txt"));/

System.out.println(s);

s = br.readLine();

System.out.println(s);

s = br.readLine();

System.out.println(s);

s = br.readLine();

System.out.println(s);

s = br.readLine();

System.out.println(s);

s = br.readLine();

System.out.println(s);*/

String s = null; while ((s=br.readLine())!=null){ System.out.println(s); } br.close();

}

}

package com.momo.demo;

import java.io.;/

字符缓冲流复制文件

  • */

public class Demo16 {

public static void main(String[] args) throws IOException {

BufferedReader isr = new BufferedReader(new FileReader("a.txt"));

BufferedWriter osw = new BufferedWriter(new FileWriter("c.txt"));

/* int i = 0; while ((i=isr.read())!=-1){ osw.write(i); osw.flush(); }*/ /* int i = 0; char[] chs = new char[1024]; while ((i=isr.read(chs))!=-1){ osw.write(chs,0,i); osw.flush(); }*/ String s; while ((s=isr.readLine())!=null){ osw.write(s); osw.newLine(); osw.flush(); } osw.close(); isr.close();

}

}


3,io流的练习

-复制文本文件

-复制图片

-把ArrayList集合中的字符串存储到文本文件中

-从文本文件中每读取一行数据就存储集合中,遍历集合

-复制单级文件夹

-复制多级文件夹

-键盘输入几个学生信息(按照成绩总分从高到底排序) 存储到文本文件中

-a.txt中有一个字符串dslsdljfldjgsdeewrqwe

要求读取数据排序,然后存入b.txt中

-模拟用户注册登录,实现增删改查(io版)