java的IO流

IO流:

java的IO流

面试题小数组的读写和带Buffered的读取哪个更快?

  * 定义小数组如果是8192个字节大小和Buffered比较的话

  * 定义小数组会略胜一筹,因为读和写操作的是同一个数组

  * Buffered操作的是两个数组

IO(flushclose方法的区别)

flush()方法: 用来刷新缓冲区的,刷新后可以再次写出(字节缓冲流内置缓冲区,如果没有读取出来,可以使用flush()刷新来)

close()方法:用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出

8:字符流FileReaderFileWriter

字符流是什么

  * 字符流是可以直接读写字符的IO

  * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.    

IO(什么情况下使用字符流)

* 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.

* 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流

* 读取的时候是按照字符的大小读取的,不会出现半个中文

* 写出的时候可以直接将字符串写出,不用转换为字节数组

 

IO(字符流是否可以拷贝非纯文本的文件)

* 不可以拷贝非纯文本的文件

* 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去

* 如果是?,直接写出,这样写出之后的文件就乱了,看不了了

 

File:

package ioDemo;

 

import java.io.File;

 

/*

 * java.io.File

 *   将系统中的文件,目录,路径封装成File对象

 *   提供方法操作系统中的内容

 *   File与系统无关

 */

public class FileDemo {

       public static void main(String[] args) {

              //separator名称分割符,Windows是\,Linux是/

              System.out.println(File.separator);

              //pathSeparator路径分隔符,Windows是; ,Linux是:

              System.out.println(File.pathSeparator);

              /*

               * File类的构造方法

               * 三种重载形式

               */

              function();

              function_2();

              function_3();

       }

       /*

        * File(File parent,String child)

        * 传递路径:传递File父路径,字符串子路径

        */

       private static void function_3() {

              File parent = new File("G:");

              File file = new File(parent,"javase");

              System.out.println(file);

       }

       /*

        * File(String parent,String child)

        * 传递路径:传递字符串父路径,字符串子路径

        */

       private static void function_2() {

              File file = new File("G:","javase");

              System.out.println(file);

       }

       /*

        * File(String pathname)

        * 传递路径名:可以写到文件夹,可以写到一个文件

        * 将路径封装为File类型对象

        */

       private static void function() {

              //写两个\\是转译符号表示一个\

              //windows文件夹名和文件名不区分大小写

              File file = new File("G:\\javase");

              System.out.println(file);

       }

}

*******************************************************************

package ioDemo;

 

import java.io.File;

import java.io.IOException;

 

/*

 * File类的创建和删除功能

 * 文件或目录

 */

public class FileDemo2 {

       public static void main(String[] args) {

              //function();

              //function_1();

              function_2();

       }

       /*

        * boolean delete() 删除文件和文件夹,彻底删除不进回收站

 *删除目录时,如果目录中有内容,无法直接删除。

        */

       private static void function_2() {

              File file = new File("G:\\a.txt");

              boolean b = file.delete();

              System.out.println(b);

       }

       /*

        * boolean mkdir() 创建文件夹必须有父文件夹

        * boolean mkdirs() 创建文件夹包括不存在的父文件夹

        */

       private static void function_1() {

              File file = new File("G:\\java\\java\\java");

              boolean b = file.mkdirs();

              System.out.println(b);

       }

       /*

        * boolean cteateNewFile() 创建文件

        */

