Java day 9

1、IO流:用来处理设备之间的数据传输(文件复制,上传文件和下载文件)

2、IO流分类:

  (1)输出流(FileWriter):
         A、往文件中写数据,传递一个文件名称
            a、构造方法:FileWriter(String fileName)
            b、成员方法:void write(String str);void fiush();void close()
         B、输出流写数据的步骤:
            a、创建输出流对象;(调用系统资源创建了一个文件;创建输出流对象;把输出流对象指向文件)
            b、调用输出流对象的写数据的方法;
            c、释放资源
         C、FileWriter写数据的方法:
            a、void write(String str):写一个字符串数据
            b、void write(String str,int index,int len):写一个字符串中的一部分数据
            c、void write(int ch):写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值,如'a',97
            d、void write(char[ ] chs):写一个字符数组数据
            e、void write(char[ ] chs,int index,int len):写一个字符数组数据的一部分数据
          例:
                 package com.itheima;
                 import java.io.FileWriter;
                 import java.io.IOException;
                 public class FileWriterTest {
                   public static void main(String[] args) throws IOException {
	                     FileWriter fw=new FileWriter("b.txt");
	                     //void write(String str):写一个字符串数据
	                     fw.write("abcde");
	                     //void write(String str,int index,int len):写一个字符串中的一部分数据
	                     fw.write("abcde",0,5);
	                    //void write(int ch):写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值,如'a',97
	                     fw.write('a');
	                     fw.write(97);
	                   //void write(char[] chs):写一个字符数组数据
	                     char[] chs={'a','b','c','d','e'};
	                     fw.write(chs);
	                  //void write(char[] chs,int index,int len):写一个字符数组数据的一部分数据
	                     fw.write(chs,2,3);
	                  //释放资源
	                     fw.close();
                  }

                 }
     注意:
        a、相对路径:相对当前项目而言的,在项目的根目录下(例:a.txt)
        b、绝对路径:以盘符开始的路径(例:d:\ a.txt)
(2)输入流(FileReader):
      A、往文件中读数据到控制台,传递一个文件名称
         a、构造方法: FileReader(String fileName)
         b、成员方法:int read();int read(char[ ] cbuf):一次读一个字符数组的数据,返回的是实际读取字符的个数
           例:
             package com.itheima;
             import java.io.FileReader;
             import java.io.IOException;
             public class FileReaderDemo2 {
             public static void main(String[] args) throws IOException {
	     //创建输入流对象
	     FileReader fr=new FileReader("fr2.txt");
	    //调用输入流对象的读数据方法
	   //int read(char[] cbuf):一次读一个字符数组的数据,返回的是实际读取字符的个数
	/*
	 * char[] chs=new char[5]; 
	 * //第一次读数据 
	 * int len=fr.read(chs);
	 * System.out.println("len:"+len); 
	 * System.out.println(new String(chs,0,len));
	 * //第二次读数据 
	 * len=fr.read(chs); 
	 * System.out.println("len:"+len);
	 * System.out.println(new String(chs,0,len)); 
	 * //第三次读数据 
	 * len=fr.read(chs);
	 * System.out.println("len:"+len); 
	 * System.out.println(new String(chs,0,len));
	 */
  	   //char[] chs=new char[5];
	   char[] chs=new char[1024];//这里可以是1024及其整数倍
               int len; //1、fr.read(chs);//2、len=fr.read(chs); //3、len!=-1 
               while((len=fr.read(chs))!=-1){
	   System.out.println(new String(chs,0,len)); 
	        }
	//释放资源
  	fr.close();
           }
           }
    B、输入流读数据的步骤:
       a、创建输入流对象
       b、调用输入流对象的读数据的方法
       c、释放资源 
    注意:
      (1)读数据首先要看文件是否存在,如果报错java.io.FileNotFoundException: fr.txt (系统找不到指定的文件),则在该项目下创建一个file文件
      (2)读数据/写数据都要导入相应的包,并抛出异常
    *close()和flush()方法的区别:
      (1)flush():刷新缓冲区,流对象还可以继续使用;
      (2)close():先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用了

3、实现数据的换行:

 (1)windows:
;
 (2)linux:
;
 (3)mac:
  *数据的追加写入:FileWriter(String fileName,boolean append)

