IO流01_字节字符流、缓冲流、标准输入、输出流、打印流

news/2024/12/13 16:51:22/

文章目录

  • ①. IO流概述及分类
  • ②. 字节输入流 - FileInputStream
  • ③. 字节输出流 - FileOutputStream
  • ④. 字符输入流 - FileReader
  • ⑤. 字符输出流 - FileWriter
  • ⑥. 字节缓冲流 - Buffered
  • ⑦. 掌握 - 相关流习题操作
  • ⑧. 标准输入、输出流(了解)
  • ⑨. 打印流 - PrintStream、PrintWriter

①. IO流概述及分类

  • ①. IO流用来处理设备之间的数据传输、Java堆数据的操作是通过流的方式 、Java用于操作流的类都在IO包中

  • ②. 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
    输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
    在这里插入图片描述

  • ③. 流的分类

  1. 流按流向分为两种:输入流(读数据)、输出流(写数据)
  2. 流按操作类型分为两种:(默认是这样方式)
    a. 字节流 [InputStream、OutputStrean]⇢抽象父类:字节流可以操作任何数据,因为计算机任何数据都是以字节的形式储存的(音频、视频、图片等)
    b. 字符流 [Reader、Writer]⇢抽象父类:字符流只能操作纯字符数据,比较方便
  3. 按流的角色的不同分为:节点流(没有进行包一层处理的如:FileInputStream),处理流(在字节流的基础上包了一层处理)
    a. 节点流:直接从数据源或目的地读写数据
    b. 处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能
    在这里插入图片描述在这里插入图片描述
  • ④. IO流体系
    在这里插入图片描述

②. 字节输入流 - FileInputStream

在这里插入图片描述

  • ①. FileInputStream 构造方法
  1. FileInputStream​(String name)
  2. FileInputStream​(File file)
    在这里插入图片描述
  • ②. read方法
  1. int read():一次读取一个字节,如果文件读到末尾,返回值是-1
  2. int read(byte[ ] b):从此输入流中最多b.length 个字节的数据读入一个byte数组中
	FileInputStream fis=new FileInputStream("hello.txt");//循环从硬盘上读取int x;while((x=fis.read())!=-1){System.out.print(x);}//关闭资源fis.close();

③. 字节输出流 - FileOutputStream

  • ①. 构造方法
  1. FileOutputStream​(String name):创建文件输出流以指定的名称写入文件
  2. FileOutputStream​(File file):创建文件输出流以写入由指定的 File对象表示的文件
    在这里插入图片描述
  • ②. writer方法
  1. void write​(int b):将指定的字节写入此文件输出流
  2. void write​(byte[] b):将 b.length字节从指定的字节数组写入此文件输出流
  3. void write​(byte[] b, int off, int len):将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流一次写一个字节数组的部分数据
    在这里插入图片描述
        //FileOutputStream​(String name):创建文件输出流以指定的名称写入文件FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");//new File(name)
//        FileOutputStream fos = new FileOutputStream(new File("myByteStream\\fos.txt"));//FileOutputStream​(File file):创建文件输出流以写入由指定的 File对象表示的文件File file = new File("myByteStream\\fos.txt");FileOutputStream fos2 = new FileOutputStream(file);
//        FileOutputStream fos2 = new FileOutputStream(new File("myByteStream\\fos.txt"));//void write​(int b):将指定的字节写入此文件输出流
//        fos.write(97);
//        fos.write(98);
//        fos.write(99);
//        fos.write(100);
//        fos.write(101);//        void write​(byte[] b):将 b.length字节从指定的字节数组写入此文件输出流
//        byte[] bys = {97, 98, 99, 100, 101};//byte[] getBytes​():返回字符串对应的字节数组byte[] bys = "abcde".getBytes();
//        fos.write(bys);//void write​(byte[] b, int off, int len):将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流
//        fos.write(bys,0,bys.length);fos.write(bys,1,3);//释放资源fos.close();
  • ③. 字节流遇到的两个小问题
  1. 如何实现换行? window:/r/n
  2. 如何实现追加?在FileOutputStream( )构造方法的第二个参数中设置为true
        //创建字节输出流对象
//        FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt",true);//写数据for (int i = 0; i < 10; i++) {fos.write("hello".getBytes());fos.write("\r\n".getBytes());}//释放资源fos.close();}