       private static void function() {

              File file = new File("G:\\java.doc");

              try {

                     boolean b = file.createNewFile();

                     System.out.println(b);

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

}

***********************************************************************

package ioDemo;

 

import java.io.File;

 

public class FIleDemo3 {

       public static void main(String[] args) {

             

              File file = new File("G:\\a.txt");

             

              //String getName()获取文件名,就近的路径名

              File filePath = new File("G:\\java\\eclipse");

              String name = file.getName();

              String namePath = filePath.getName();

              System.out.println(name);//a.txt

              System.out.println(namePath);//eclipse

             

              //long length() 返回文件的字节数

              long length = file.length();

              System.out.println(length);

             

              //File getParentFile() 获取父路径

              File parent = file.getParentFile();

              System.out.println(parent);

             

              //File getAbsoluteFile() 返回抽象路径名的绝对路径名

              File fdfa = new File("dfa");

              //工程根目录  G:\Users\Administrator\eclipse-workspace\MyStudyJavaSe\dfa

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

              File absoluteFile = file.getAbsoluteFile();

              System.out.println(absoluteFile);

             

              //boolean exists() 判断文件或目录是否存在

              File fsrc = new File("src");

              //不写绝对路径默认相对路径为工程根目录,src存在所以返回true

              System.out.println(fsrc.exists());

              boolean b = file.exists();

              System.out.println(b);

             

              //boolean isDirectory() 判断是否是文件夹

              //boolean isFile() 判断是否是文件

       }

}

*************************************************************************************

package ioDemo;

 

import java.io.File;

 

public class FileDemo4 {

       public static void main(String[] args) {

             

              /*

               * String[] list()

               * 获取到File构造方法中封装路径中的文件和文件夹名(遍历)

               * 只能获取当前路径下的,子路径不可获取

               */

              File file1 = new File("G:\\学习文档");

              String[] s = file1.list();

              for(String i : s) {

                     System.out.println(i);

              }

             

              /*

               * File[] listFiles()

               * 获取到File构造方法中封装路径中的文件和文件夹(遍历)

               * 只能获取当前路径下的,子路径不可获取

               */

              File file2 = new File("G:\\JavaTest");

              File[] f2 = file2.listFiles();

              for(File f : f2) {

                     System.out.println(f);

              }

              System.out.println("**************************************");

              function();

       }

       /*

        * 文件过滤器

        *   遍历目录时根据需要,只获取满足条件的文件

        *   listFiles(FileFilter filter)

        *   传递FileFilter接口的实现类

        *   自定义FileFilter接口实现类,重写抽象方法

        *   接口实现类对象传递到遍历方法listFiles中

        */

       public static void function(){

              File file = new File("G:\\Javatest");

              File[] f = file.listFiles(new MyFilter());

              for(File f1 : f) {

                     System.out.println(f1);

              }

       }

}

 

package ioDemo;

 

import java.io.File;

import java.io.FileFilter;

 

public class MyFilter implements FileFilter{

 

       public boolean accept(File f) {

              //endWith区分大小写

              return f.getName().endsWith(".txt");

       }

      

}

***********************************************************************************************

package ioDemo;

import java.io.File;

/*

 * 封装getAllDir方法,打印路径下所有目录和文件

 */

public class FileDemo5 {

       public static void main(String[] args) {

              File file = new File("G:\\系统");

              getAllDir(file);

       }

 

       private static void getAllDir(File file) {

              //System.out.println(file);

              File[] arr = file.listFiles();

              for(File f : arr) {

                     System.out.println(f);

                     //递归调用,不可思议

                     if(f.isDirectory()) {

                            getAllDir(f);

                     }

              }

       }

      

}

***********************************************************************************************

一个简单的递归调用:

/**

 * 斐波那契数列

 *   1对兔子,第一个月不生,第二个月不生,第三个月生1对兔子

 *   生下的1对兔子,第一个月不生,第二个月不生,第三个月生1对兔子

 *   求12个月后共有多少对兔子

 */

package test;

 

public class TuZi {

       public static void main(String[] args) {

              System.out.println(Number(12));

       }

       public static int Number(int month) {

              if(month==1)

                     return 1;

              if(month==2)

                     return 1;

              return Number(month-1)+Number(month-2);

              //其实就是1,1,3,5,8  后一个数等于前面两个数字相加

       }

}

 

读文件FileInputStream:

package ioDemo;

/*

 * 字节输入流

 *   java.io.InputStream 所有字节输入流的超类

 *   作用:读取任意文件,每次只读一个字节

 *   读取的方法read

 *          int read()

 *          int read(Byte[] b)

 *          int read(Byte[] b,int off,int len)

 * 抽象类不能用,请看下集FileInputStream子类

 */

public class InputSteamDemo {

 

}

***********************************************************************

package ioDemo;

 

import java.io.FileInputStream;

import java.io.IOException;

/*

 *   int read() 方法:

 *          read(),执行一次就会自动读取下一字节

 *          返回的是读取到的字节,读到结尾返-1

 */

public class FileInputStreamDemo {

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

              FileInputStream fis = new FileInputStream("G:\\java\\a.txt");

              int i;

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

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

              }

              /*System.out.println(fis.read());

              System.out.println(fis.read());

              System.out.println(fis.read());*/

              fis.close();

       }

}

********************************************************************************

package ioDemo;

 

import java.io.FileInputStream;

import java.io.IOException;

 

/*

 *  读取方法 int read(byte[] b) 读取字节数组

 *  数组作用:缓冲,提高效率  读取的内容存在数组b中

 *  返回值int:表示读取到多少个有效的字节数,结尾是返回-1,len表示读取的长度

 */

public class FileInputStreamDemo1 {

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

              FileInputStream fis = new FileInputStream("G:\\java\\a.txt");

              byte[] b = new byte[1024];//默认为1024,或1024整数倍,大幅度提高效率

              int len = 0;

              while((len = fis.read(b)) != -1) {

                     System.out.println(new String(b,0,len));

              }

       }

}

写文件FileOutputStream:

package ioDemo;

