Java第十八天~第十九天/11.25~11.26
2017-11-30 17:16
127 查看
一、文件字节输入流
* 读数据的两种方式:** 1)public int read():一次读取一个字节
* 2)public int read(byte[] b):一次读取一个字节数组
* 返回的是实际读取的字节数,使用文件输入流一次读取一个字节数组
1、public int read():一次读取一个字节
package org.westos_字节文件输入输出流; import java.io.FileInputStream; import java.io.IOException; /** * 文件的字节输入流 * public FileInputStream(String name) * @author 小鑫 */ public class FileInputStreamDemo { public static void main(String[] args) throws IOException { //创建文件输入流对象 FileInputStream fis = new FileInputStream("a.txt"); //1)public int read():一次读取一个字节 //模板代码 int by=0; while((by=fis.read())!=-1){ System.out.print((char)by); } //释放资源 fis.close(); } }
2、public int read(byte[] b):一次读取一个字节数组
package org.westos_字节文件输入输出流; import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamDemo2 { public static void main(String[] args) throws IOException { //封装数据源 FileInputStream fis = new FileInputStream("a.txt"); //2)public int read(byte[] b):一次读取一个字节数组 //模板代码 byte[] bys=new byte[1024]; int len=0; while((len=fis.read(bys))!=-1){ System.out.println(new String(bys, 0, len)); } //释放资源 fis.close(); } }
3、练习
package org.westos_字节文件输入输出流; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * E盘下有照片艾弗森.jpg文件,将他图片内容复制到当前项目下的答案.jpg * 分析: * 数据源--->E:\\艾弗森.jpg--->FileInputStream * 目的地--->答案.jpg--->FileOutputStream * @author 小鑫 * */ public class CopyDemo { public static void main(String[] args) throws IOException { //封装数据源 FileInputStream fis = new FileInputStream("E:\\艾弗森.jpg"); //封装目的地 FileOutputStream fos = new FileOutputStream("答案.jpg"); /*//读写操作 int by=0; while((by=fis.read())!=-1){ fos.write(by); }*/ byte[] bys=new byte[1024]; int len=0; while((len=fis.read(bys))!=-1){ fos.write(bys, 0, len); } //释放资源 fis.close(); fos.close(); } }
4、练习
package org.westos_字节文件输入输出流; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 需求:在当前项目下有一个:a.txt文件 * 将a.txt文件的内容赋值到b.txt文件中 * * 分析: * 1)数据源:a.txt------->FileInputStream:输入流------->读数据 * 2)目的地:b.txt------->FileOutputStream:输出流------>写数据 * @author 小鑫 * */ public class CopyFileDemo { public static void main(String[] args) throws IOException { //封装数据源 //创建一个文件字节流对象 FileInputStream fis = new FileInputStream("a.txt"); //带盘符文件 //FileInputStream fis = new FileInputStream("C:\\a.txt"); //封装目的地 //创建文件输出流对象 FileOutputStream fos = new FileOutputStream("b.txt"); //带盘符文件 //FileOutputStream fos = new FileOutputStream("D:\\b.txt"); /*//一次读取一个字节 int by=0; while((by=fis.read())!=-1){ fos.write(by); }*/ byte[] bys=new byte[1024]; int len=0; while((len=fis.read(bys))!=-1){ fos.write(bys, 0, len); } //释放资源 fis.close(); fos.close(); } }
二、字节缓冲流
1、为什么字节缓冲流不能直接针对文件进行操作呢?* 缓冲流只是提供一个缓冲区,针对IO进行实现数据的传输实际是通过底层基本流进行实现的,所以缓冲流不能直接对文件操作
2、flush()和close()方法的区别?
* flush():刷新缓冲区的流,强迫将缓冲字节都写到该流中,刷新之后是可以写数据的.
* close():关闭流对象所指向指向的这个资源文件,一旦关闭,写数据,写不进去的!
3、字节缓冲输出流
由于字节数组比一次读取一个字节更快,从而引出类更高效的一种流:
字节缓冲输出流:BufferedOutputStream
构造方式: public BufferedOutputStream(OutputStreamout):默认缓冲区大小(默认缓冲大小已经足够大了)
package org.westos_字节缓冲输入输出流; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class BufferedOutputStreamDemo { public static void main(String[] args) throws IOException { // 创建字节缓冲输出流对象 BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("bos.txt")); //写数据 bos.write(97); //刷新该缓冲区的流 bos.flush();//迫使将这写字节强制输出流中 bos.write(98); bos.close(); //bos.write(99); //bos.flush();//java.io.IOException: Stream Closed } }
4、字节缓冲输入流
字节缓冲输入流:BufferedInputStream
* 构造方法:
* BufferedInputStream(InputStream in) :指定默认缓冲区大小创建字节缓冲输入流对象
package org.westos_字节缓冲输入输出流; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; public class BufferedInputStreamDemo { public static void main(String[] args) throws IOException { //创建字节缓冲输入流对象 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt")); /*//一次读取一个字节 int by=0; while((by=bis.read())!=-1){ System.out.print((char)by); }*/ //一次读取一个字节数组 byte[] bys=new byte[1024]; int len=0; while((len=bis.read(bys))!=-1){ System.out.println(new String(bys, 0, len)); } //释放资源 bis.close(); } }
5、字节缓冲流复制视频
package org.westos_字节缓冲输入输出流; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 对于图片文件,音频文件,视频文件,优先采用字节缓冲输入流(高效流)一次读取一个字节数组! * 复制e:\\abc.mp4文件---->当前项目下的Copy.mp4文件 * @author 小鑫 * */ public class CopyFileDemo { public static void main(String[] args) throws IOException { //基本字节流一次读取一个字节 //method1("E:\\abc.mp4","Copy.mp4"); //基本字节流一次读取一个字节数组 //method2("E:\\abc.mp4","Copy.mp4"); //字节缓冲输入流(高效字节流)一次读取一个字节 //method3("E:\\abc.mp4","Copy.mp4"); //字节缓冲输入流一次读取一个字节数组 method4("E:\\abc.mp4","Copy.mp4"); } //字节缓冲输入流一次读取一个字节数组 private static void method4(String srcString, String destString) throws IOException { //封装数据源 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcString)); //封装目的地 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destString)); //字节缓冲输入流一次读取一个字节数组 byte[] bys=new byte[1024]; int len=0; while((len=bis.read(bys))!=-1){ bos.write(bys, 0, len); } //释放资源 bis.close(); bos.close(); } //字符缓冲输入流一次读取一个字节 private static void method3(String srcString, String destString) throws IOException { //封装数据源 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcString)); //封装目的地 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destString)); //字符缓冲输入流一次读取一个字节 int by=0; while((by=bis.read())!=-1){ bos.write(by); } //释放资源 bis.close(); bos.close(); } // 基本字节流一次读一个字节数组 private static void method2(String srcString, String destString) throws IOException { // 封装数据源 FileInputStream fis = new FileInputStream(srcString); // 封装目的地 FileOutputStream fos = new FileOutputStream(destString); // 基本字节流一次读一个字节数组 byte[] bys=new byte[1024]; int len=0; while((len=fis.read(bys))!=-1){ fos.write(bys, 0, len); } //释放资源 fis.close(); fos.close(); } //基本字节流一次读一个字节 private static void method1(String srcString, String destString) throws IOException { //封装数据源 FileInputStream fis = new FileInputStream(srcString); //封装目的地 FileOutputStream fos = new FileOutputStream(destS 18838 tring); //基本字节流一次读一个字节 int by=0; while((by=fis.read())!=-1){ fos.write(by); } //释放资源 fis.close(); fos.close(); } }
6、计算机如何识别中文
package org.westos_字节缓冲输入输出流; import java.util.Arrays; /** * 计算机是如何识别中文的? * 1)每个中文左边对应的字节一定是负数 * 2)GBK格式:右边的字节可以中正数,可以是0,可以是负数 * @author 小鑫 * */ public class StringDemo { public static void main(String[] args) { //定义一个字符串 String s1="abcde"; byte[] bys1 = s1.getBytes(); String s2="你好世界"; byte[] bys2 = s2.getBytes(); System.out.println(bys1);//[B@33a17727 System.out.println(Arrays.toString(bys1)); //[97, 98, 99, 100, 101] System.out.println(bys2);//[B@3654919e System.out.println(Arrays.toString(bys2)); //[-60, -29, -70, -61, -54, -64, -67, -25] } }
三、字符输出输入流
1、 字符输出流:Writer:是一个抽象类* 使用的是该抽象类的子类:OutputStreamWriter——>字符转换流:可以将字节输出流转换字符流
* public OutputStreamWriter(OutputStream out,Charset cs):创建一字符输出转换流对象,指定编码格式
* 字节输出流+编码格式—->字符输出流
package org.westos_字符输出输入流; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; /** * 编码格式:使用平台的默认编辑集进行编码:GBK , * public OutputStreamWriter(OutputStream out); * 打开记事本时,要保证记事本编码集格式与字符输出流编码集格式一致,否则乱码。 * @author 小鑫 * */ public class OutputStreamWriterDemo { public static void main(String[] args) throws IOException { //创建一个字符输出流对象 //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"), "GBK"); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"));//平台默认编码集为"GBK"格式 //写数据 osw.write("你好世界"); //释放资源 osw.close(); } }
2、字符输入流
package org.westos_字符输出输入流; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /** * 字符输入流:字节输入流+编码格式(默认GBK)--->解码 * public InputStreamReader(InputStream in,charset sc) ; * * @author 小鑫 * */ public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { // 创建字符输入流对象 InputStreamReader isr = new InputStreamReader(new FileInputStream( "osw.txt"), "GBK"); //一次读取一个字符 char[] ch=new char[1024]; int len=0; while((len=isr.read(ch))!=-1){ System.out.println(new String(ch, 0, len)); } //释放资源 isr.close(); } }
3、字符输出流写数据的方法
package org.westos_字符输出输入流; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; /** * 关于字符输出流写数据的方法: * public void write(int c):写单个字符 public void write(char[]cbuf):写一个字符数组 * public void write(char[] cbuf):写一个字符数组 * public abstract void write(char[] cbuf,int off,intlen):写入字符数组的一部分 * public void write(String str):写字符串 * public void write(Stringstr, int off,int len):写字符串的一部分 * @author 小鑫 * */ public class OutputStreamWriterDemo2 { public static void main(String[] args) throws IOException { // 创建字符输出流对象 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream( "osw.txt")); //public void write(int c):写单个字符 osw.write(97); osw.write('a'); //public void write(char[] cbuf):写一个字符数组 char[] chs={'a','b','c','d','e'}; osw.write(chs); //public abstract void write(char[] cbuf,int off,intlen):写入字符数组的一部分 osw.write(chs, 1, 3); //public void write(String str):写字符串 String str="你好世界"; osw.write(str); //public void write(String str, int off,int len):写字符串的一部分 osw.write(str, 0, 2); //刷新该流 osw.flush(); //释放资源 osw.close(); //osw.write('x');//已经关闭流,继续写入会报以下异常 //java.io.IOException: Stream closed } }
4、字符输入流读数据的方式
package org.westos_字符输出输入流; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /** * 字符输入流读数据的方式: public int read():一次读取一个字符 public int read(char[] * chs):一次读取一个字符数组 * * @author 小鑫 * */ public class InputStreamReaderDemo2 { public static void main(String[] args) throws IOException { // 创建字符输入流对象 InputStreamReader isr = new InputStreamReader(new FileInputStream( "osw.txt")); /*//一次读取一个字符 int ch=0; while((ch=isr.read())!=-1){ System.out.print((char)ch); } isr.close();*/ //一次读取一个字符数组 char[] chs=new char[1024]; int len=0; while((len=isr.read(chs))!=-1){ System.out.println(new String(chs, 0, len)); } //释放资源 isr.close(); } }
5、字符流的便捷类:FileWriter和FileReader
package org.westos_字符输出输入流; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 使用字符转化流进行操作数据的时候:字节流+编码格式 * 书写名称较长,Java提供了简单的类:便捷类 * 字符转换输出流:OutputStreamWriter--->FileWriter * FileWriter(String fileName) * 字符转换输入流:InputStreamReader--->FileReader * FileReader(String fileName) * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 使用字符流进行读写操作 * 分析: * 数据源:a.txt--->字符流读数据:InputStreamReader---->便捷类:FileReader * 目的地:b.txt--->字符流写数据:OutputStreamWriter--->便捷类:FileWriter * @author 小鑫 * */ public class FileCopyDemo { public static void main(String[] args) throws IOException { //封装数据源 FileReader fr = new FileReader("a.txt"); //封装目的地 FileWriter fw = new FileWriter("b.txt"); //一次读取一个字符数组 char[] chs=new char[1024]; int len=0; while((len=fr.read(chs))!=-1){ fw.write(chs, 0, len); } //释放资源 fr.close(); fw.close(); } }
四、编码和解码
编码:就是能看懂的字符串转换成看不懂的字节数组* public byte[] getBytes(Charset charset):将字符串转换成字节数组,指定编码格式(字符集)
解码:就是将看不懂的字节数组—–>能看懂的:将字节数组—>字符串
* public String(byte[] bytes, Charset charset):
* 通过使用指定的 编码格式 解码指定的 byte数组,构造一个新的 String
编码和解码必须保持一致
package org.westos_编码和解码; import java.io.IOException; import java.util.Arrays; /** * 编码:就是能看懂的字符串转换成看不懂的字节数组 * public byte[] getBytes(Charset charset):将字符串转换成字节数组,指定编码格式(字符集) * 解码:就是将看不懂的字节数组----->能看懂的:将字节数组--->字符串 * public String(byte[] bytes, Charset charset): * 通过使用指定的 编码格式 解码指定的 byte数组,构造一个新的 String * 注意事项: * 1)编码和解码必须保持一致 * 2)当不给出编码解码格式时,默认GBK格式。 * @author 小鑫 * */ public class StringDemo { public static void main(String[] args) throws IOException { String s="你好世界"; //编码 //public byte[] getBytes(Charset charset) byte[] bys = s.getBytes("GBK"); System.out.println(bys);//[B@2d95bbec System.out.println(Arrays.toString(bys)); //[-60, -29, -70, -61, -54, -64, -67, -25] //解码 //public String(byte[] bytes, Charset charset): String string = new String(bys, "GBK"); System.out.println(string);//你好世界 } }
五、字符缓冲输入输出流
*字符流为了提高读写速度,Java就提供了一个字符缓冲流的类:BufferedReader:字符缓冲输入流
BufferedWriter:字符缓冲输出流
1、字符缓冲输出流
package org.westos_字符缓冲输入输出流; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; /** * 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小 * * 构造方式: public BufferedWriter(Writer out):创建默认缓冲区大小的一个字符缓冲输出流 * * @author 小鑫 * */ public class BufferedWriterDemo { public static void main(String[] args) throws IOException { // 创建字符缓冲输出流对象 /*BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream("bw.txt")));*/ BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); //写数据 bw.write("hello"); bw.write("world"); bw.write("Java"); bw.write("你好世界"); //刷新流 bw.flush(); //释放资源 bw.close(); } }
2、字符缓冲输入流
package org.westos_字符缓冲输入输出流; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; /** * 字符缓冲输入流:BufferedReader 构造方式:BufferedReader(Reader in) :创建默认缓冲大小 * * @author 小鑫 * */ public class BufferedReaderDemo { public static void main(String[] args) throws IOException { // 创建字符缓冲输入流对象 /*BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream("bw.txt")));*/ FileReader fr = new FileReader("bw.txt"); /*//一次读取一个字符 int ch=0; while((ch=fr.read())!=-1){ System.out.print((char)ch); //helloworldJava你好世界 } fr.close();*/ //一次读取一个字符数组 char[] chs=new char[1024]; int len=0; while((len=fr.read(chs))!=-1){ System.out.println(new String(chs, 0, len)); //helloworldJava你好世界 } //释放资源 fr.close(); } }
3、字符缓冲的特有功能
* BufferedWriter: public void newLine():写入一个换行符号
* BufferReader:public String readLine():一次读取一行
package org.westos_字符缓冲输入输出流; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 关于字符缓冲的特有功能: * BufferedWriter: public void newLine():写入一个换行符号 * BufferReader:public String readLine():一次读取一行 * * * @author 小鑫 * */ public class BufferedDemo { public static void main(String[] args) throws IOException { writer(); read(); } //读数据 private static void read() throws IOException { //创新字符缓冲输入流对象 BufferedReader br = new BufferedReader(new FileReader("bw2.txt")); //当全部内容读完之后返回null String line=null; while((line=br.readLine())!=null){ System.out.println(line); } //释放资源 br.close(); } //写数据 private static void writer() throws IOException { // 创建字符缓冲输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt")); //写数据 for(int i=1;i<=10;i++){ bw.write("helloworld"+i); //原来的换行符 //bw.write("\r\n"); //BufferedWriter: public void newLine():写入一个换行符号 bw.newLine(); //刷新流 bw.flush(); } //释放资源 bw.close(); } }
4、标准输出输入流:System.in和System.out
package org.westos_字符缓冲输入输出流; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class SystemDemo { public static void main(String[] args) throws IOException { //systemIn(); systemOut(); } private static void systemOut() throws IOException { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); bw.write("hello world"); bw.flush(); bw.close(); } private static void systemIn() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入一个整数"); String line = br.readLine(); int number = Integer.parseInt(line); System.out.println("您输入的整数是:"+number); } }
5、方法递归
递归:三个条件:
* 1)定义一个方法
* 2)必须有规律
* 3)要有出口条件
package org.westos_字符缓冲输入输出流; /** * 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, * 假如兔子都不死,问第二十个月的兔子对数为多少? * 找规律: * 第一个月:1 * 第二个月:1 * 第三个月:2 * 第四个月:3 * 第五个月:5 * 第六个月:8 * 规律:从第三个月起:每个月的兔子数量等于前两个月兔子数量之和 * * 把每个月相邻兔子对数数据当做:a,b * 第一个月和第二个月相邻的数据:a=1,b=1 * 第二个月和第三个月相邻 的数据:a=1,b=2 * 第三个月和第四个月相邻的数据:a=2,b=3 * 第四个月和第五个月相邻的数据:a=3,b=5 * 下一次的a是上一次的b,下一次的b是上一次的a+b * @author 小鑫 * */ public class DiGuiDemo { public static void main(String[] args) { //动态初始化定义一个数组 int[] arr=new int[20]; arr[0]=1; arr[1]=1; //arr[2]=arr[0]+arr[1]; for(int x=2;x<arr.length;x++){ arr[x]=arr[x-1]+arr[x-2]; } System.out.println("第二十个月的兔子数量是:"+arr[19]);//第二十个月的兔子数量是:6765 System.out.println("第二十个月的兔子数量是:"+fib(20));//第二十个月的兔子数量是:6765 } /** * * @param n * 表示月份 * @return * 返回的是兔子的对数 */ //递归:方法调用方法,直到满足出口条件 private static int fib(int n){ if(n==1 || n==2){//出口条件 return 1; }else{ //规律:第一个月和第二个月兔子的对数1:从第三个月开始,每一个月兔子对数的数据是前两个月之和 return fib(n-1)+fib(n-2); } } }
day19
一、数据流
针对Java基本数据类型的数据进行读写操作DataOutputStream和DataInputStream
package org.westos_01_数据流; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * DataOutputStream和DataInputStream * 都属于数据流:可以针对Java基本数据类型的数据进行读写操作 * * DataOutputStream构造方法 * public DataOutputStream(OutputStream out) * DataInputStream构造方法 * public DateInputStream(InputStream in) * @author 小鑫 * */ public class DataStreamDemo { public static void main(String[] args) throws IOException { //writer(); //写进去的数据我们看不懂,需要读出来 read(); } private static void read() throws IOException { //创建数据输入流对象 DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt")); //读数据 byte b = dis.readByte(); int i = dis.readInt(); short s = dis.readShort(); long l = dis.readLong(); char ch = dis.readChar(); boolean flag = dis.readBoolean(); double d = dis.readDouble(); float f = dis.readFloat(); //释放资源 dis.close(); System.out.println(b); System.out.println(i); System.out.println(s); System.out.println(l); System.out.println(ch); System.out.println(flag); System.out.println(d); System.out.println(f); } private static void writer() throws FileNotFoundException, IOException { //创建数据输出流对象 DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt")); //写数据 dos.writeByte(100); dos.writeInt(1000); dos.writeShort(10); dos.writeLong(100000L); dos.writeChar('A'); dos.writeBoolean(true); dos.writeDouble(12.34); dos.writeFloat(12.34F); //释放资源 dos.close(); } }
二、内存操作流
针对内存的数据进行操作的,程序一结束,这些内存中的数据就消失掉了!特点:针对小文件进行操作!
该流对象可以不用关闭资源
ByteArrayInputStream和ByteArrayOutStream(重点)
package org.westos_02_内存操作流; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * ByteArrayOutputStream:内存操作输出流 * 构造方法:public ByteArrayOutputStream():创建默认的缓冲区大小的内存操作输出流(单位是字节) * 成员方法: * public byte[] toByteArray()创建一个新分配的 byte 数组(将内存操作输出流对象转换成字节数组) * void reset():重置内存操作输出流 * ByteArrayInputStream:内存操作输入流: * 构造方法:public ByteArrayInputStream(byte[] buf):参数数一个字节数组(缓冲数组) * @author 小鑫 */ public class ByteArrayStreamDemo { public static void main(String[] args) throws IOException { //创建内存操作输出流对象 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //写数据 for(int x=1;x<=5;x++){ baos.write(("hello"+x).getBytes()); } //关闭资源 //查看源码,没有具体的关闭流对象,所以此处可以不用关闭流对象 //public void close() throws IOException {} //baos.close(); //将内存操作输出流对象转换成字节数组 byte[] array = baos.toByteArray(); //创建内存操作输入流对象 ByteArrayInputStream bais = new ByteArrayInputStream(array); //一次读取一个字节 int by=0; while((by=bais.read())!=-1){ System.out.print((char)by); //hello1hello2hello3hello4hello5 } } }
三、打印流
打印流:* 字节打印流:PrintStream
* 字符打印流:PrintWriter
1、字符打印流
package org.westos_03_打印流; import java.io.IOException; import java.io.PrintWriter; /** * 打印流特点: * 1)在复制文件的,打印流不能操作数据源,只能操作目的地的数据(只能操作输出数据) * 2)打印流可以有自动刷新的功能 * 3)打印流可以直接针对文本文件进行操作: * 什么情况下是直接可以针对文本文件进行操作? * 查API的时候,看流中构造方法,只要构造方法的参数有File类或者是String类型,都可以针对文本文件进行操作 * FileInputStream * FileOutputStream * FileReader * FileWriter * * PrintWriter: * 构造方法: * public PrintWriter(String fileName) * @author 小鑫 */ public class PrintWriterDemo { public static void main(String[] args) throws IOException { //创建字符打印流对象 PrintWriter pw = new PrintWriter("pw.txt"); //写数据 pw.write("hello"); pw.write("world"); pw.write("你好世界"); //刷新流 pw.flush(); //关闭流 pw.close(); //记事本内容:helloworld你好世界 } }
2、PrintWriter的自动刷新功能
public PrintWriter(Writer out,boolean autoFlush)
* 第二个参数指定为true,则启动自动刷新
package org.westos_03_打印流; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; /** * PrintWriter:有自动刷新功能: * public PrintWriter(Writer out,boolean autoFlush) * 第二个参数指定为true,则启动自动刷新 * PrintWriter pw = new PrintWriter(new FileWriter("pw.txt"),true) ; * 加入自动刷新功能并且在写数据的时候,使用println():换行 * * println("hello")相当于: * pw.write("") ; * pw.newLine() ; * pw.flush() ; * @author 小鑫 * */ public class PrintWriterDemo2 { public static void main(String[] args) throws IOException { //创建字符打印流对象 PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"),true); //写数据 //public void println(String x):打印字符串,并且终止该行 pw.println("hello"); pw.println("world"); pw.println("你好世界"); //关闭流对象 pw.close(); /*记事本内容: hello world 你好世界*/ } }
3、复制文件
readLine()和println()
package org.westos_03_打印流; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; /** * 复制文件 需求:将当前项目下的ByteArrayStreamDemo.java中的内容复制到当前项目下Copy.java文件中 分析: * 数据源:ByteArrayStreamDemo.java--->BufferReader--->readLine() * 目的地:Copy.java--->BufferedWrier--->写数据--->println() * * @author 小鑫 * */ public class CopyFileDemo { public static void main(String[] args) throws IOException { /*// 封装数据源 BufferedReader br = new BufferedReader(new FileReader( "ByteArrayStreamDemo.java")); // 封装目的地 BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java")); //使用BufferedReaderde的独有功能 String line=null; while((line=br.readLine())!=null){ //写数据 bw.write(line); bw.newLine(); bw.flush(); } //释放资源 br.close(); bw.close();*/ // 封住数据源 BufferedReader br = new BufferedReader(new FileReader( "ByteArrayStreamDemo.java")); // 封装目的地 PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true); //读数据 String line=null; while((line=br.readLine())!=null){ pw.println(line); } //关闭资源 br.close(); pw.close(); } }
四、标准输入输出流
1、System类中有两个字段:* in:—–>InputStream is = System.in ;
* out—–>PrintStream ps = System.out ;
package org.westos_04_标准输入输出流; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; /** * 标准输入和输出流 * System类中有两个字段: * in:----->InputStream is = System.in ; * out----->PrintStream ps = System.out ; * * @author 小鑫 * */ public class SystemOutDemo { public static void main(String[] args) throws IOException { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //写数据 bw.write("hello"); bw.newLine(); bw.write("world"); bw.newLine(); bw.write("你好世界"); bw.newLine(); bw.flush(); bw.close(); } }
2、键盘录入数据的两种方式
package org.westos_04_标准输入输出流; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * 键盘录入的两种方式 1)Scanner类 Scanner sc = new Scanner(System.in) ; 2)使用IO流的形式进行录入数据 * BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ; * * @author 小鑫 * */ public class SystemInDemo { public static void main(String[] args) throws IOException { /* * //创建一个字节输入流对象 InputStream is=System.in; * //BufferedReader字符缓冲输入流只能对字符流进行操作 InputStreamReader isr = new * InputStreamReader(is); BufferedReader br = new BufferedReader(isr); */ // 另一种录入数据的方式 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请您输入一个字符串:"); String line = br.readLine(); System.out.println("您输入的字符串是:"+line); System.out.println("请您输入一个整数:"); String s = br.readLine(); int n = Integer.parseInt(s); System.out.println("您输入的整数是:"+n); /*请您输入一个字符串: hello 您输入的字符串是:hello 请您输入一个整数: 24 您输入的整数是:24*/ } }
五、随机访问流
RandomAccessFile:随机访问流:此类的实例支持对随机访问文件的读取和写入,不是实际意义上的流,因为它继承自Object类
package org.westos_05_随机访问流; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; /** * 常用的构造方法: * public RandomAccessFile(String name, String mode) 参数一:指定该文件的路径 参数二:指定的一种模式:常用的模式:"rw",这种模式是可以读也可以写 * @author 小鑫 * */ public class RandomAccessFileDemo { public static void main(String[] args) throws IOException { //write(); read(); } private static void read() throws IOException { //创建随机访问流对象 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw"); byte b = raf.readByte(); System.out.println(b);//100 //public long getFilePointer():返回此文件中的当前偏移量。 文件开头的偏移量(以字节为单位) System.out.println(raf.getFilePointer());//1 char ch = raf.readChar(); System.out.println(ch);//a String utf = raf.readUTF(); System.out.println(utf);//你好世界 } private static void write() throws FileNotFoundException, IOException { //创建随机访问流对象 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw"); //写数据 raf.writeByte(100); raf.writeChar('a'); raf.writeUTF("你好世界"); raf.close(); } }
六、合并流
1、合并复制两个文件package org.westos_06_合并流; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.SequenceInputStream; /** * SequenceInputStream:合并流(读数据):表示其他输入流的逻辑串联 合并流在复制文件的时候,只能操作数据源,不能操作目的地 * 构造方法: * public SequenceInputStream(InputStream s1,InputStream s2) * 需求:dos.txt和ByteArrayStreamDemo.java两个java文件中的内容复制到Copy.txt文件中 分析: * 数据源:dos.txt和ByteArrayStreamDemo.jaba--->SequenceInputStream--->分别读取 * 目的地:Copy.txt--->BufferedOutputStream--->写数据 * * @author 小鑫 */ public class SequenceInputStreamDemo { public static void main(String[] args) throws IOException { // 封装数据源 FileInputStream f1 = new FileInputStream("dos.txt"); FileInputStream f2 = new FileInputStream("ByteArrayStreamDemo.java"); // 创建合并流对象 SequenceInputStream sis = new SequenceInputStream(f1, f2); // 封装目的地 BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("Copy.txt")); //一次读取一个字节数组 byte[] bys=new byte[1024]; int len=0; while((len=sis.read(bys))!=-1){ bos.write(bys, 0, len); } sis.close(); bos.close(); } }
2、合并复制多个文件
构造方法:
public SequenceInputStream(Enumeration
package org.westos_06_合并流; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.SequenceInputStream; import java.util.Enumeration; import java.util.Vector; /** * SequenceInputStream的另一种构造方法:复制多个文件 * public SequenceInputStream(Enumeration<? extends InputStream> e) * Vector集合中的特有功能: * public Enumeration<E> elements() * 需求:将DataSteamDemo.java,ByteArrayStreamDemo.java,以及Copy.java将这三个文件中的内容复制到当前项目下:CopyThree.java文件 * 分析: * 数据源:DataSteamDemo.java,ByteArrayStreamDemo.java,Copy.java--->SequenceInpuyStream--->读数据 * 目的地:CopyThree.java--->BufferedOutputStream--->写数据 * @author 小鑫 * */ public class SequenceInputStreamDemo2 { public static void main(String[] args) throws IOException { //创建Vector集合,泛型数据类型<InputStream> Vector<InputStream> v = new Vector<InputStream>(); //封装数据源 FileInputStream f1 = new FileInputStream("DataStreamDemo.java"); FileInputStream f2 = new FileInputStream("ByteArrayStreamDemo.java"); FileInputStream f3 = new FileInputStream("Copy.java"); //添加到集合 v.add(f1); v.add(f2); v.add(f3); //特有功能:public Enumeration<E> elements() Enumeration<InputStream> en = v.elements(); //创建合并流对象 SequenceInputStream sis = new SequenceInputStream(en); //封装目的地 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("CopyThree.java")); //一次读取一个字节数组 byte[] bys=new byte[1024]; int len=0; while((len=sis.read(bys))!=-1){ bos.write(bys, 0, len); } sis.close(); bos.close(); } }
七、序列化流和反序列化流
1、序列化流:将对象像流的方式或者网络传输中的数据写数据.对象—->流数据:ObjectOutputStream2、反序列化流:将流数据或者网络传输中的流数据读取出来.流数据—->还原成对象:ObjectInputStream
3、Serializeable:序列化接口
4、生成固定ID或者随机ID
5、transient:不用被序列化的时候用它修饰
package org.westos_07_序列化流和反序列化流; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * ObjectOutputStream中的成员方法: * public final void writeObject(Object obj):将obj对象写入到当前的序列化流中 * ObjectInputStream中的成员方法: * public final Object readObject():从当前反序列化流中读取一个对象 * @author 小鑫 */ public class ObjectStreamDemo { public static void main(String[] args) throws IOException, IOException, ClassNotFoundException { write(); read(); } private static void read() throws IOException, IOException, ClassNotFoundException { // 创建反序列化流对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt")); //使用反序列化:将流数据--->对象 //public final Object readObject() Object obj = ois.readObject(); ois.close(); //System.out.println(obj); //org.westos_07_序列化流和反序列化流.Person@544764a1 //Person类中需要重写toString() System.out.println(obj); //Person [name=欧文, age=26] } private static void write() throws IOException, FileNotFoundException { //创建Person对象 Person p = new Person("欧文", 26); //创建序列化 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")); //写数据 //public final void writeObject(Object obj) oos.writeObject(p); //释放资源 oos.close(); } }
package org.westos_07_序列化流和反序列化流; import java.io.Serializable; /** * java.io.NotSerializableException:报这个异常:没有实现序列化接口的异常 * Serializeable:序列化接口 * 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,如果自定义一个类没有实现这个接口,就不能使用 * 序列化或者是反序列化!如果一个接口中没有字段,没有构造方法,没有成员方法,叫做标记接口 * 更改了Pereson类中的一个成员变量,重新去反序列化:出现异常: * java.io.InvalidClassException * 序列化和反序列化版本号不一致,会出现InvalidClassException * 解决这个异常两种方案: * 1)要么改动当前某个类中的数据之后,然后重新序列化和反序列化 * 这种做法不符实实际要求,在实际开发中,可能直接读数据:将流数据--->还原成对象 * 2)发现黄色警告线,点击它:生成一个固定ID * 注意事项: * 比如一个类中有很多成员变量,并不想让一些成员变量被序列化,Java提供了一个关键字: * transient:不用被序列化的时候用它修饰 * @author 小鑫 * */ public class Person implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String name; private int age; //private transient int age;//Person [name=欧文, age=0] public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } 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; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
序列化和反序列化考点:
* 1)将对象—>流数据或者流数据—>对象,该对象所在的类要实现一个标记接口:serializable
* 2)序列化和反序列化生产的版本Id不一致的时候,会出现异常,所以使用生产随机ID或者固定ID解决
* 3)transient:修饰的变量不会被序列化…
八、集合属性类
Properties:属性集合类,该类继承自Hashtable
package org.westos_08_属性集合类; import java.util.Properties; import java.util.Set; /** * Properties:属性集合类,该类继承自Hashtable<K,V>,该类属于Map集合 * Properties 类表示了一个持久的属性集。 * Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串(一般情况:它用作配置文件去使用,MySQL或者Oracle中用它做配置文件) * 构造方法: * public Properties():创建一个空属性列表 * @author 小鑫 * */ public class PropertiesDemo { public static void main(String[] args) { //创建属性集合类对象 Properties prop = new Properties(); //添加元素 prop.put("张三", 30); prop.put("李四", 40); prop.put("王五", 50); prop.put("赵六", 60); //遍历 Set<Object> keySet = prop.keySet(); for(Object key:keySet){ Object value = prop.get(key); System.out.println(key+"---"+value); /*赵六---60 王五---50 张三---30 李四---40*/ } } }
2、Properties有自己的遍历和添加元素的功能
* public Object setProperty(String key,String value):给属性列表中添加元素
* public Set stringPropertyNames():获取当前属性列表中所有的键的集合,键值都是String类型
* public String getProperty(String key)用指定的键在此属性列表中搜索属性值
package org.westos_08_属性集合类; import java.util.Properties; import java.util.Set; /** * 属性集合类:Properties有自己的遍历和添加元素的功能 * public Object setProperty(String key,String value):给属性列表中添加元素 * public Set<String> stringPropertyNames():获取当前属性列表中所有的键的集合,键值都是String类型 * public String getProperty(String key)用指定的键在此属性列表中搜索属性值 * @author 小鑫 * */ public class PropertiesDemo2 { public static void main(String[] args) { Properties prop = new Properties(); //添加元素 //public Object setProperty(String key,String value):给属性列表中添加元素 prop.setProperty("张三", "30"); prop.setProperty("李四", "40") ; prop.setProperty("王五", "50") ; prop.setProperty("赵六", "60") ; //遍历属性:public Set<String> stringPropertyNames() //获取当前属性列表中所有的键的集合,键值都是String类型 Set<String> keySet = prop.stringPropertyNames(); for(String key:keySet){ //public String getProperty(String key) String value = prop.getProperty(key); System.out.println(key+"---"+value); /*赵六---60 王五---50 张三---30 李四---40*/ } } }
3、Properties 可保存在流中或从流中加载。
* 将文件中的数据加载到属性集合中:public void load(Reader reader)
* 将属性集合中的数据保存到文件中:public void store(Writer writer,String comments): 第二个参数:comments:对当前属性列表的描述
package org.westos_08_属性集合类练习; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; /** * Properties 可保存在流中或从流中加载。 * 将文件中的数据加载到属性集合中:public void load(Reader reader) * 将属性集合中的数据保存到文件中:public void store(Writer writer,String comments) * 第二个参数:comments:对当前属性列表 的描述 * @author 小鑫 */ public class PropertiesDemo { public static void main(String[] args) throws IOException { myStore(); myLoad(); } private static void myLoad() throws IOException { //创建属性集合类对象 Properties prop = new Properties(); //创建字符输入流对象 FileReader fr = new FileReader("user.txt"); //将文件中的数据加载到属性集合中:public void load(Reader reader) prop.load(fr); //释放资源 fr.close(); System.out.println(prop); } private static void myStore() throws IOException { //创建属性集合类对象 Properties prop = new Properties(); //给集合添加元素 prop.setProperty("张三", "30"); prop.setProperty("李四", "40"); prop.setProperty("王五", "50"); //将属性集合中的数据保存到文件中:public void store(Writer writer,String comments) //第二个参数:comments:对当前属性列表 的描述 //创建字符输出流对象 FileWriter fw = new FileWriter("user.txt"); prop.store(fw, "name comments"); //释放资源 fw.close(); } }
4、练习
package org.westos_08_属性集合类练习; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; import java.util.Set; /** * 我有一个文本文件(user.txt),我知道数据是键值对形式的,但是不知道内容是什么。 * 请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其值为”100” * * 分析: * 1)将user.txt文件中的内容加载到属性集合类中 * 2)遍历集合属性类,获取所有键的集合:stringPropertyName(String key) * 判断:如果“lisi”这个键中key相等 * 修改:setProperty(key,"100") * 3)重新将集合属性数据写入user.txt中 * @author 小鑫 * */ public class PropertiesTest { public static void main(String[] args) throws IOException { //创建集合属性类对象 Properties prop = new Properties(); //创建字符输入流对象 FileReader fr = new FileReader("user.txt"); //加载到属性集合中 prop.load(fr); //关闭流资源 fr.close(); //遍历属性集合 //stringPropertyName(String key):获取所有键的集合 Set<String> keySet = prop.stringPropertyNames(); for(String key:keySet){ if("李四".equals(key)){ //setProperty(key,"100") prop.setProperty(key, "100"); } } //修改完之后,要重新把属性集合类写入文件user.txt中 //创建字符输出流对象 FileWriter fw = new FileWriter("user.txt"); prop.store(fw, "name comments"); //关闭流资源 fw.close(); } }
相关文章推荐
- Java作业杨枝11.25/11.26
- Java学习第十八天
- JAVA求学之路第十九天(多线程)
- java第十八天
- JAVA 攻城狮 第十九天
- Java学习总结第十九天Java接口
- 大数据Java基础第十九天作业
- 黑马程序员--Java基础学习(其他对象和IO流)第十八天
- 11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch
- java学习总结——第十八天
- Java学习第十九天
- 黑马程序员 —— Java高级视频_IO输入与输出(第十八天)1
- 《救赎》 11.25+11.26
- java学习第十九天之API、Date、Calendar
- 传智博客JAVA基础第十九天
- 11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch
- Java进阶学习第十八天——事物与连接池
- java分享第十九天(TestNg的IReporter接口的使用)
- java基础第十八天_项目完善
- 第十九天【java虐我千百遍,我待java如初恋】