在这里插入图片描述

  • ④. 小数组文件的复制(重点掌握)
    //定义小数组的标准格式 掌握@Testpublic void fun7() throws IOException {//定义小数组的标准格式//创建输入流对象FileInputStream fis=new FileInputStream("xiaozhi.txt");//创建输出流对象FileOutputStream fos=new FileOutputStream("copyxiaozhi.txt");//数组一般是定义1024的整数倍等//byte[]arr=new byte[1024*8];byte[]arr=new byte[1024];int len;//如果忘记加arr,返回就不是读取的字节个数,而是字节的码表值while((len=fis.read(arr))!=-1){//len表示读取到的真实长度fos.write(arr,0,len);//读取到的数组的长度// fos.write(arr,0,arr);}fis.close();fos.close();}

在这里插入图片描述

④. 字符输入流 - FileReader

在这里插入图片描述

  • ①. FileReader构造器
  1. FileReader​(File file):创建一个新的FileReader ,给出File读取
  2. FileReader​(String fileName):创建一个新的 FileReader,给定要读取的文件的名称

在这里插入图片描述

  • ②. 方法(继承了父类的读的方法)
  1. int read():读取得字符,如果已经达到末尾,则返回-1
  2. int read(char[ ]ch):写一个字符数组
public class FileReaderWriterTest {public static void main(String[] args){FileReader fr=null;try{// 将study_java_function\a.txt文件内容入程序中,并输出控制台// a.txt 文件提前写入abcdFile file=new File("study_java_function\\a.txt");fr=new FileReader(file);// int read():读取得字符,如果已经达到末尾,则返回 -1//(1). 方式一
//        int data=fr.read();
//        while(data!=-1){
//            // abcd
//            System.out.print((char)data);
//            data=fr.read();
//        }// (2). 方式二:语法上针对方式一的修改int data;while ((data=fr.read())!=-1){System.out.print((char)data);}}catch (IOException e){e.printStackTrace();}finally {// 流的关闭问题try {if(fr!=null){fr.close();}} catch (IOException e) {e.printStackTrace();}}}
}
@SuppressWarnings("all")
public class FileReaderWriterTest {public static void main(String[] args){FileReader fr=null;try{// a.txt 文件有abcd1fr=new FileReader(new File("study_java_function\\a.txt"));// 读入操作// read(char[]cbuf):返回每次返回cbug数组中的字符个数,如果达到文件末尾,返回-1char[]cbuf=new char[2];int len;while ((len=fr.read(cbuf))!=-1){// 错误的写法
//                for (int i = 0; i < cbuf.length ; i++) {// 会输出abcd1d
//                    System.out.print((char)cbuf[i]);
//                }// 正确的写法for (int i = 0; i < len; i++) {System.out.print((char)cbuf[i]);}// 方式二
//                String str=new String(cbuf,0,len);
//                System.out.print(str);}}catch (IOException e){e.printStackTrace();}finally {// 流的关闭问题try {if(fr!=null){fr.close();}} catch (IOException e) {e.printStackTrace();}}}
}

⑤. 字符输出流 - FileWriter