/*

 * 字节输出流

 *   java.io.OutputStream; 所有字节输出流的超类

 *   从java程序写出文件,每次只能操作文件中一个字节

 */

public class OutputStreamDemo {

 

}

*********************************************************

package ioDemo;

 

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

 

/*

 * FileOutputStream

 * 写入数据文件,学习父类方法使用子类数据

 *  

 *   子类的构造方法:绑定输出的输出目的

 *          参数:File 封装文件      String 字符串的文件名

 *

 * 流对象使用步骤:

 *   1.创建子类对象,绑定数据目的

 *   2.调用该对象的方法write写

 *   3.close释放资源

 * 流对象的构造方法可以创建文件,如果文件存在直接覆盖

 */

public class FileOutputStreamDemo {

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

              FileOutputStream fos = new FileOutputStream("G:\\java\\a.txt");

              //写一个字节

              fos.write(97);//流对象存入的是97对应的ASKⅡ字母a

              //写字节数组

              byte[] b = {65,66,67,68};//65,66,67,68对应ABCD

              fos.write(b);

              //写字节数组的一部分

              fos.write(b, 1, 3);//写数组b ,第1个开始写3个

              //写入的便捷方式,写字符串.getBytes()

              fos.write("HelloWorld".getBytes());

              fos.close();

       }

}

************************************************************************

package ioDemo;

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

 

/*

 * FileOutputStream文件的续写和换行

 * 续写 FileOutputStream的构造方法中,第二个参数写true

 * 换行符  \r\n

 */

public class FileOutputStreamDemo1 {

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

              File file = new File("G:\\java\\a.txt");

              FileOutputStream fos = new FileOutputStream(file,true);

              fos.write("Hello".getBytes());//第二个参数有true,把Hello加在文件末尾

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

              fos.write("\r\n".getBytes());//其实是"\r\n".getBytes()

              fos.close();

       }

}

**********************************************************************

 

复制文件:

package ioDemo;

/*

 *    复制文件

 */

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

 

public class Copy {

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

              FileInputStream fis = new FileInputStream("G:\\java\\aa.zip");

              FileOutputStream fos = new FileOutputStream("G:\\java\\新建文件夹\\b.zip");

       /*    int len = 0;

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

                     fos.write(len);

              }

              fos.close();

              fis.close();*/

              int len = 0;

              byte[] b = new byte[1024];

              //速度大幅度提升

              while((len = fis.read(b)) != -1){

                     fos.write(b,0,len);

              }

              fos.close();

              fis.close();

       }

}

************************************************************************

 

Writer和Reader:

package ioDemo;

 

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

 

/*

 * 字符输出流

 *          java.io.Writer 所有字符输出流的超类

 * 写文件,专门写文本文件

 *   写的方法write

 *          write(int c) 写一个字符

 *          write(char[c]) 写字符数组

 *          write(char[c],int,int) 字符数组的一部分

 *          write(String s) 写字符串

 * 用它的子类FileWriter

 *   构造方法:写入的数据目的: File 类型对象       String 文件名

 *          字符输出流写数据时必须运行flush()刷新才能显示出数据

 */

public class WriterDemo {

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

              File file = new File("G:\\java\\a.txt");

              FileWriter fw = new FileWriter(file);

              fw.write(101);

              fw.flush();

              fw.write('a');

              fw.flush();

              char[] c = {'d','f','f','v'};

              fw.write(c);

              fw.flush();

              fw.write(c,0,3);

              fw.write("\r\nhelloworld");//换行依然能用

              fw.flush();

              fw.close();

       }

}

**********************************************************

package ioDemo;

 

import java.io.FileReader;

import java.io.IOException;

import java.io.PrintStream;

 

/*

 * 字符输入流读取文本文件, 所有字符输入流的超类

 *   java.io.Reader

 *   专门读取文本文件

 *

 * 读取方法:read()

 *   int read() 读一个字符

 *   int read(char[] c) 读字符数组

 *

 * Reader类是抽象类,找到子类对象FileReader

 *   构造方法:绑定数据源  File 数据类型             String 文件名

 */

public class ReaderDemo {

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

              FileReader fir = new FileReader("G:\\java\\a.txt");

              int len = 0;

              while((len=fir.read()) != -1) {

                     System.out.print((char)len);

              }

              //不能讲上面注释解除,否则下面代码无法执行?

              //read()读完就返回-1,不会刷新

              char[] c = new char[5];

              while((len = fir.read(c)) != -1) {

                     System.out.print(new String(c,0,len));

              }

              fir.close();

       }

}

***************************************************************

小题目,给学生改作业:

package scoreDemo;

 

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.ArrayList;

 