4、输入/输出缓冲流:

 (1)BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供各个字符、数组和字符串的高效写入
 (2)BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现各个字符、数组和行的高效读取
 (3)缓冲流读取数据的两种方式:
         a、一次读写一个字符:
          例:
                 int ch;
	     while((ch=br.read())!=-1) { 
	     System.out.print((char)ch); 
	     }
         b、一次读写一个字符数组:
         例:
                char[] chs=new char[1024];
	    int len;
	    while((len=br.read(chs))!=-1) {
            System.out.print(new String (chs,0,len));
	    }
       注意:在创建一个输出缓冲流对象时,后面一定要记得加new FileWriter,如:BufferedWriter bw=new BufferedWriter(new FileWriter("bw.txt"))

5、缓冲流的特殊功能:

 (1)BufferedWriter
             void newLine():写一个换行符,这个换行符由系统决定
 (2)BufferedReader
             String readLine():一次读取一行数据,但不读取换行符

6、复制文本文件的5种案例:

     package com.itheima;
     import java.io.BufferedReader;
     import java.io.BufferedWriter;
     import java.io.FileReader;
     import java.io.FileWriter;
     import java.io.IOException;
     public class CopyFileDemo {
       public static void main(String[] args) throws IOException {
	    //创建输入流对象
	/*
	 * FileReader fr=new FileReader("FileWriterDemo.java"); //创建输出流对象 FileWriter
	 * fw=new FileWriter("Copy.java"); //一次读写一个字符数据 int ch;
	 * while((ch=fr.read())!=-1){ fw.write(ch); }
	 * 
	 * //一次读写一个字符数组 char[] chs=new char[1024]; int len;
	 * while((len=fr.read(chs))!=-1){ fw.write(chs,0,len); }
	 * 
	 * //释放资源 fw.close(); fr.close(); } }
	 */
	

	/*
	 * method1("FileWriterDemo.java","Copy.java");//需要修改5个地方
	 * method2("FileWriterDemo.java","Copy.java");
	 * method3("FileWriterDemo.java","Copy.java");
	 * method4("FileWriterDemo.java","Copy.java");
	 * method5("FileWriterDemo.java","Copy.java");
	 */
	 String srcFileName="FileWriterDemo.java";
	 String destFileName="Copy.java";
	 method1(srcFileName,destFileName);//只需要修改一个地方
	 method2(srcFileName,destFileName);
	 method3(srcFileName,destFileName);
	 method4(srcFileName,destFileName);
	 method5(srcFileName,destFileName);
	
      }
         //缓冲流:一次读写一个字符串
       public static void method5(String srcFileName,String destFileName) throws IOException {
                //创建输入缓冲流对象
	       BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ;
		//创建输出缓冲流对象
	       BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ;
		//一次读写一个字符串
	       String line;
		//1、br.readLine()
		//2、line=br.readLine()
		//3、line!=null
		while((line=br.readLine())!=null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		//释放资源
		  bw.close(); 
		  br.close();
	}
         //缓冲流:一次读写一个字符数组
      public static void method4(String srcFileName,String destFileName) throws IOException {
	         //创建输入缓冲流对象
	      BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ;
	        //创建输出缓冲流对象
	      BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ;
	       //一次读写一个字符数组
	      char[] chs=new char[1024]; 
	      int len; 
	      while((len=br.read(chs))!=-1){
	      bw.write(chs,0,len);
	       }
	      //释放资源
	     bw.close(); 
	     br.close();
       }
          //缓冲流:一次读写一个字符
	public static void method3(String srcFileName,String destFileName) throws IOException {
		//创建输入缓冲流对象
		BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ;
		//创建输出缓冲流对象
		BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ;
		//一次读写一个字符
		 int ch;
		 while((ch=br.read())!=-1){ 
		        bw.write(ch);
		  }
		//释放资源
		  bw.close(); 
		  br.close();
	}
               //基本流:一次读写一个字符数组
	public static void method2(String srcFileName,String destFileName) throws IOException {
		//创建输入流对象
		FileReader fr=new FileReader (srcFileName);
		//创建输出流对象
		FileWriter fw=new FileWriter(destFileName);
		//一次读写一个字符数组
		 char[] chs=new char[1024]; 
		 int len; 
		 while((len=fr.read(chs))!=-1){
		        fw.write(chs,0,len);
		 }
		//释放资源
		  fw.close(); 
		  fr.close();
	}
              //基本流:一次读写一个字符
     public static void method1(String srcFileName,String destFileName) throws IOException {
	   //创建输入流对象
	FileReader fr=new FileReader (srcFileName);
	//创建输出流对象
	FileWriter fw=new FileWriter(destFileName);
	//一次读写一个字符
	 int ch;
	 while((ch=fr.read())!=-1){ 
	        fw.write(ch);
	  }
	//释放资源
	  fw.close(); 
	  fr.close();
}

}

原文地址:https://www.cnblogs.com/cqxljj/p/10214473.html