Java——IO流

一,IO流常识

Ⅰ,IO流的概述

1,IO流用来处理设备之间的数据传输

2,Java对数据的操作都是通过流的方式

3,Java用于操作流的类都在IO包中

4,流 按流向分为:

①输入流
②输出流

5,流 按操作类型分为:

①字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节存储的
②字符流:字符流只能操作纯字符数据,比较方便

Ⅱ,IO流常用父类

1,字节流的抽象父类(抽象类不能直接new对象)

InputStream
OutputStream

2,字符流的抽象父类(抽象类不能直接new对象)

reader 返回值是int而不是byte
writer

Ⅲ,IO程序书写

使用前,导入IO包中的类
使用时,进行IO异常处理
使用后,释放资源

二,IO流——字节流(FileIntputStream)

read() :(demo1) 一次读取一个字节;

(demo2)当所读取的文件全部读取完成之后,会返回-1。

这里写图片描述

package com.wsq.stream;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Demo1_FileInputStream {public static void main(String[] args) throws IOException {demo1();    //从硬盘上(xxx.txt)一个一个读取字节,然后输出                                            demo2();    //通过while循环进行输出}private static void demo2() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("xxx.txt");   //创建流对象int b;while((b = fis.read())!= -1){System.out.println(b);}fis.close();                                            //关流释放资源}private static void demo1() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("xxx.txt");       //创建流对象,开流int x  = fis.read();                                        //从硬盘上读取一个字节System.out.println(x);int y  = fis.read();                                        //从硬盘上读取一个字节System.out.println(y);int z  = fis.read();                                        //从硬盘上读取一个字节System.out.println(z);fis.close();                                                //关流释放资源}   }

demo1
输出形式:
97
98
99

demo2
输出形式:
97
98
99

三,IO流——字节流(FileOutputStream)

write() : (demo1)一次写出一个字节;

(demo2)若想实现数据的追加

package com.wsq.stream;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo2_FileOutputStream {public static void main(String[] args) throws IOException  {demo1();//如果有文件yyy.txt则会在该文件输入  abc ;若没有该文件,则系统会先创建,然后在输入  abc  到该文件内;demo2();//yy.txt文件会续写上 d}private static void demo2() throws FileNotFoundException, IOException {FileOutputStream fos = new FileOutputStream("yyy.txt",true);    //如果想续写就在第二个参数传true即可;应用于QQ聊天记录的续写fos.write(100);fos.close();                                                    //关流}private static void demo1() throws FileNotFoundException, IOException {FileOutputStream fos = new FileOutputStream("yyy.txt"); //创建字节输出流对象,如果没有就自动创建一个fos.write(97);                                          //虽然写出的是一个int数,但是到文件上的是一个字节,系统会自动去除前三个8位fos.write(98);fos.write(99);fos.close();                                            //关流}}

四,IO流——拷贝

这里写图片描述

package com.wsq.stream;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo3_Copy {public static void main(String[] args) throws IOException {demo1();}private static void demo1() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("思You.jpg");      //创建输入流对象,关联  思You.jpgFileOutputStream fos = new FileOutputStream("yy.jpg");      //创建输出流对象,关联 copy.jpgint b;while((b = fis.read()) != -1 ){fos.write(b);}fis.close();    //关流,释放资源fos.close();    //关流,释放资源}}

程序运行之后,会将原有的 思You.jpg 原样复制一份,名称为 yy.jpg。

四,IO流——字节数组拷贝,定义小数组

(demo2)write (byte [] b,int off, int len)将指定byte数组中从偏移量off开始的len个字节写入此文件输出流

b:数据
off:数据中的起始偏移量
len:要写入的字节数

package com.wsq.stream;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo4_ArrayCopy {public static void main(String[] args) throws IOException {demo1();demo2();FileInputStream fis = new FileInputStream("xxx.txt");FileOutputStream fos = new FileOutputStream("yyy.txt");byte [] arr = new byte[1024 * 8];               //一般定义字节数组都是1024的整数倍int len;while((len = fis.read(arr)) != -1){             //如果忘记加arr。返回的就不是读取的字节个数,而是字节的码表值fos.write(arr,0,len);}fis.close();                                    //关流,释放资源fos.close();                                    //关流,释放资源}private static void demo2() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("xxx.txt");FileOutputStream fos = new FileOutputStream("yyy.txt");byte [] arr = new byte[2];int len;while((len = fis.read(arr)) != -1){fos.write(arr,0,len);}fis.close();                                    //关流,释放资源fos.close();                                    //关流,释放资源}private static void demo1() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("xxx.txt");byte [] arr = new byte[2];      //定义字节数组为2个字节int a = fis.read(arr);          //将文件上的字节读取到字节数组中,文件xxx.txt上有3个字节abcSystem.out.println(a);          //读到的有效字节个数for (byte b : arr) {            //第一次获取到文件上的a和bSystem.out.println(b);}System.out.println("——————————————————————————————————————————————————————————————————");int c = fis.read(arr);          //若有有效字节个数,就返回有效的字节个数;若没有的话,就返回-1;System.out.println(c);          //每次读取2个,由于有3个字节,所以读取一次之后还会剩余1个,故返回1;for (byte b : arr) {System.out.println(b);      //每次读取2个字节,ab读取,然后再次读取c,c将a给掩盖,会剩下cb,然后输出;}fis.close();}}

demo1运行输出结果:
这里写图片描述
demo2运行输出结果:
xxx.txt 里面的内容给拷贝到 yyy.txt 文件里面。

五,IO流——BufferedInputStream跟BufferedOutputStream拷贝

package com.wsq.stream;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo5_BufferCopy {
/*** close()方法* 具备刷新的功能,在关闭流之前,就会先刷新一次缓冲区,将缓冲区的字节全都刷到文件上,再关闭,close方法刷完之后就不能写了* * flush()方法* 具备刷新的功能,刷完之后还可以继续写* */public static void main(String[] args) throws IOException {//demo1();//flush和close方法的区别BufferedInputStream bis = new BufferedInputStream(new FileInputStream("xxx.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("wsq.txt"));int b;while((b = bis.read()) != -1){bos.write(b);bos.flush();}//      bis.close();
//      bos.close();}private static void demo1() throws FileNotFoundException, IOException {FileInputStream fis  = new FileInputStream("xxx.txt");      //创建输入流对象,关联  xxx.txtFileOutputStream fos  = new FileOutputStream("copy.txt");   //创建输出流对象,关联  copy.txtBufferedInputStream bis = new BufferedInputStream(fis);     //创建缓冲区对象,对输入流fis进行包装,让其变得更加强大BufferedOutputStream bos = new BufferedOutputStream(fos);   //创建缓冲区对象,对输出流fos进行包装,让其变得更加强大int b;while((b = bis.read()) != -1){bos.write(b);}bis.close();bos.close();}}

六,IO流——录入数据拷贝到文件

问题:将键盘录入的语句拷贝到当前项目下的xxx.txt文件中,键盘录入数据当遇到quit时就退出

分析:
1,创建键盘录入对象
2,创建输出流对象,关联xxx.txt文件
3,定义无限循环
4,遇到quit退出循环
5,如果不quit,就将内容写出
6,关闭流

package com.wsq.lianxi;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Test3 {public static void main(String[] args) throws IOException {//1,创建键盘录入对象Scanner  wsq = new Scanner(System.in);//2,创建输出流对象,关联xxx.txt文件FileOutputStream fos = new FileOutputStream("xxx.txt");System.out.println("请输入数据:");//3,定义无限循环  while(true){String line = wsq.nextLine();//4,遇到quit退出循环if("quit".equals(line)){break;}//5,如果不quit,就将内容写出fos.write(line.getBytes());         //字符串写出必须转换成字节数组fos.write("\r\n".getBytes());       //输出一个   换行  }//6,关闭流fos.close();//关流}}

七,IO流——字符流(FileReader)

问题:将xxx.txt文件内的内容给读取出来

package com.yy.chario;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class Demo1_FileReader {public static void main(String[] args) throws IOException {demo1();  //只读取一个字符demo2();  //通过while循环,将xxx.txt文件内的所有内容都读取出来}private static void demo2() throws FileNotFoundException, IOException {FileReader yy = new FileReader("xxx.txt");int y;while((y = yy.read()) != -1){               //通过项目默认的码表(GBK)一次读取一个字符 System.out.print((char)y);向下转型,将int强制转换成char}yy.close();}private static void demo1() throws FileNotFoundException, IOException {FileReader  wsq = new FileReader("xxx.txt");int x = wsq.read();System.out.println(x);char s = (char) x ;//向下转型,将int强制转换成charSystem.out.println(s);wsq.close();}}

八,IO流——字符流(FileWriter)

问题:将字符串和单个字符写到wsq.txt文件内

如果没有wsq.txt这个文件,系统会自动创建出来该文件

package com.yy.chario;import java.io.FileWriter;
import java.io.IOException;public class Demo2_FileWriter {public static void main(String[] args) throws IOException {FileWriter wsq = new FileWriter("wsq.txt");wsq.write("原谅我这一生不羁放纵爱自由。");//可以直接写 字符串wsq.write(29579);                     //也可以写 单个字符wsq.write(24605);wsq.write(29738);wsq.close();}}

九,IO流——字符流的拷贝

问题:将qqq.txt文件(已创建)内容拷贝到www.txt文件里(如果没有创建,系统会自动生成该文件)。

package com.yy.chario;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Demo3_Copy {public static void main(String[] args) throws IOException {FileReader yy = new FileReader("qqq.txt");//qqq.txt这个文件必须存在FileWriter wsq= new FileWriter("www.txt");//www.txt这个文件会自动生成int y ;while((y = yy.read()) != -1){wsq.write(y);}yy.close();wsq.close();  //Writer类中有一个2K的小缓冲区,如果不关流,就会将内容写到缓冲区里,关流会将缓冲区内容刷新,再关闭}}

十,IO流——字节流与字符流的不同用处

字节流:

①字节输入,字节输出,只是对字节的一种搬运
②如果进行只写的时候,必须将字节转换成字节数组才能写出去

字符流:

①字符流也可以拷贝文件,但不推荐使用;因为,读取时,会把字节转为字符(通过GBK码表转换),写出时,会将字符转回字。
②程序需要读取一段文本,或者需要写出一段文本的时候可以使用字符流
也就是只读或者只写的情况下使用字符流,字符流是通过码表进行读写的,整个字符整个字符进读写的
③读取的时候是按照字符的大小读取的不会出现半个中文;写出的时候可以直接将字符串写出,不用转换为字节数组
④不可以拷贝非纯文本的文件;因为在读的时候会将字节转换成字符,在转换过程中,就会用?替代,写出的时候会将字符转换成字节写出去;如果是?,直接写出,这样写出之后的文件就会乱,看不了了。

十一,IO流——字符流拷贝的不同形式

demo1():将qqq.txt这个文件上的内容,拷贝到www.txt这个文件上
demo2():字节流不可以拷非文本的文件;运行结束之后,我们会发现,所拷贝之后的 王思琪.jpg 无法打开
demo3():自定义字符数组的拷贝
demo4():带缓冲区的字符流拷贝

package com.yy.chario;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Demo3_Copy {public static void main(String[] args) throws IOException {
//      demo1();  将qqq.txt这个文件上的内容,拷贝到www.txt这个文件上
//      demo2();  字节流不可以拷   文本的文件;运行结束之后,我们会发现,所拷贝之后的 王思琪.jpg 无法打开
//      demo3();  自定义字符数组的拷贝
//      demo4();  带缓冲区的字符流拷贝        }private static void demo4() throws FileNotFoundException, IOException {BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("zzz.txt"));//若有zzz.txt该文件,系统会将该文件的原有内容给清空掉,然后在去拷贝;若该文件不存在,则系统会先创建,再拷贝;int c;while((c = br.read()) != -1){           //读取xxx.txt文件里面的内容,读取到缓冲区里面bw.write(c);                        //将读取到缓冲区(大小为8192=1024*8,16K)的内容给写出去}   br.close();bw.close();}private static void demo3() throws FileNotFoundException, IOException {FileReader fr = new FileReader("www.txt");//www.txt必须事先创建好FileWriter fw = new FileWriter("sss.txt");//sss.txt有没有无所谓,若没有,系统会自动创建,然后将www.txt上的内容给拷贝到该文件上char [] arr = new char[ 1024* 8 ];        //自定义一个字符数组int len;                                    while((len = fr.read(arr)) != -1){        //将文件上的数据读取到字符数组中fw.write(arr,0,len);                  //将字符数组中的数据写到文件上}fr.close();fw.close();}private static void demo2() throws FileNotFoundException, IOException {FileReader yy = new FileReader("思You.jpg");//添加一个字节文件(思You.jpg),用一个字符流去读取一个字节文件(思You.jpg)FileWriter wsq= new FileWriter("王思琪.jpg");//拷贝到  王思琪.jpg  时,该文件损坏       int y ;while((y = yy.read()) != -1){               //进行循环,读取思You.jpgwsq.write(y);                           //拷贝到 王思琪.jpg上}yy.close();wsq.close();  //Writer类中有一个2K的小缓冲区,如果不关流,就会将内容写到缓冲区里,关流会将缓冲区内容刷新,再关闭}private static void demo1() throws FileNotFoundException, IOException {FileReader yy = new FileReader("qqq.txt");//qqq.txt这个文件必须存在FileWriter wsq= new FileWriter("www.txt");//www.txt这个文件会自动生成int y ;while((y = yy.read()) != -1){             //进行循环,读取qqq.txt文本上的内容wsq.write(y);                         //拷贝到www.txt文本上}yy.close();wsq.close();  //Writer类中有一个2K的小缓冲区,如果不关流,就会将内容写到缓冲区里;如果关流,就会将缓冲区内容刷新,再关闭}}

十二,IO流——带缓冲区Buffered的换行两种方法

带缓冲区Buffered的换行:也就是,若文本有换行,读取的时候也会进行换行。

带缓冲区的特殊方法:
  • readLine();属于 BufferedReader
  • newLine(); 属于 BufferedWriter
newLine() 与 \r\n 的区别
  • newLine()是跨平台的方法
  • 而 \r\n只支持的是Windows系统
package com.yy.chario;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Demo4_Buffered {public static void main(String[] args) throws IOException {demo1();//readLine();demo2();//newLine();}private static void demo2() throws FileNotFoundException, IOException {BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("xxx.txt"));String line;while((line = br.readLine()) != null){bw.write(line);                                         //写出回车换行符bw.newLine();                                           //bw.write("\r\n");                                     //跟这个bw.newLine()方法效果一样}   br.close();bw.close();
}private static void demo1() throws FileNotFoundException, IOException {/*   public String readLine()  读取一个文本行,通过下列字符之一即可认为某行已终止,换行('\n')、回车('\r')或者回车后直接跟着换行返回:包含该行内容的字符串,不包含任何行终止符,如果已达到流末尾,则返回null*/BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));//将zzz.txt文件里面的内容给输出到Buffered缓冲区内String line;while((line = br.readLine()) != null){System.out.print(line);                                        //从控制台输出出来}br.close();
}}

十三,IO流——字符流-文本反转

案例:

将一个文本文档的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换

分析:
  • 1,创建输入输出流对象
  • 2,创建集合对象
  • 3,将读到的数据存储在集合中
  • 4,倒着遍历集合,将数据写到文件上
  • 5,关流
package com.wsq.test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;public class Test1 {public static void main(String[] args) throws IOException {demo1();                            //正常步骤demo2();                            //改进之后}private static void demo2() throws FileNotFoundException, IOException {/*** 注意事项,流对象,早开晚关,什么时候用到什么时候开,用完之后就关掉* 改进之后:* */BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));ArrayList<String> list = new ArrayList<>();String line;while((line = br.readLine()) != null){list.add(line);}br.close();BufferedWriter bw = new BufferedWriter(new FileWriter("likewsq.txt"));for(int i = list.size() - 1 ; i>=0 ; i--){bw.write(list.get(i));                      //把数据给写出去bw.newLine();                               //换行}bw.close();}private static void demo1() throws FileNotFoundException, IOException {//1,创建输入输出流对象BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("likewsq.txt"));//2,创建集合对象ArrayList<String> list = new ArrayList<>();//3,将读到的数据存储在集合中String line;while((line = br.readLine()) != null){list.add(line);}//4,倒着遍历集合,将数据写到文件上for(int i = list.size() - 1 ; i>=0 ; i--){bw.write(list.get(i));                      //把数据给写出去bw.newLine();                               //换行}//5,关流br.close();bw.close();}}

十四,IO流——字符流-LineNumberReader

public class LineNumberReader extends BufferedReader

跟踪行号的缓冲字符输入流。

此类定义了方法getLineNumber(int)和getLineNumber(),它们可分别用于设置和获取当前行号。
默认情况下,行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用 setLineNumber(int) 更改行号。但要注意的是,setLineNumber(int) 不会实际更改流中的当前位置;它只更改将由 getLineNumber() 返回的值。
可认为行在遇到以下符号之一时结束:换行符(’\n’)、回车符(’\r’)、回车后紧跟换行符。

package com.yy.chario;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;public class Demo5_LineNumberReader {public static void main(String[] args) throws IOException {LineNumberReader wsq = new LineNumberReader(new FileReader("xxx.txt"));String line;wsq.setLineNumber(100);//设置当前行号,若为100,这xxx.txt文件内容从行号从101开始while((line = wsq.readLine()) != null){System.out.println(wsq.getLineNumber() + " "+line);//获得当前行号}wsq.close();}}

十五,IO流——装饰设计模式

package com.yy.chario;public class Demo6_Wrap {
/*** 装饰设计模式的好处:* 耦合性不强,被装饰的类的变化,与装饰类的变化无关* 如果是继承的话,耦合性太强* */public static void main(String[] args) {HeiMaStudent wsq = new HeiMaStudent(new Student());wsq.Coder();}}interface Coder{public void Coder();
}class Student implements Coder{@Overridepublic void Coder() {System.out.println("javase");System.out.println("javaweb");}
}
class HeiMaStudent implements Coder{//1,获取被装饰类的引用private Student wsq;                        //获取学生引用,通过构造方法//2,在构造方法中传入被装饰类的对象public HeiMaStudent (Student s){this.wsq = wsq;}//3,对原有的功能进行升级@Overridepublic void Coder() {wsq.Coder();System.out.println("ssh");System.out.println("数据库");System.out.println("大数据");System.out.println("......");}
}

十六,IO流——用指定的码表读写字符

将utf_8.txt文件上(该文件存在)的内容(UTF-8编码)拷贝到gbk.txt文件(该文件存在与否都可以)上(GBK码表)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;public class Demo7_TransIO {public static void main(String[] args) throws IOException {demo1();demo2();demo3();    }private static void demo3() throws UnsupportedEncodingException, FileNotFoundException, IOException {BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("utf_8.txt"),"utf_8"));//更高效的读BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk"));  //更高效的写int wsq;while((wsq = br.read()) != -1){bw.write(wsq);}br.close();bw.close();}private static void demo2() throws UnsupportedEncodingException, FileNotFoundException, IOException {InputStreamReader yy = new InputStreamReader(new FileInputStream("utf_8.txt"),"utf-8");//字节流通向字符流的桥梁,用指定码表读字符OutputStreamWriter wsq = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk");//字符流通向字节流的桥梁,用指定码表写字符int c;while((c = yy.read()) != -1){wsq.write(c);}yy.close();wsq.close();}private static void demo1() throws FileNotFoundException, IOException {//用默认编码表读写,出现乱码FileReader fr = new FileReader("utf_8.txt");FileWriter fw = new FileWriter("gbk.txt");int wsq;while((wsq = fr.read()) != -1){fw.write(wsq);}fr.close();fw.close();}}

十七,IO流——获取文本上的字符出现的次数

案例:

获取xxx.txt(该文本已创建,并且有内容)文本上每个字符出现的次数,将结果写在wsq.txt上

  • 获取一个文本上每个字符出现的次数,将结果写在wsq.txt上
    • 分析:
    • 1,创建带缓冲的输入流对象
    • 2,创建双列集合对象TreeMap
    • 3,将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将改建和值加1存储
    • 4,关闭输入流
    • 5,创建输出流对象
    • 6,遍历集合,将集合中的内容写到wsq.txt中
    • 7,关闭输出流
package com.wsq.test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.TreeMap;public class Test3 {public static void main(String[] args) throws IOException {//1,创建带缓冲的输入流对象BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));//2,创建双列集合对象TreeMapTreeMap<Character, Integer> yy = new TreeMap<>();//3,将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将改建和值加1存储int qq;while((qq = br.read()) != -1){char y = (char) qq;                     //强制类型转换/*if(!yy.containsKey(y)){               //判断是否包含这个键yy.put(y, 1);                       //如果不包含就将键和值为1添加进来}else{yy.put(y,yy.get(y) + 1);}*/yy.put(y, !yy.containsKey(y) ? 1 : yy.get(y) + 1 );}//4,关闭输入流br.close();//5,创建输出流对象BufferedWriter  bw = new BufferedWriter(new FileWriter("wsq.txt"));//6,遍历集合,将集合中的内容写到wsq.txt中for(Character key : yy.keySet()){switch (key) {case '\t':bw.write("\\t" + "=" + yy.get(key));break;case '\n':bw.write("\\n" + "=" + yy.get(key));break;case '\r':bw.write("\\r" + "=" + yy.get(key));break;default:break;}bw.write (key + "=" + yy.get(key));bw.newLine();}//7,关闭输出流bw.close();}}

十八,IO流——测试版软件

当我们下载一个试用版软件,没有购买正版的时候,每执行一次就会提醒我们还有多少次使用机会,用所学过的IO流知识,模拟试用版软件
使用10次机会,执行一次就提示一次您还有几次机会,如果次数到了,提示购买正版
分析:
1,创造带缓冲的输入流对象,因为要使用readLine方法,可以保证数据的原样性
2,将读到的字符串转换为int数
3,对int数进行判断,如果大于0,就将其–写回去,如果不大于0,就提示请购买正版
4,在if判断中要将–的结果打印,并将结果通过输出流写到文件上

package com.wsq.test;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Test4 {public static void main(String[] args) throws IOException {//1,创造带缓冲的输入流对象,因为要使用readLine方法,可以保证数据的原样性BufferedReader br = new BufferedReader(new FileReader("config.txt"));//2,将读到的字符串转换为int数String line = br.readLine();//System.out.println(line);int times = Integer.parseInt(line);         //将数字字符串转换为数字//3,对int数进行判断,如果大于0,就将其--写回去,如果不大于0,就提示请购买正版if(times > 0){//4,在if判断中要将--的结果打印,并将结果通过输出流写到文件上System.out.println("您还有" + times-- +"次机会");FileWriter fw = new FileWriter("config.txt");fw.write(times + "");fw.close();}else{System.out.println("您的试用次数已到,请购买正版");}br.close();//关闭流}}

十九,IO流——递归

案例:从键盘输入接收一个文件件路径,打印出该文件夹下所有的.java文件名
  • 分析:

    • 从键盘接收一个文件夹路径
    • 1,如果录入文件夹的是不存在,给予提示
    • 2,如果录入的是文件路径,给予提示
    • 3,如果是文件夹路径,直接返回

    打印出该文件夹路径下的所有的.java文件名

    • 1,获取到该文件夹路径下的所以的文件和文件夹,存储在File数组中
    • 2,遍历数组,对每一个文件或文件夹做判断
    • 3,如果是文件,并且后缀是.java的,就打印
    • 4,如果是文件夹,就递归调用
package com.wsq.test;import java.io.File;
import java.util.Scanner;public class Test5 {public static void main(String[] args) {File dir = getDir();                 //获取文件夹路径printJavaFile(dir);}/*** 获取键盘录入的文件夹路径* 1,返回值类型File,因为是返回的是文件夹* 2,不需要有参数* */public static File getDir(){             //获取文件夹路径Scanner wsq = new Scanner(System.in);//创建键盘录入对象System.out.println("请输入一个文件夹路径");while(true){String line = wsq.nextLine();    //将键盘录入的文件路径存储File dir = new File(line);       //封装成File对象if(!dir.exists()){               //如果录入的文件路径不存在System.out.println("您录入的文件夹路径不存在,请重新录入");}else if(dir.isFile()){          //如果录入 的是文件路径System.out.println("您录入的是文件路径,请重新录入文件夹路径");}else{return dir;}}}/*** 获取文件夹路径下的所有.java文件* 1,返回值类型void* 2,参数列表File dir* * */public static void printJavaFile(File dir){//1,获取到该文件夹路径下的所以的文件和文件夹,存储在File数组中File [] subFiles = dir.listFiles(); //2,遍历数组,对每一个文件或文件夹做判断for (File subFile : subFiles) {//3,如果是文件,并且后缀是.java的,就打印if(subFile.isFile() && subFile.getName().endsWith(".java")){System.out.println(subFile);//4,如果是文件夹,就递归调用}else if(subFile.isDirectory()){printJavaFile(subFile);}}}
}

二十,IO流——序列流


package com.yy.otherio;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;public class Demo1_SequenceInputStream {public static void main(String[] args) throws IOException {demo1();demo2();demo3();}private static void demo3() throws FileNotFoundException, IOException {FileInputStream fis1 = new FileInputStream("a.txt");FileInputStream fis2 = new FileInputStream("b.txt");FileInputStream fis3 = new FileInputStream("c.txt");Vector<FileInputStream> v = new Vector<>();                     //创建集合对象v.add(fis1);                                                    //将流对象存储进来v.add(fis2);v.add(fis3);Enumeration<FileInputStream> en = v.elements();         SequenceInputStream sis = new SequenceInputStream(en);          //将枚举中的输入流整合成一个 FileOutputStream fos = new FileOutputStream("d.txt");           int sole;while((sole = sis.read()) != -1){fos.write(sole);}sis.close();fos.close();}private static void demo2() throws FileNotFoundException, IOException {FileInputStream fis1 = new FileInputStream("a.txt");FileInputStream fis2 = new FileInputStream("b.txt");SequenceInputStream sis = new SequenceInputStream(fis2,fis1);FileOutputStream fos = new FileOutputStream("c.txt"); int yy;while((yy = sis.read()) != -1){fos.write(yy);}sis.close();                    //sis在关闭的时候,会将构造方法中传入的流对象也都关闭fos.close();}private static void demo1() throws FileNotFoundException, IOException {FileInputStream fis1 = new FileInputStream("a.txt");        //创建字节输入流,关联a.txtFileOutputStream fos = new FileOutputStream("c.txt");       //创建字节输出流,关联c.txtint wsq;while((wsq = fis1.read()) != -1){                           //不断的在a.txt上读取字节fos.write(wsq);                                         //将读到的字节写到c.txt上}fis1.close();                                               //关闭字节输入流FileInputStream fis2 = new FileInputStream("b.txt");int yy;while((yy = fis2.read()) != -1){fos.write(yy);}fis2.close();fos.close();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JBE、JNBE、JA、JL指令详解(从原理上)

JBE 当执行到JBE命令时&#xff0c;如果此时的CF标志位或者ZF标志位为1&#xff0c;跳转&#xff0c;其他不跳转 相当于小于等于命令 cmp eax&#xff0c;ecx jbe 0040100c执行到cmp命令时&#xff0c;如果此时的eac小于等于ecx&#xff0c;jbe都会跳转到0040100c 因为小于的…

数组shift方法_数组shift()方法以及JavaScript中的示例

数组shift方法JavaScript shift()方法 (JavaScript shift() method) shift() method is used to remove the first element of an array and returns the deleted element. shift()方法用于删除数组的第一个元素&#xff0c;并返回删除的元素。 It changes the array length. …

ArcMap 9使用技巧

ArcMap 9使用技巧技巧1 重叠要素的选择切换目标&#xff1a;在覆盖同一区域的多个要素中切换被选择要素操作步骤&#xff1a;1&#xff0e;在编辑环境中选中覆盖同一区域的多个要素中的一个要素2&#xff0e;按下N 键&#xff0c;被选要素就会自动地切换到另一个图层的要素3&am…

《软件》2011年第6期刊登出 《DB 查询分析器》中断SQL语句的执行

《软件》编辑部寄来了2011年第6期样刊&#xff0c;在2011年第6期&#xff0c;刊登出了本人的论文------“《DB 查询分析器》中断SQL语句的执行”。 论文刊登在第42页&#xff0c;排在第13篇&#xff0c;还比较靠前&#xff0c;呵呵。 在“万方数据”和“中国期刊全文数据库”中…

Java——IO流(序列流)

序列化与反序列化 游戏存档&#xff1a;目的是为了游戏下次上号数据的保存 package com.yy.otherio;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; im…

ret2libc过地址随机化

程序&#xff1a; #include<stdio.h> char buf2[10] "this is buf2"; void vul() {char buf1[10];gets(buf1); } void main() {write(1,"sinxx",5);vul(); }很明显&#xff0c;gets函数存在溢出 编译&#xff1a; gcc -no-pie -fno-stack-protect…

[导入]Lucene并发访问

作者: yagesi 链接&#xff1a;http://yagesi.javaeye.com/blog/165604 发表时间: 2008年02月27日 声明&#xff1a;本文系JavaEye网站发布的原创博客文章&#xff0c;未经作者书面许可&#xff0c;严禁任何网站转载本文&#xff0c;否则必将追究法律责任&#xff01; 在Luce…

Python程序计算给定文本中单词的出现

Given a text (paragraph) and a word whose occurrence to be found in the text/paragraph, we have to find the how many times word is repeated in the text. 给定一个文本 (段落)&#xff0c;其出现在文本/段落被找到的单词 &#xff0c;我们必须找到如何词多次在文本重…

js私有共有成员

在小项目中对于JavaScript使用&#xff0c;只要写几个function就行了。但在大型项目中&#xff0c;尤其是在开发追求 良好的用户体验的网站中&#xff0c;如SNS,就会 用到大量的JavaScrpt&#xff0c;有时JavaScript的工作量胜过了C#&#xff0c;这时写一堆function,就会显得很…

Java——IO(打印流)

1&#xff0c;打印字节流(PrintStream)的概述&#xff1a; 打印流可以很方便的将对象的toString()结果输出并且自动加上换行&#xff0c;而且可以使用自动刷出的模式 System.out就是一个PrintStream&#xff0c;其默认向控制台输出信息 2&#xff0c;使用方式&#xff1a; …

MATLAB中的正态分布检验

要对一组样本进行正态性检验&#xff0c;在MATLAB中&#xff0c;一种方法是用normplot画出样本&#xff0c;如果都分布在一条直线上&#xff0c;则表明样本来自正态分布&#xff0c;否则是非正态分布。 MATLAB中也提供了几种更正式的检验方法&#xff1a;kstest Kolmogorov-Smi…

远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)

0x00 免杀能力一览表 几点说明&#xff1a; 1、表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家…

kotlin 或 运算_Kotlin程序对两个数字执行算术运算

kotlin 或 运算Here, we are implementing a Kotlin program to perform various arithmetic operations on two numbers. 在这里&#xff0c;我们正在实现Kotlin程序&#xff0c;以对两个数字执行各种算术运算 。 Given two numbers a and b, we have to find addition, sub…

2012.1.15---学习笔记

最近学习实践的内容主要有&#xff1a;1 memcahche的安装、使用&#xff08;为了减少数据库压力而采用的&#xff09;2 linux下的定时任务的配置&#xff0c;crontab3 如何去编写可配置的php程序&#xff08;加载配置文件&#xff09;1 memcahche的安装、使用&#xff08;为了减…

WPF界面设计技巧(2)—自定义漂亮的按钮样式

上次做了个很酷的不规则窗体&#xff0c;这次我们来弄点好看的按钮出来&#xff0c;此次将采用纯代码来设计按钮样式&#xff0c;不需要 Microsoft Expression Design 辅助了。 首先打开 Microsoft Visual Studio 2008 &#xff0c;新建一个WPF项目&#xff0c;在上面随便放几个…

ropgadgets与ret2syscall技术原理

程序&#xff1a; #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <sys/syscall.h> void exploit() { system("/bin/sh"); } void func() { char str[0x20]; read(0,str,0x50); } int…

uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

按各地址起作用的顺序&#xff0c;uboot引导linux内核启动涉及到以下地址&#xff1a; load address&#xff1a;entry point&#xff1a; 这两个地址是mkimage时指定的bootm address&#xff1a;bootm为uboot的一个命令&#xff0c;以此从address启动kernelkernel运行地址&…

Java——集合(Map集合的两种迭代)

一&#xff0c;Map集合的第一种迭代 Map集合的第一种迭代&#xff0c;通过get(key)方法&#xff0c;根据键去获取值 package com.wsq.map;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Demo2_Iterator { …

如何使用两个堆栈实现队列_使用两个队列实现堆栈

如何使用两个堆栈实现队列Stack and Queue at a glance... 堆叠和排队一目了然... Stack: 堆栈&#xff1a; The stack is an ordered list where insertion and deletion are done from the same end, top. The last element that entered first is the first one to be del…

接口pk抽象类

作为开发者&#xff0c;谁从来没有陷入过周而复始地争论应该是使用接口还是抽象类&#xff1f;这是一场永无休止的争论&#xff0c;不同阵营的人总是坚定地坚持自己的立场。应当使用接口还是抽象类&#xff1f;对于初学者来说那更是满头雾水。这个问题应该考虑一下几个因素&…