/*

 * 模拟改试卷

 *   规定考试全是选择题

 *   标准答案以文本形式放在电脑中,有20个选择题答案   G:\\java\\答案

 *   90个学生的答题卡以文本形式放在电脑中,有学生班级,姓名,学号,考试答案  G:\\java\\学生答题卡

 *   对比正确答案和学生的答题卡,对一题得一分,将最终的成绩按班级生成不用文档显示出来,放在 G:\\java\\成绩

 */

public class ScoreDemo {

       static FileReader answer = null;                                                   //正确答案文件

       static FileReader student = null;                                                   //读取单个学生答案

       static ArrayList<FileReader> studentList = new ArrayList<FileReader>();     //读取学生答案集合

       static int[] score = new int[90];                                                    //学生成绩

       static FileWriter one = null;                                                          //一班成绩单

       static FileWriter two = null;                                                          //二班成绩单

       static FileWriter three = null;                                                       //三班成绩单

      

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

             

              Get();

              Compare();

              Print();

       }

 

       /**

        * 取出学生答案和正确答案,学生答案存储在studentList集合中

        */

       private static void Get() {

              //取出学生答案,并存储在studentFile中

              try {

                     for(int i = 1;i <= 90;i++) {

                            if(i <= 30)

                                   student = new FileReader("G:\\java\\考试测试\\学生答题卡\\"

                                                 + "计科一班 201430"+i+".txt");

                            else if(i > 30 && i<= 60)

                                   student = new FileReader("G:\\java\\考试测试\\学生答题卡\\"

                                                 + "计科二班 201430"+i+".txt");

                            else

                                   student = new FileReader("G:\\java\\考试测试\\学生答题卡\\"

                                                 + "计科三班 201430"+i+".txt");

                            //获取学生答案并存储在studentList集合中

                            studentList.add(student);

                     }

                     //获取答案存储在answer中

                     answer = new FileReader("G:\\java\\考试测试\\答案\\标准答案.txt");

              }catch(IOException e ) {

                     e.printStackTrace();

              }

       }

      

       /**

        * 比较学生答案和正确答案,并获取成绩存储在数组score[]中

        */

       private static void Compare() {

              try {

                     for(int j = 0;j < 20;j++) {

                            int len = answer.read();

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

                                   if(studentList.get(i).read() == len) {

                                          score[i]++;//判断是否相等,相等加一分

                                   }

                            }

                     }

              }catch(IOException e) {

                     e.printStackTrace();

              }finally {

                            try {

                                   //此处关闭流,不能在上面关闭否自会出错

                                   answer.close();

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

                                          studentList.get(i).close();

                                   }

                            } catch (IOException e) {

                                   e.printStackTrace();

                            }

                     }

              }

      

      

       /**

        * 按班级打印出学生的学号,成绩,班级平均分.最高分.最低分

        */

       private static void Print() {

              int sum1 = 0;int sum2 = 0;int sum3 = 0;

              int average1 =0;int average2 =0;int average3 =0;

              try {

                     one = new FileWriter("G:\\java\\考试测试\\成绩\\一班成绩.txt",true);//true续写功能

                     two = new FileWriter("G:\\java\\考试测试\\成绩\\二班成绩.txt",true);

                     three = new FileWriter("G:\\java\\考试测试\\成绩\\三班成绩.txt",true);

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

                            sum1 += score[i];sum2 += score[i+30];sum3 += score[i+60];

                     }

                     average1 = sum1 /30;average2 = sum2 /30;average3 = sum3 /30;

                     String total1 = "一班成绩    平均分:"+average1+"    以下是各位同学成绩!\r\n";

                     String total2 = "二班成绩    平均分:"+average2+"    以下是各位同学成绩!\r\n";

                     String total3 = "三班成绩    平均分:"+average3+"    以下是各位同学成绩!\r\n";

                     one.write(total1);

                     two.write(total2);

                     three.write(total3);

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

                            //将int类型转换为String类型

                            String s1 = "学号"+201430261+i+"的成绩为:"+score[i]+"\r\n";

                            //将int类型转换为String类型

                            String s2 = "学号"+2014302631+i+"的成绩为:"+score[i+30]+"\r\n";

                            //将int类型转换为String类型

                            String s3 = "学号"+2014302661+i+"的成绩为:"+score[i+60]+"\r\n";

                            one.write(s1);

                            two.write(s2);

                            three.write(s3);

                            one.flush();

                            two.flush();

                            three.flush();

                     }

                    

                     one.close();

                     two.close();

                     three.close();

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

}

*********************************************************************************************

package scoreDemo;

 

import java.io.FileWriter;

import java.io.IOException;

 

/**

 * 创建学生答案类

 * 自动生成90个学生的答案,并存储在"G:\\java\\考试测试\\学生答题卡" 文件夹中

 */

public class CreateStudent {