  • ①. FileWriter构造器
  1. FileWriter​(String fileName):构造一个给定文件名的FileWriter对象。
  2. FileWriter​(File file):给一个File对象构造一个FileWriter对象
    在这里插入图片描述
  • ②. FileWriter常用方法
    在这里插入图片描述
public class FileReaderWriterTest {public static void main(String[] args){FileWriter fr=null;try{// FileWriter(file,false):默认fasle,表示覆盖fr=new FileWriter(new File("study_java_function\\b.txt"),false);// true表示追加 FileWriter(file,true):不会对原有文件覆盖,而是在原有文件上追加内容//fr=new FileWriter(new File("study_java_function\\b.txt"),false);// 覆盖fr.write("I hava a dream\n");fr.write("you need to have a dream");}catch (IOException e){e.printStackTrace();}finally {// 流的关闭问题try {if(fr!=null){fr.close();}} catch (IOException e) {e.printStackTrace();}}}
}
  • ③. 使用FileReader和FileWriter实现文本文件的复制
    private static final String FILEDESC  ="study_java_function\\a.txt";public static void main(String[] args){FileReader fr=null;FileWriter fw=null;try{fr=new FileReader(FILEDESC);fw=new FileWriter("study_java_function\\d.txt");char[]cbuf=new char[2];int len;while((len=fr.read(cbuf))!=-1){// 每次读取几个就写入几个字符fw.write(cbuf,0,len);}}catch (IOException e){e.printStackTrace();}finally {// 流的关闭问题try {if(fr!=null){fr.close();}if(fw!=null){fw.close();}} catch (IOException e) {e.printStackTrace();}}}
  • ④. 什么情况下使用字符流
  1. 字符流可以拷贝文本文件,但不推荐使用,因为读取时把会字节转为字符,写出时还要把字符转回字节
  2. 程序需要读取一段文本,或者需要写出一段文本的时候可以使用字符流
  3. 读取的时候就按照字符的大小读取的,不会出现半个中文。写出的时候可以直接将字符串写出,不用转换为字节数组

⑥. 字节缓冲流 - Buffered

  • ①. 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
    字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作

  • ②. 缓冲原理:BufferedInputStream内置了一个缓冲区(数组),从BufferedInputStream中读取一个字时,BufferedInputStream会一次性从文件中读取8192个,存在缓冲区,返回给程序一个。程序再次读取时,就不用找文件了,直接从缓冲区读取,直到缓冲区中所有的都被使用过,才重新从文件中读取8192个
    在这里插入图片描述

  • ③. 构造函数BufferedInputStream​(InputStream in):创建一个BufferedInputStream并保存其参数,输入流in供以后使用
    在这里插入图片描述

  • ④. 使用缓冲流实现复制功能

public class BufferTest {private static final String FILEDESC  ="study_java_function\\IO流.pdf";public static void main(String[] args) {BufferedInputStream bfis=null;BufferedOutputStream bfos=null;FileInputStream fis=null;FileOutputStream fos=null;try{fis = new FileInputStream(new File(FILEDESC));fos = new FileOutputStream("study_java_function\\IO流1.pdf");// 造缓冲流bfis=new BufferedInputStream(fis);bfos=new BufferedOutputStream(fos);// 复制byte[]byteArray=new byte[1024];int len;while((len=bfis.read(byteArray))!=-1){bfos.write(byteArray,0,len);}}catch (IOException e){e.printStackTrace();}finally {try {// 资源关闭// 1. 先关闭外层的流,再关闭内层的流
//                if(bfis!=null){bfis.close();}
//                if(bfos!=null){bfos.close();}
//
//                if(fis!=null){fis.close();}
//                if(fos!=null){fos.close();}// 2. 关闭外层的流,底层会自动将内层帮我们自动关闭if(bfis!=null){bfis.close();}if(bfos!=null){bfos.close();}}catch (IOException e){e.printStackTrace();}}}
}
  • ⑤. 字符缓冲流特有功能
  1. BufferedReader :String readLine():方法可以读取一行字符(不包含换行符号),如果到达了流的结尾它会返回null
  2. BufferedWriter :void newLine():可以输出一个跨平台的换行符号 “\r\n”
  3. newLine()和 \r\n 的区别
    a. newLine()可以在任意的系统上
    b. \r\n 只能在window系统上
   BufferedReader br=new BufferedReader(new FileReader("hello.txt"));BufferedWriter bw=new BufferedWriter(new FileWriter("AAA.txt"));String len;while((len=br.readLine())!=null){bw.write(len);//写出回车换行符bw.newLine();//bw.write("\r\n");// bw.flush();}br.close();bw.close();

⑦. 掌握 - 相关流习题操作

  • ①. 集合到文件的案列
    在这里插入图片描述
/*需求:把ArrayList集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件中的一行数据思路:1:创建ArrayList集合2:往集合中存储字符串元素3:创建字符缓冲输出流对象4:遍历集合,得到每一个字符串数据5:调用字符缓冲输出流对象的方法写数据6:释放资源*/
public class ArrayListToTxtDemo {public static void main(String[] args) throws IOException {//创建ArrayList集合ArrayList<String> array = new ArrayList<String>();//往集合中存储字符串元素array.add("hello");array.add("world");array.add("java");//创建字符缓冲输出流对象BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\array.txt"));//遍历集合,得到每一个字符串数据for(String s : array) {//调用字符缓冲输出流对象的方法写数据bw.write(s);bw.newLine();bw.flush();}//释放资源bw.close();}
}
  • ②. 文件到集合的案列
/*需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个集合元素思路:1:创建字符缓冲输入流对象2:创建ArrayList集合对象3:调用字符缓冲输入流对象的方法读数据4:把读取到的字符串数据存储到集合中5:释放资源6:遍历集合*/
public class TxtToArrayListDemo {public static void main(String[] args) throws IOException {//创建字符缓冲输入流对象BufferedReader br = new BufferedReader(new FileReader("myCharStream\\array.txt"));//创建ArrayList集合对象ArrayList<String> array = new ArrayList<String>();//调用字符缓冲输入流对象的方法读数据String line;while ((line=br.readLine())!=null) {//把读取到的字符串数据存储到集合中array.add(line);}//释放资源br.close();//遍历集合for(String s : array) {System.out.println(s);}}
}
  • ③.点名器
/*需求:我有一个文件里面存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随点名器思路:1:创建字符缓冲输入流对象2:创建ArrayList集合对象3:调用字符缓冲输入流对象的方法读数据4:把读取到的字符串数据存储到集合中5:释放资源6:使用Random产生一个随机数,随机数的范围在:[0,集合的长度)7:把第6步产生的随机数作为索引到ArrayList集合中获取值8:把第7步得到的数据输出在控制台*/
public class CallNameDemo {public static void main(String[] args) throws IOException {//创建字符缓冲输入流对象BufferedReader br = new BufferedReader(new FileReader("myCharStream\\names.txt"));//创建ArrayList集合对象ArrayList<String> array = new ArrayList<String>();//调用字符缓冲输入流对象的方法读数据String line;while ((line=br.readLine())!=null) {//把读取到的字符串数据存储到集合中array.add(line);}//释放资源br.close();//使用Random产生一个随机数,随机数的范围在:[0,集合的长度)Random r = new Random();int index = r.nextInt(array.size());//把第6步产生的随机数作为索引到ArrayList集合中获取值String name = array.get(index);//把第7步得到的数据输出在控制台System.out.println("幸运者是:" + name);}
}
  • ④.集合到文件改进版
public class Student {private String sid;private String name;private int age;private String address;public Student() {}public Student(String sid, String name, int age, String address) {this.sid = sid;this.name = name;this.age = age;this.address = address;}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}
/*需求:把ArrayList集合中的学生数据写入到文本文件。要求:每一个学生对象的数据作为文件中的一行数据格式:学号,姓名,年龄,居住地	举例:xiaozhi001,林青霞,30,西安思路:1:定义学生类2:创建ArrayList集合3:创建学生对象4:把学生对象添加到集合中5:创建字符缓冲输出流对象6:遍历集合,得到每一个学生对象7:把学生对象的数据拼接成指定格式的字符串8:调用字符缓冲输出流对象的方法写数据9:释放资源*/
public class ArrayListToFileDemo {public static void main(String[] args) throws IOException {//创建ArrayList集合ArrayList<Student> array = new ArrayList<Student>();//创建学生对象Student s1 = new Student("xiaozhi001", "林青霞", 30, "西安");Student s2 = new Student("xiaozhi002", "张曼玉", 35, "武汉");Student s3 = new Student("xiaozhi003", "王祖贤", 33, "郑州");//把学生对象添加到集合中array.add(s1);array.add(s2);array.add(s3);//创建字符缓冲输出流对象BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\students.txt"));//遍历集合,得到每一个学生对象for (Student s : array) {//把学生对象的数据拼接成指定格式的字符串StringBuilder sb = new StringBuilder();sb.append(s.getSid()).append(",").append(s.getName()).append(",").append(s.getAge()).append(",").append(s.getAddress());//调用字符缓冲输出流对象的方法写数据bw.write(sb.toString());bw.newLine();bw.flush();}//释放资源bw.close();}
}
  • ⑤. 从文件到集合
/*需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个学生对象的成员变量值举例:xiaozhi001,林青霞,30,西安思路:1:定义学生类2:创建字符缓冲输入流对象3:创建ArrayList集合对象4:调用字符缓冲输入流对象的方法读数据5:把读取到的字符串数据用split()进行分割,得到一个字符串数组6:创建学生对象7:把字符串数组中的每一个元素取出来对应的赋值给学生对象的成员变量值8:把学生对象添加到集合9:释放资源10:遍历集合*/
public class FileToArrayListDemo {public static void main(String[] args) throws IOException {//创建字符缓冲输入流对象BufferedReader br = new BufferedReader(new FileReader("myCharStream\\students.txt"));//创建ArrayList集合对象ArrayList<Student> array = new ArrayList<Student>();//调用字符缓冲输入流对象的方法读数据String line;while ((line = br.readLine()) != null) {//把读取到的字符串数据用split()进行分割,得到一个字符串数组String[] strArray = line.split(",");//创建学生对象Student s = new Student();//把字符串数组中的每一个元素取出来对应的赋值给学生对象的成员变量值//itheima001,林青霞,30,西安s.setSid(strArray[0]);s.setName(strArray[1]);s.setAge(Integer.parseInt(strArray[2]));s.setAddress(strArray[3]);//把学生对象添加到集合array.add(s);}//释放资源br.close();//遍历集合for (Student s : array) {System.out.println(s.getSid() + "," + s.getName() + "," + s.getAge() + "," + s.getAddress());}}
}
  • ⑥.将文本反转 :将一个文本文档上的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换
        //将一个文本文档上的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换/*分析:1.创建输入输出流对象2.创建集合对象3. 将读到的数据存储在集合中4.倒着遍历集合将数据写到文件上5.关流注意事项:流对象尽量晚开早关* *///1.创建输入输出流对象BufferedReader br=new BufferedReader(new FileReader("hello.txt"));BufferedWriter bw=new BufferedWriter(new FileWriter("reverse.txt"));//2.创建集合对象ArrayList<String>list=new ArrayList<>();//3.将读到的数据存储在集合中String len;while((len=br.readLine())!=null){list.add(len);}//4.倒着遍历集合将数据写到文件上for (int i = list.size()-1; i >=0; i--) {bw.write(list.get(i));bw.newLine();}//5.关流br.close();bw.close();
  • ⑦.键盘输入n个int类型数据,将每个…
//题目一:
//        键盘输入n个int类型数据,将每一个int类型的数据存储到集合
//        注意:当用户输入:”886”时,停止输入。
//        最后将集合里的数据写入到文件,且保证数据能够看得懂
//        例如输入的数据为:44 11 22 33, 那么最后文件中的数据格式为:
//        11
//        22
//        33
//        44
public class Demo1 {public static void main(String[] args)throws Exception {//1.创建集合数组ArrayList<Integer>list=new ArrayList<>();//2.无限循环写数据到集合Scanner sc=new Scanner(System.in);while(true){/*3.每次输入数据,建议输入字符串用Integer.parseInt()进行转换,进行try-catch处理判断一下是否为886如果是886结束否则添加到集合*/String str= sc.nextLine();try {//用Integer.parseInt()进行转换,进行try-catch处理int iNum=Integer.parseInt(str);//判断一下是否为886如果是886结束if(iNum==886){break;}//4.将元素添加到集合中list.add(iNum);} catch (NumberFormatException e) {System.out.println("你输入的数据有误,请根据提示输入好吗");}}//5.Collections集合对list进行升序Collections.sort(list);//6.将集合中的元素写入到文件中//由于不需要拷贝,可以考虑字符流BufferedWriter fw=new BufferedWriter(new FileWriter("JavaSe_Course\\Demo1.txt"));//6.遍历集合,把集合中的元素写入到文件中for(Integer value:list){String str=String.valueOf(value);fw.write(str);fw.newLine();}//7.关闭流fw.close();}
}
  • ⑧.试用版软件
/*实现一个验证码小程序,要求如下:实现一个验证程序运行次数的小程序,要求如下:1.当程序运行超过3次时给出提示:本软件只能免费使用3次,欢迎您注册会员后继续使用~2.程序运行演示如下:第一次运行控制台输出: 欢迎使用本软件,第1次使用免费~第二次运行控制台输出: 欢迎使用本软件,第2次使用免费~第三次运行控制台输出: 欢迎使用本软件,第3次使用免费~第四次及之后运行控制台输出:本软件只能免费使用3次,欢迎您注册会员后继续使用~(tips:手动创建一个文本文件用于存放文件使用的次数,每次启动程序都应该更改文件里的数据)*/
public class Demo5 {public static void main(String[] args)throws Exception {/*1.首先在应该在当前模块下创建一个文件,该文件存放的就是本软件试用的次数2.需要创建一个缓冲输入流[可能要读一行],为了读取配置文件的数据3.读数据,读一次就可以了4.将读取到的字符串转成整数5.对整数进行判断:如果<3 ,也进行对应的提示如果大于3,给出对应的提示6.创建一个字符输出流对象,为了把++之后的变量写入到文件7.为了保证数据的原样性,在写的时候,需要把数字当成字符串写出8.释放资源* *///1.首先在应该在当前模块下创建一个文件,该文件存放的就是本软件试用的次数//2.需要创建一个缓冲输入流[可能要读一行],为了读取配置文件的数据BufferedReader fr=new BufferedReader(new FileReader("JavaSe_Course\\Demo5.txt"));//3.读数据,读一次就可以了String line;while((line=fr.readLine())!=null){//4.将读取到的字符串转成整数int num=Integer.parseInt(line);//5.对整数进行判断:if(num<3){System.out.println("欢迎使用本软件,第"+(++num)+"次使用免费~");//6.创建一个字符输出流对象,为了把++之后的变量写入到文件FileWriter fw=new FileWriter("JavaSe_Course\\Demo5.txt");//7.为了保证数据的原样性,在写的时候,需要把数字当成字符串写出fw.write(String.valueOf(num));// 8.释放资源fw.close();}else{System.out.println("本软件只能免费使用3次,欢迎您注册会员后继续使用");return;}}// 8.释放资源fr.close();}
}
  • ⑨.文件夹的复制(不包含子文件)和包括子文件的文件夹复制
    思路:1:创建数据源目录File对象,路径是E:\\itcast2:获取数据源目录File对象的名称(itcast)3:创建目的地目录File对象,路径名是模块名+itcast组成(myCharStream\\itcast)4:判断目的地目录对应的File是否存在,如果不存在,就创建5:获取数据源目录下所有文件的File数组6:遍历File数组,得到每一个File对象,File对象,其实就是数据源文件数据源文件:E:\\itcast\\mn.jpg7:获取数据源文件File对象的名称(mn.jpg)8:创建目的地文件File对象,路径名是目的地目录+mn.jpg组成(myCharStream\\itcast\\mn.jpg)9:复制文件由于文件不仅仅是文本文件,还有图片,视频等文件,所以采用字节流复制文件*/
public class CopyFolderDemo {public static void main(String[] args) throws IOException {//创建数据源目录File对象,路径是E:\\itcastFile srcFolder = new File("E:\\itcast");//获取数据源目录File对象的名称(itcast)String srcFolderName = srcFolder.getName();//创建目的地目录File对象,路径名是模块名+itcast组成(myCharStream\\itcast)File destFolder = new File("myCharStream",srcFolderName);//判断目的地目录对应的File是否存在,如果不存在,就创建if(!destFolder.exists()) {destFolder.mkdir();}//获取数据源目录下所有文件的File数组File[] listFiles = srcFolder.listFiles();//遍历File数组,得到每一个File对象,该File对象,其实就是数据源文件for(File srcFile : listFiles) {//数据源文件:E:\\itcast\\mn.jpg//获取数据源文件File对象的名称(mn.jpg)String srcFileName = srcFile.getName();//创建目的地文件File对象,路径名是目的地目录+mn.jpg组成(myCharStream\\itcast\\mn.jpg)File destFile = new File(destFolder,srcFileName);//复制文件copyFile(srcFile,destFile);}}private static void copyFile(File srcFile, File destFile) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));byte[] bys = new byte[1024];int len;while ((len=bis.read(bys))!=-1) {bos.write(bys,0,len);}bos.close();bis.close();}}
/*需求:把“E:\\xiaozhi”复制到 F盘目录下思路:1:创建数据源File对象,路径是E:\\xiaozhi2:创建目的地File对象,路径是F:\\3:写方法实现文件夹的复制,参数为数据源File对象和目的地File对象4:判断数据源File是否是目录是:A:在目的地下创建和数据源File名称一样的目录B:获取数据源File下所有文件或者目录的File数组C:遍历该File数组,得到每一个File对象D:把该File作为数据源File对象,递归调用复制文件夹的方法不是:说明是文件,直接复制,用字节流*/
@SuppressWarnings("all")
public class CopyFoldersDemo {public static void main(String[] args) throws IOException {//创建数据源File对象,路径是E:\\xiaozhiFile srcFile = new File("F:\\test");//创建目的地File对象,路径是F:\\File destFile = new File("E:\\");//写方法实现文件夹的复制,参数为数据源File对象和目的地File对象copyFolder(srcFile,destFile);}//复制文件夹private static void copyFolder(File srcFile, File destFile) throws IOException {//判断数据源File是否是目录if(srcFile.isDirectory()) {//在目的地下创建和数据源File名称一样的目录String srcFileName = srcFile.getName();File newFolder = new File(destFile,srcFileName); //F:\\xiaozhiif(!newFolder.exists()) {newFolder.mkdir();}//获取数据源File下所有文件或者目录的File数组File[] fileArray = srcFile.listFiles();//遍历该File数组,得到每一个File对象for(File file : fileArray) {//把该File作为数据源File对象,递归调用复制文件夹的方法if(file.isFile()){File newFile = new File(newFolder,file.getName());copyFile(file,newFile);}else{copyFolder(file,newFolder);}}} else {//说明是文件,直接复制,用字节流File newFile = new File(destFile,srcFile.getName());copyFile(srcFile,newFile);}}//字节缓冲流复制文件private static void copyFile(File srcFile, File destFile) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));byte[] bys = new byte[1024];int len;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);}bos.close();bis.close();}}

⑧. 标准输入、输出流(了解)

  • ①. public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源

  • ②. public static final PrintStream out:标准输出流。通常该流对应于显示(显示在控制台)或由主机环境或用户指定的另一个输出目标

  • ③. System.in的类型是InputStream、System.out的类型是PrintStream

  • ④. 从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续进行输入操作,直至当输入“e”或者“exit”时,退出程序

/*** 从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续* 进行输入操作,直至当输入“e”或者“exit”时,退出程序*/
public class InputPrintIoTest {public static void main(String[] args) {BufferedReader bfr=null;try{System.out.println("请输入信息(退出输入e或exit):");bfr = new BufferedReader(new InputStreamReader(System.in));String msg="";while((msg=bfr.readLine())!=null){if("e".equalsIgnoreCase(msg)||"exit".equalsIgnoreCase(msg)){System.out.println("安全退出!!");break;}System.out.println("-->:" + msg.toUpperCase());}}catch (Exception e){e.printStackTrace();}finally {try {if(bfr!=null){ bfr.close();}} catch (IOException e) {e.printStackTrace();}}}
}

⑨. 打印流 - PrintStream、PrintWriter

  • ①. 实现将基本数据类型的数据格式转化为字符串输出
    在这里插入图片描述
  • ②. 打印流:PrintStream和PrintWriter
  1. 提供了一系列重载的print()和println()方法,用于多种数据类型的输出
  2. PrintStream和PrintWriter的输出不会抛出IOException异常
  3. PrintStream和PrintWriter有自动flush功能
  4. PrintStream打印的所有字符都使用平台的默认字符编码转换为字节
  5. System.out返回的是PrintStream的实例
public class PrintStreamTest {public static void main(String[] args) {PrintStream ps = null;try {FileOutputStream fos = new FileOutputStream(new File("study_java_function\\a.txt"));// 创建打印输出流,设置为自动刷新模式(写入换行符或字节 '\n' 时都会刷新输出缓冲区)ps = new PrintStream(fos, true);if (ps != null) {// 把标准输出流(控制台输出)改成文件System.setOut(ps);}for (int i = 0; i <= 255; i++) {// 输出ASCII字符System.out.print((char) i);if (i % 50 == 0) { // 每50个数据一行System.out.println(); // 换行}}} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (ps != null) {ps.close();}}}
}
  • ③. 字符打印流:PrintWriter
  1. PrintWriter(String fileName):使用指定的文件名创建一个新的printWriter,而不需要自动执行刷新
  2. PrinteWriter(Writer out ,boolean autoFlush):
  3. out:字符输出流
  4. autoFlush:一个布尔值,如果为真,则println()方法相当于刷新了缓冲区的内容
    在这里插入图片描述
public class DataOutputStreamTest {public static void main(String[] args) {DataOutputStream dos = null;DataInputStream dis = null;try { // 创建连接到指定文件的数据输出流对象dis=new DataInputStream(new FileInputStream("study_java_function\\destData.dat"));dos = new DataOutputStream(new FileOutputStream("study_java_function\\destData.dat"));dos.writeUTF("我爱北京天安门"); // 写UTF字符串dos.writeBoolean(false); // 写入布尔值dos.writeLong(1234567890L); // 写入长整数System.out.println("写文件成功!");} catch (IOException e) {e.printStackTrace();} finally { // 关闭流对象try {if (dos != null) {// 关闭过滤流时,会自动关闭它包装的底层节点流dos.close();}} catch (IOException e) {e.printStackTrace();}}}
}

http://www.ppmy.cn/news/24774.html

相关文章

编译原理(第3版-王生原)课后习题答案-第三章

1.构造下列正规式相应的 DFA。(1)1(0|1) *101(2)1(1010* |1(010)*1) *0(3)a((a|b)* |ab*a)*b(4)b((ab)* bb)*ab答案&#xff1a;(2)(3)(4)略。 写1个(1)体现解题思路。2.已知 NFA ((x,yz),{0,1}M,{x},{z})&#xff0c;其中:M(x,0){z}, M(y,0){x,y}, M(z,0){x,z}, M(x,1){x}, M(…

4.7 反射

文章目录1.概述2.为什么需要反射3.反射需要用到的API3.1 获取字节码对象3.2 常用方法4.反射的应用4.1 创建 : 测试物料类4.2 练习 : 获取类对象4.3 练习 : 类获取构造方法4.4 练习 : 获取成员方法4.5 练习&#xff1a;获取成员变量4.6 练习 : 创建对象4.7 熟悉API4.7.1 创建物科…

Flutter(一)介绍、Dart语言简介

Flutter介绍 纯原生开发主要面临动态化更新和开发成本两个问题&#xff0c;而针对这两个问题&#xff0c;诞生了一些跨平台的动态化框架 跨平台技术简介 Flutter 是 Google 推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开…

零基础学MySQL(五)-- 详细讲解数据库中的常用函数

目录&#x1f387;一、聚合函数1️⃣count 函数&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;基本练习&#xff08;3&#xff09;注意细节2️⃣sum 函数&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;基本练习&#xff08;3&#xff09;注意细节3…

vue-router路由配置

介绍&#xff1a;路由配置主要是用来确定网站访问路径对应哪个文件代码显示的&#xff0c;这里主要描述路由的配置、子路由、动态路由&#xff08;运行中添加删除路由&#xff09; 1、npm添加 npm install vue-router // 执行完后会自动在package.json中添加 "vue-router…

Hive手册

文章目录1 Hive基本概念1.1 Hive简介1.1.1 什么是Hive1.1.2 为什么使用Hive1.1.3 Hive特点1.2 Hive的体系架构1.3 Hive和RDBMS的对比1.4 Hive的数据存储2 Hive基本使用2.1 Hive存储格式2.2 Hive中的数据模型3 Hive应用3.1 Hive内置函数3.2 SQL介绍与Hive应用场景3.2.1 数据库操…

数模美赛如何找数据 | 2023年美赛数学建模必备数据库

2023美赛资料分享/思路答疑群&#xff1a;322297051 欧美相关统计数据&#xff08;一般美赛这里比较多&#xff09; 1、http://www.census.gov/ 美国统计局&#xff08;统计调查局或普查局&#xff09;官方网站 The Census Bureau Web Site provides on-line access to our …

leetcode练习一:数组(二分查找、双指针、滑动窗口)

文章目录一、 数组理论基础二、 二分查找2.1 解题思路2.2 练习题2.2.1 二分查找(题704)2.2.2 搜索插入位置&#xff08;题35&#xff09;2.2.3 查找排序数组元素起止位置&#xff08;题34&#xff09;2.2.4 有效的完全平方数&#xff08;题367&#xff09;2.2.5 x 的平方根&…