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,一经查实,立即删除!

相关文章

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

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

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…

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

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

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…

PHP中单引号和双引号的区别

0x01 单引号 单引号里面的内容不会被解释&#xff0c;不管什么内容&#xff0c;都当做字符串处理 <?php$abc1234; $stradc$abc; echo $str;输出 0x02 双引号 双引号里面的内容会被解释&#xff0c;像一些换行&#xff08;\n)、数据元素等都会被解释 <?php$abc1234;…

关闭页面时执行“退出”的解决方案

在有些应用中我们需要实时的更新站点用户是否在线的状态。比如一些论坛里的在线成员实时显示&#xff0c;或基于网页的聊天、会议系统等。这种情况下&#xff0c;如果用户点击“退出”按钮或链接&#xff0c;我们将之行一系列后台操作&#xff0c;将该用户标识成off line状态&a…

python网络编程---TCP客户端

0x01 环境 python2、 pycharm 0x02 程序 # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com tarfet_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 连接客户端 clien…

python网络编程---TCP服务器

0x01 环境 python2 pycharm 0x02 程序 客户端程序&#xff1a; # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com target_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STRE…

sys.argv和getopt

0x01 sys.argv sys.argv用来读取命令行参数&#xff0c;保存程序的文件名和命令参数&#xff0c;读入的参数以列表保存 import sysprint sys.argv print type(sys.argv)可以看到&#xff0c;sys.argv把空格当成分隔符&#xff0c;空格两边的值当做sys.argv的一个元素&#xf…

[导入]《大话设计模式》重印公告

摘要: 《大话设计模式》12月中旬上市&#xff0c;至2008年1月底仅仅一个多月&#xff0c;5000册即销售一空&#xff0c;清华大学出版社已经开始重印&#xff0c;也就是说很快可以在二月底或三月初看到新印刷修正过大部分错误的《大话设计模式》。 阅读全文[新闻]《人民日报市场…

hdu1053 Entropy hdu2527 Safe Or Unsafe

裸裸的哈弗曼编码&#xff0c;求出哈弗曼编码的路径长度&#xff0c;注意整个字符串为一种字符的情况 View Code #include<iostream>#include<queue>#include<algorithm>#include<vector>using namespace std;struct node{int u,w; node(int a0,in…

sys.stdin.read和raw_input函数

sys.stdin.read函数 例子&#xff1a; import sysreadsys.stdin.read() for i in range(len(read)):print i,read[i],-1运行&#xff0c;当执行到readsys.stdin.read()会阻塞&#xff0c;等待我们输入 我们输入&#xff1a; h e当输入&#xff0c;ctrlD结束输入&#xff0c…

利用带关联子查询Update语句更新数据

Update是T-sql中再简单不过的语句了&#xff0c;update table set columnexpression [where condition]&#xff0c;我们都会用到。但update的用法不仅于此&#xff0c;真正在开发的时候&#xff0c;灵活恰当地使用update可以达到事半功倍的效果。 假定有表Table1&#xff08;…

web安全----XSS漏洞之基本原理

0x01 概述 XSS为跨站脚本攻击&#xff0c;XSS攻击针对的是用户层面的攻击&#xff01;类型有反射型XSS、存储型XSS、DOM型XSS&#xff0c;这里的DOM可以理解为页面&#xff0c;或者是所有的标签、内容之和 0x02 反射型XSS 反射型XSS攻击流程为&#xff1a; 即&#xff1a; …

web安全----xss工具使用3

XSSer 0x01 安装 环境&#xff1a;kali、python3&#xff08;必须是python3&#xff0c;kali默认为python2&#xff09; 安装步骤&#xff1a; git clone https://github.com/epsylon/xsser.git cd xsser sudo python3 setup.py install 使用命令&#xff1a; xsser -h查看…

web安全---XSS利用平台BLUE-LOTUS安装与使用

0x01 安装 环境&#xff1a;windows、phpstudy 下载地址&#xff1a;https://gitee.com/gid1314/BlueLotus_XSSReceiver-master 下载后将文件解压&#xff0c;重命名为blue&#xff0c;放在www目录下 访问&#xff1a;http://IP/blue 点击安装 这里只需要修改后台登陆密码和…

使用delphi 开发多层应用(十)安全访问服务器

前面讲了如何建立和访问服务器,但是前面建的服务器都没有安全控制&#xff0c;这里有很大的安全问题,第一是任何人做一个客户端都可以都可以访问 服务器。第二是数据在网络传输过程中都是明码的&#xff0c;没有加密&#xff0c;使用网络侦听器就可以检测到传输的内容。这是一个…

web安全---浏览器解析提交数据的过程

解码规则 html解析器对html文档进行解析&#xff0c;完成解析并创建DOM树JavaScript或者CSS解析器对内联脚本进行解析&#xff0c;完成js、css解码url解码会根据url所在的顺序不同而在JS解码或者解码后 解码顺序 html解析第一步执行&#xff0c;而JS解析和URL解析则要根据情…

利用POI创建OpenOffice中的Excel文件

之所以称为OpenOffice的Excel文件,我发现了一个特点就是: 一些网站严格限定了文件必须为MS的Excel格式的话,用POI的HSSF创建的Excel就会不识别.不知道是什么原因,可能是版本的问题,据说HSSF(令人讨厌的电子表格格式)生成的是MS97的格式.但是97-2003的提示中明显的说明了MS的lib…