       public static void main(String[] args) {

              FileWriter file =null;

 

              int[] select = new int[20];                  //存20个答案的数组

              int i = 0;

              int j = 1;

             

              for(j = 1;j <=90;j++) {

              try {

                     //判断j的值学号1-30,31-60,61-90分别为1,2,3班

                     if(j<=30)

                            file = new FileWriter("G:\\java\\考试测试\\学生答题卡\\计科一班 201430"+j+".txt");

                     else if(30<j && j<=60)

                            file = new FileWriter("G:\\java\\考试测试\\学生答题卡\\计科二班 201430"+j+".txt");

                     else

                            file = new FileWriter("G:\\java\\考试测试\\学生答题卡\\计科三班 201430"+j+".txt");

                     for(i = 0;i < 20;i++) {

                            char r = (char)(int)(Math.random()*4+97);

                                   select[i] = r;   //随机生成abcd,并存入数组select中

                                   file.write(select[i]);

                     }

              } catch (IOException e) {

                     e.printStackTrace();

              }finally {

                     try {

                            file.close();

                     } catch (IOException e) {

                            e.printStackTrace();

                     }

              }

        }

       }

}

字节输出转换流 OutputStreamWriter:

 

package ioChange;

 

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

 

/*

 * 转换流

 *          java.io.OutputStreamWrite; 继承Writer类        

 *          就是一个字符输出流写文本文件

 *          write() 字符,字符数组,文本文件

 *          子类FileWriter,方便使用,但是不能改变编码表

 *

 * 字符通向字节的桥梁,将字符流转为字节流

 *  

 * OutputStreamWriter 使用方式:

 *   构造方法:

 *          OutputStreamWriter(OutputStream out) 接收所有的字节输出流

 *                 字节输出流只学过:FileOutputStream

 *          OutputStreamWriter(OutputStream out,String charsetName)

 *                 String charsetName 传递编码表的名字: GBK UTF-8 不区分大小写

 */

public class OutputStreamWriterDemo {

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

              //writeGBK();

              writeUTF_8();

       }

       /*

        * 转换流对象OutputStreamWriter写文本

        * 文本采用UTF-8

        */

       private static void writeUTF_8() throws IOException {

              //创建字节输出流,绑定数据文件

              FileOutputStream fos8 = new  FileOutputStream("G:\\java\\fosUTF.txt");

              //创建转换流对象,绑定字节输出流,使用UTF-8

              OutputStreamWriter osw = new OutputStreamWriter(fos8, "UTF-8");

              osw.write("你好");

              osw.close();

       }

       /*

        * 转换流对象OutputStreamWriter写文本

        * 文本采用GBK的形式写入

        */

       private static void writeGBK() throws IOException {

              //创建字节输出流,绑定数据文件

              FileOutputStream fos = new FileOutputStream("G:\\java\\fos.txt");

              //创建转换流对象,绑定字节输出流,使用GBK(不写就是默认使用GBK)

              OutputStreamWriter osw = new OutputStreamWriter(fos);

              osw.write("你好");

              osw.close();

       }

}

字节读取转换流 InputStreamReader:

package ioChange;

 

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStreamReader;

 

/*

 * 转换流

 *          java.io.InputStreamReader 继承自Reader

 *          字符流,读取文本文件

 *

 *   字节流向字符流转换,将字节流转为字符流,支持多种编码

 *

 * InputStreamReader读取文件

 *   构造方法:

 *          InputStreamReader(InputStream in)

 *          InputStreamReader(InputStream in,String charsetName)

 *           可以传递的字节输入流:FileInputStream

 *

 */

public class InputStreanReaderDemo {

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

//           read_G();

              read_U();

       }

      

       //读取UTF-8文件

       private static void read_U() throws IOException {

              //创建字节输入流对象

              FileInputStream fis = new FileInputStream("G:\\java\\fosUTF.txt");

              //创建转换流对象

              InputStreamReader isr = new InputStreamReader(fis,"utf-8");

              int len = 0;

              char[] c = new char[1024];

              while((len = isr.read(c)) != -1) {

                     System.out.println(new String(c,0,len));

              }

              isr.close();

              /*byte[] b = new byte[1024];

              while((len = fis.read(b)) != -1) {

                     System.out.println(new String(b,0,len));

              }*/

       }

 

       //读取GBK文件

       private static void read_G() throws IOException {

              //创建字节输入流对象

              FileInputStream fis = new FileInputStream("G:\\java\\fos.txt");

              //创建转换流对象绑定字节输入流

              InputStreamReader ise = new InputStreamReader(fis);

              int len = 0;

              char[] c = new char[1024];

              while((len = ise.read(c)) != -1) {

                     System.out.print(new String(c,0,len));

              }

              ise.close();

             

       }

}

 

