第十六天总结0411

时间:2022-11-12 17:13:00

第十六天总结
1.IO
IO即IO流,这个单词是Input和Output的缩写
IO流用来处理设备之间的数据传输,JAVA对数据的操作时通过流的方式进行的
JAVA用于操作流的对象都在IO包当中。
流按照操作对象分为:字节流和字符流
流按照流向分为:输入流和输出流
早起在进行数据操作的时候只有字节流,后期才出现字符流
计算机里操作的数据都是以字节的形式,但是后期发现在进行文字操作的时候由于各国的语言不同,所以对应的与计算机之间的编码转化也不一样,比如说GBK的码表能识别中文,可是不能识

别其他国家的文字,所以JAVA用的Unicode码表,该码表是国际化标准组织所指定的。
因为编码形式的不同才出现的字符流,字节流同样可以处理文字,但是没有字符流高效。
IO流的顶层有四个常用的基类:
字节流的抽象基类:InputStream,OutputSteam
字符流的抽象基类:Reader,Writer
——————————————————————————————
/*
Deao要求:将自定义文字数据写入到硬盘上
操作步骤:
a.找到IO包中对应的对象,因为是文字对象,所有用字符流写入用Writer
b.在API中找到专门用于操作文件的对象,FileWriter
流对象在创建的时候,必须要有一个目的,没目的,不知道数据往哪写,所以一定要在构造函数里表明
在处理IO流的时候一定要注意IO异常,因为这很常见。
*/
/*
简要描写字符流的输入流程:
*/
import java.io.*;
class  FileWriterDemo
{
 public static void main(String[] args)
 {
  FileWriter fw=null;
  //因为要抛异常,所以对象引用必须先定义在外面,在try,中定义的对象对外是无效的
  try
  {
   fw=new FileWriter("F:/java32/0411/word.txt");//将引用实例化,注意构造函数
   //上面的文件目录后如果加一个“,true”则表示继续操作原有的word.txt文件而不覆盖
   fw.write("abcde");//将数据写入流
   fw.flush();//刷新流,即把流中的“abcde”存到文件中,可以用多次
   fw.write("fighe/r/nddaddf");//刷新完可继续接着前面的数据写入
   //上面的/r表示回车,/n表示换行,放一起就是回车换行

  }
  catch (IOException e)//抛出异常
  {
   System.out.println(e.toString());
  }
  finally
  {
   if (fw!=null)//只有当fw对象不为空的时候,关闭该流才有意义
   {
    try
    {
     fw.close();//关闭流,关闭前该方法会先将流中的数据刷新到目标文件中
    }
    catch (IOException e)//抛出关闭流时的异常
    {
     System.out.println(e.toString());
    }
   }
  }
 }
}
————————————————————————————
/*
简要描述字符输出流读取数据的过程
数组取法
*/
import java.io.*;
class FileReaderDemo 
{
 public static void main(String[] args)
 {
  FileReader fr=null;//新建一个fr的引用
  try
  {
   fr=new FileReader("F:/java32/0411/word.txt");
   //将引用实例化,注意构造函数,必须要有一个读取的目标
   char[] arr=new char[1024];
   //定义一个数组用于暂时存储读取出的数据,长度一般是1024或者它的倍数,1024即2048个字节,即2K
   //由于数组长度是固定,所以如果所要读的数据超出了数组的长度,则要继续读取
   //我们仍然可以用原数组读取,覆盖掉原数组已有的数据
   int num=0;
   while ((num=fr.read(arr))!=-1)
    //当读到数据结尾的时候,read方法返回的是读取到的字符的个数,如果返回-1,则代表数据读完了
   {
    System.out.println(new String(arr,0,num));
    //为了节约内存空间,我们不需要把数组内所有的元素都转化成字符串,因为有可能数组并没有放满
    //所以我们只需要取该数组的0角标为到num角标位,意思是取了多少我读多少
   }

  }
  catch (IOException e)
  {
   System.out.println(e.toString());
  }
  finally
  {
   if (fr!=null)//只有流不为空的时候,关闭才有意义
   {
    try
    {
     fr.close();
    }
    catch (IOException e)
    {
     System.out.println(e.toString());
    }
   }
  }
 }
}
————————————————————————————
/*
另外一种读字符的方式
一个一个的读取
跟上面的数组读取方法结果一致,但是这种方法明显没有数组读取方便效率,
因为一次只读一个字符,所以要循环很多次,所以不实用
*/
import java.io.*;
class FileReaderDemo2
{
 public static void main(String[] args)
 {
  FileReader fr=null;
  try
  {
   fr=new FileReader("F:/java32/0411/word.txt");
   int ch=0;
   while ((ch=fr.read())!=-1)
    //read方法在这返回的也是int型的,但不在是个数,而是作为整数读取的字符,
    //即字符在Unicode上对应的值,范围在0到65535之间,如果返回-1.则到达结尾
   {
    System.out.print((char)ch);//这里注意,要强转,否则打印的是编码形式
   }
   System.out.println();
  }
  catch (IOException e)
  {
   System.out.println(e.toString());
  }
  finally
  {
   if (fr!=null)
   {
    try
    {
     fr.close();
    }
    catch (IOException e)
    {
     System.out.println(e.toString());
    }
   }
  }
 }
}
————————————————————————————
/*
需求:把一个文件拷贝到另外目录底下
思路:要先读取,该文件的数据,然后再制定目录底下建立一个相同的文件
   为了效率和节约内存空间,我们可以用数组读取法,将数组当成一个中间
   媒介,缓冲区的存在,提高效率
*/
import java.io.*;
class CopyDemo
{
 public static void main(String[] args)
 {
  copyTxt();
 }
 public static void copyTxt()
 {
  FileReader fr=null;
  FileWriter fw=null;
  try
  {
   fr=new FileReader("F:/java32/0411/word.txt");
   fw=new FileWriter("F:/java32/0409/word.txt");
   char[] arr=new char[1024];
   int num=0;
   while ((num=fr.read(arr))!=-1)
   {
    fw.write(arr,0,num);
   }
  }
  catch (IOException e)
  {
   System.out.println(e.toString());
  }
  finally
  {
   if (fr!=null)
   {
    try
    {
     fr.close();
    }
    catch (IOException e)
    {
     System.out.println(e.toString());
    }
   }
   if (fw!=null)
   {
    try
    {
     fw.close();
    }
    catch (IOException e)
    {
     System.out.println(e.toString());
    }
   }
  }
 }
}
————————————————————————
/*
实用输入换冲区来提高输入的效率,和节省内存的空间
*/
import java.io.*;
class BufferedWriterDemo
{
 public static void main(String[] args)
 {
  FileWriter fw=null;
  BufferedWriter bw=null;
  try
  {
   fw=new FileWriter("F:/java32/0411/xxx.txt");
   bw=new BufferedWriter(fw);
   for (int x=1;x<=10 ;x++ )
   {
    if(x!=10)
    {
     bw.write(x+".wefafedagageagwgasdasd;");
     bw.newLine();//行分隔符
     bw.flush();
    }
    else
     bw.write(x+".wefafedagageagwgasdasd."); 
   }

  }
  catch (IOException e)
  {
   System.out.println(e.toString());
  }
  finally
  {
   if (bw!=null)
   {
    try
    {
     bw.close();//关的是流对象
    }
    catch (IOException e)
    {
     System.out.println(e.toString());
    }
   }
  }
 }
}