字节输出流的缓冲流BufferedOutputStream

package ioStreamDemo;

 

import java.io.BufferedOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

 

/*

 *    字节输出流的缓冲流

 *           java.io.BufferedOnputStream

 *           BufferedOnputStream 继承自 OnputStream

 *           方法:写入write 字节,字节数组

 *

 *构造方法:

 *    BufferedOnputStream(OnputStream out)

 *    可以传递任意的字节输出流

 *    FileOutputStream

 */

public class BufferedOnputStreamDemo {

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

              BufferedOutputStream bos = new BufferedOutputStream

                            (new FileOutputStream("G:\\java\\buffer.txt"));

              bos.write(32);

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

              byte[] b = "hello world".getBytes();

              bos.write(b, 0, b.length);

              bos.close();

       }

}

 

 

字节输入流的缓冲流BufferedInputStream

package ioStreamDemo;

 

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.IOException;

 

/*

 * 字节输入流的缓冲流,

 *   java.io.BufferedInputStream

 *   继承自InputStream,字节输入流

 *   读取方法,read() 单个字节,字节数组

 *

 * 构造方法:

 *          BufferedInputStream(InputStream)

 *          可以传入任意的字节输入流      FileInputStream

 *  

 */

public class BufferedInputStreamDmeo {

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

              BufferedInputStream bis = new BufferedInputStream

                            (new FileInputStream("G:\\java\\buffer.txt"));

              int len = 0;

              byte[] b = new byte[1024];

              while((len = bis.read(b)) != -1) {

                     System.out.println(new String(b,0,len));

              }

              bis.close();

       }

}

复制比赛:

package ioStreamDemo;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

/*

比较那种方法复制速度快       

1.字节流读写单个字节            204444

2.字节流读写字节数组            199

3.字节缓冲区读写单个字节            700

4.字节缓冲区读写字节数组            55

 */

 

public class CopyRace {

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

              File src = new File("G:\\java\\src.txt");

              File desc = new File("G:\\java\\desc.txt");

              long start = System.currentTimeMillis();

              copy_4(src,desc);

              long end = System.currentTimeMillis();

              System.out.println("复制完成,共用时:"+(end-start)+"毫秒");

       }

 

       //4.字节缓冲区读写字节数组            用时55

       private static void copy_4(File src, File desc) throws IOException{

              FileInputStream in = new FileInputStream(src);

              FileOutputStream out = new FileOutputStream(desc);

              BufferedInputStream fis = new BufferedInputStream(in);

              BufferedOutputStream fos = new BufferedOutputStream(out);

              int len = 0;

              byte[] b = new byte[1024];

              while((len = fis.read(b)) != -1) {

                     fos.write(b,0,len);

              }

              fis.close();

              fos.close();

       }

      

       //3.字节缓冲区读写单个字节            用时700

       private static void copy_3(File src,File desc) throws IOException{

              FileInputStream in = new FileInputStream(src);

              FileOutputStream out = new FileOutputStream(desc);

              BufferedInputStream fis = new BufferedInputStream(in);

              BufferedOutputStream fos = new BufferedOutputStream(out);

              int len;

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

                     fos.write(len);

              }

              fis.close();

              fos.close();

       }

      

       //2.字节流读写字节数组     用时199

       private static void copy_2(File src, File desc) throws IOException{

              FileInputStream fis = new FileInputStream(src);

              FileOutputStream fos = new FileOutputStream(desc);

              int len = 0;

              byte[] b = new byte[1024];

              while((len = fis.read(b)) != -1) {

                     fos.write(b,0,len);

              }

              fis.close();

              fos.close();

       }

 

       //1.字节流读写单个字节     用时204444

       private static void copy_1(File src,File desc) throws IOException{

              FileInputStream fis = new FileInputStream(src);

              FileOutputStream fos = new FileOutputStream(desc);

              int len;

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

                     fos.write(len);

              }

              fis.close();

              fos.close();

       }

      

}

字符输出流缓冲流BufferedWriter

package ioStreamDemo;

 

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

 

/*

 * 字符输出流缓冲流

 *          java.io.BufferedWriter

 *          写入方法:writer() 单个字符,字符数组,字符串

 *

 * 构造方法:

 *          BufferedWriter(Writer w) 任意字符输出流

 *          FileWriter     OutputStreamWriter

 *   bw.newLine();//换行方法,跨平台使用,

\r\n只能在Windows中有用不推荐使用

 */

public class BufferedWriterDemo {

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

              BufferedWriter bw = new BufferedWriter(new FileWriter("G:\\java\\a.txt"));

              bw.write('你');

              bw.write('好');

              bw.newLine();

              char[] c = "我很好,你呢".toCharArray();//字符串变字符数组

              bw.write(c);

              bw.newLine();

              bw.write("我也是");

              bw.close();

       }

}

字节输入缓冲流BufferedReader

package ioStreamDemo;

 

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

 

/*

 *

 *   java.io.BufferedReader 继承自Reader

 *   方法:read()

 *

 * 构造方法:

 *          BufferedReader(Reader r)

 *          FileReader     InputStreamReader

 *   BufferedReader特有的方法: String readLine() 读取一行遇换行返回String,读完返回null 没有换行符号

 */

public class BufferedReaderDmeo {

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

              BufferedReader br = new BufferedReader(new FileReader("G:\\java\\a.txt"));

              String line = null;

              while((line = br.readLine()) != null) {

                     System.out.println(line);

              }

              /*int len = 0;

              char[] c = new char[3];

              while((len = br.read(c)) != -1) {

                     System.out.print(new String(c,0,len));

              }*/

              br.close();

       }

}

用BufferedReader和BufferedWriter复制文件

package ioStreamDemo;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

 

/*

 * 用BufferedReader和BufferedWriter复制文件

 * 读一行,写一行

 */

public class Copy1 {

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

              BufferedReader br = new BufferedReader(new FileReader("G:\\java\\src.txt"));

              BufferedWriter bw = new BufferedWriter(new FileWriter("G:\\java\\desc.txt"));

              String len = null;

              while((len = br.readLine()) != null) {

                     bw.write(len);

                     bw.newLine();

              }

              bw.close();

              br.close();

       }

}

集合对象Properties:

package io04;

 

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Properties;

import java.util.Set;

 

/*

 * 集合对象Properties继承自HashTable,实现Map接口

 * 泛型是固定的<String,String>

 * 可以和IO对象结合使用,实现数据的持久存储

 */

public class PropertiesDmeo {

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

//           function();

//           load();

              store();

       }

       /*

        *Properties的特有方法store

        *store(OutputStream out,String s)

        *store(Writer w,String s) s是改写文件的原因,不能写中文,一般不写

        *接收所有的字节或字符输出流,将集合中的键值对写回文件保存

        */

       private static void store() throws IOException{

              FileWriter fw = new FileWriter("G:\\java\\properties\\pro.properties");

              Properties pro = new Properties();

              pro.setProperty("name","lisi");

              pro.setProperty("age","1");

              pro.store(fw, "");

       }

       /*

        * Properties集合特有方法load

        * load(InputStream in)

        * load(Reader r)

        * 传递任意的字节或字符输入流

        * 流对象读取文件的键值对,保存到集合

        */

       private static void load() throws IOException {

              Properties pro = new Properties();

              FileReader fr = new FileReader("G:\\java\\properties\\pro.properties");

              pro.load(fr);

              System.out.println(pro);

       }

       /*

        * 使用Properties集合,存储键值对

        * setProperty(String key,String value) 相当于Map中的put

        * getProperty(String key) 通过键获取值

        */

       public static void function() {

              Properties p = new Properties();

              p.setProperty("日本","Honda");

              p.setProperty("Honda","锋范");

              p.setProperty("锋范","cvt");

              System.out.println(p.getProperty("日本"));

              System.out.println(p.getProperty("Honda"));

              System.out.println(p.getProperty("锋范"));

              System.out.println(p);

              //方法stringPropertyNames,将集合中的键存储带set中,类似于Map中的keySet

              Set<String> key = p.stringPropertyNames();

              for(String s : key) {

                     System.out.println(s+"  "+p.getProperty(s));

              }

       }

      

}

对象Person的序列化和反序列化

ObjectOutputStrea和ObjietOutputStream

 

package io04;

 

import java.io.Serializable;

//Person只有实现Serializable接口才能被序列化,标记性接口没有抽象方法

public class Person implements Serializable{

       //自定义***,类改变时不会改变***

       private static final long serialVersionUID = 3249235442L;

       private String name;

       private int age;

       private transient int id=1;//transient关键字只有一个用途,阻止序列化

 

      

       public Person(String name, int age, int id) {

              super();

              this.name = name;

              this.age = age;

              this.id = id;

       }

       public Person() {}

       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 int getId() {

              return id;

       }

       public void setId(int id) {

              this.id = id;

       }

       @Override

       public String toString() {

              return "Person [name=" + name + ", age=" + age + ", id=" + id + "]";

       }

      

      

      

}

package io04;

 

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

/*

 * IO流对象实现对象Person的序列化和反序列化

 * ObjectOutputStream实现对象的序列化

 * ObjietOutputStream实现对象的反序列化

 */

public class ObjectStreamDemo {

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

              function_out();

              function_in();

       }

 

       /*

        * 构造方法:ObjectInputStream(InputStream in)

        * 传递任意的字节输入流

        * Object readObject(Object obj) 读取对象

        */

       private static void function_in() throws IOException, ClassNotFoundException {

              ObjectInputStream ois = new ObjectInputStream(new FileInputStream("G:\\java\\person.txt"));

              Object obj = ois.readObject();

              //需要抛出ClassNotFoundException异常,必须有Person的class文件才能反序列

              System.out.println(obj);

              ois.close();

       }

 

       /*

        * 构造方法:ObjectOutputStream(OutputStream out)

        * 传递任意的字节输出流

        * void writeObject(Object obj) 写出对象的方法

        */

       private static void function_out() throws IOException {

              ObjectOutputStream oos = new ObjectOutputStream

                            (new FileOutputStream("G:\\java\\person.txt"));

              Person p = new Person("nihao",18,1);

              //必须实现Serializable接口,且静态的变量不能序列化,transient修饰的也不能序列化,打印值为0

              oos.writeObject(p);

              oos.close();

       }

}

 

打印流PrintWriter

package io04;

 

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

 

/*

 * 打印流

 *   PrintStream

 *   PrintWriter

 * 打印流的特点:

 *   1.此流不负责数据源,只负责数据目的

 *   2.为其他输入流添加功能

 *   3.永远不会抛出IO异常,但是可能会抛出其他异常

 *

 * 两个打印流的方法完全一致

 *   构造方法,就是打印流的输出目的端

 *   PrintStream

 *          构造方法:接受File类型,接收字符串文件名,接收字节输出流OutputStream

 * PrintWriter

 *          构造方法:接受File类型,接收字符串文件名,接收字节输出流OutputStream,接收字符输出流Writer

 */

public class PrintWriteDemo {

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

              //打印流,向File对象的数据目的写入数据

              File file = new File("G:\\java\\print.txt");

              PrintWriter pri = new PrintWriter(file);

              pri.println(100);//原样打印,写啥打印啥

              pri.write(100);//这是d

              pri.close();

              //向文件名写入数据

              PrintWriter p1 = new PrintWriter("G:\\java\\1.txt");

              p1.print("suibianxie");

              p1.close();

              //向字节输出流写入数据

              PrintWriter p2 = new PrintWriter(new FileOutputStream("G:\\java\\2.txt"));

              p2.println("    ");

              p2.close();

              //向字符输出流写入数据

              PrintWriter p3 = new PrintWriter(new FileWriter("G:\\java\\3.txt"));

              p3.println(22222);

              p3.close();

              function_auto();

       }

 

       /*

        * 打印流开启自动刷新功能

        * 需满足以下两个条件:

        *   1.输出的目的对象必须是流对象 OutputStream Writer

        *   2.必须使用println printf format三个方法中的一个    

        */

       private static void function_auto() throws IOException {

              PrintWriter pw = new PrintWriter(new FileWriter("G:\\java\\4.txt"),true);

              //true表示开启自动刷新

              pw.printf("i");

              pw.printf("love");

              pw.printf("you");

              pw.close();//不关闭也能刷新

       }

      

      

}

工具类FilenameUtils

package ioApache;

 

import org.apache.commons.io.FilenameUtils;

 

public class Commons_iodemo {

       public static void main(String[] args) {

             

              //String getExtension(文件名)  获取文件的扩展名

              String name = FilenameUtils.getExtension("a.txt.b");

              System.out.println(name);

             

              //String getName(文件名)        获取文件名

              String name2 = FilenameUtils.getName("你好世界.txt");

              System.out.println(name2);

             

              //boolean isExtension(文件名,后缀名)    判断文件是否以后缀名结尾,区分大小写

              boolean b = FilenameUtils.isExtension("nihao.txt", "txt");

              System.out.println(b);

       }

}

工具类FileUtils

package ioApache;

 

import java.io.File;

import java.io.IOException;

 

import org.apache.commons.io.FileUtils;

 

/*

 * FileUtils工具类方法

 */

public class Commons_iodemo2 {

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

              //String readFileToString(File src)   读取文本返回字符串

              String s = FileUtils.readFileToString(new File("g:\\mysql\\b.txt"));

              System.out.println(s);

             

              //writeStringToFile(File,String) 将字符串写到文件中(覆盖)

              FileUtils.writeStringToFile(new File("g:\\mysql\\b.txt"), "i love you");

             

              //copyFile(File,File)    复制文件

              FileUtils.copyFile(new File("g:\\mysql\\b.txt"), new File("g:\\mysql\\a\\a.txt"));

             

              //copyDirectoryToDirectory()  复制目录到另一个目录

             FileUtils.copyDirectoryToDirectory(new File("G:\\JavaTest"), new File("g:\\mysql\\b"));

       }

}