------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员————Java基础日常笔记---IO流一
1.1 IO的由来:
先什么是IO流呢?
java对数据的操作;
IO流用来处理设备之间的数据传输, 并且操作流的对象都在IO包中,
而对数据的操作: 读和写;
IO流按照操作的数据分为:字节流与字符流(InputStream,OutputStream和Reader,Writer)
按流向分:输入流,输出流,
字符流: 字节流+编码表;
好处:可以在内部去融合编码表,
就是你读到的字节数据,你到底是查那个GBK,还是UTF-8,,可以由你来指定,
所以来处理文字的时候,就可以变得方便,
字符流对象里面融合了编码表,只有文字识别的编码,如果处理图片的话,就用字节流,
通用字节流。
1.2 FileWriter既然IO流式用于操作数据的,
那么数据的最常见的体现形式是:文件
那么先以操作文件为主来演示:
需求:在硬盘上,创建一个文件并写入一些文字数据
代码如下:
<span style="font-size:12px;">import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象,该对象一被初始化必须要明确要操作的文件。
//new在内存中产生一个对象,同时在指定的目录下, 会产生一个指定名称的文件。
//而且该文件会被创建到指定的目录下, 如果该目录下已有同名的文件,将被覆盖
//其实该步就是在明确数据要存放的目的地。
FileWriter fw=new FileWriter("E:\\demo.txt");//写字得先有纸
//调用write方法,将字符串写入到流中,
fw.write("abcde");
//刷新流对象中的缓冲中的数据
//将数据刷到目的地中(指定的目录demo.txt)。
//fw.flush();
fw.write("hehe");
//fw.flush();
/*
关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据
将数据刷到目的地中,
和flush区别:flush刷新后 流可以继续使用,close刷新后,会将流关闭。
*/
fw.close();//关闭此流,但要先刷新它。
//fw.write("hehe");fw.flush();关闭了流,如果还调用write方法,这里会出现异常
}
}</span><span style="font-size: 14px;">
</span>
运行结果:
Windows本身就具备这个动作,java也可以操作, 说明java在调用windows系统的这个写的动作,这个就是所说的流资源。
其实, java不可以往系统中写数据的, windows和UNIX系统写数据的方式不同,所以Java靠系统内部的方式来完成数据的书写,
java在调用windows系统的这个写的动作来完成数据的建立,
使用之后, 就要释放出来,那么久有个动作一定要做, close(),
在关闭之前, 需要先调用一次flush().然后把资源到底层关闭就ok;
然而在调用底层资源的时候,容易发生异常,那么该如何处理呢?1.3 IO异常处理
思路分析: 1,有三个代码块, 在try中的代码块, 其他的代码块中访问不到,所以在外边建立引用, 在try中建立初始化,这样fw就作用于整个函数,
3, 有多个资源, 就需要分别的去关 资源
代码如下:
//IO流异常处理
import java.io.*;
class FileWriterDemo1
{
public static void main(String[] args) //throws IOException
{
FileWriter fw=null;//fw就作用于整个函数,
try
{
fw=new FileWriter("E:\\demo.txt");// FileNotFoundException
//fw=new FileWriter("demo.txt");
fw.write("abcdefg");
}
catch (IOException e)
{
System.out.println("catch1"+e.toString());
}
finally{//有多个流,需要分别的去关资源 ,
try
{
if(fw!=null)
fw.close();
}
catch (IOException e)
{
System.out.println("catch2"+e.toString());
}
}
}
}
结果:
但是发现,如果是写入同一个文件的话, 会将以前的数据覆盖。
1.4 文件的续写
在文件的基础上加数据,
代码如下:
//文件的续写
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args) //throws IOException
{
FileWriter fw=null;//fw就作用于整个函数,
try
{
fw=new FileWriter("E:\\demo.txt",true);// FileNotFoundException
//fw=new FileWriter("demo.txt");
fw.write("可以续写了");
}
catch (IOException e)
{
System.out.println("catch1"+e.toString());
}
finally{//有多个流,需要分别的去关资源 ,
try
{
if(fw!=null)
fw.close();
}
catch (IOException e)
{
System.out.println("catch2"+e.toString());
}
}
}
}
运行结果:
1.5 文本文件的读取
第一种读取方式:使用read()方法读取文本文件数据
第二种读取方式:想读多个方式二:通过字符数组进行读取,定义一个字符数组,用于存储读到的字符,
读read(char[])返回的是读到字符的个数
代码如下:
import java.io.*;
class FileReaderDemo
{
public static void main(String[] args)
{
//创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生FIleNotFoundException
FileReader fr=null;
try
{
fr=new FileReader("demo.txt");
//作为整数读取的字符,如果已到达流的末尾,则返回 -1
//调用读取流对象的read方法
//read(),一次读一个字符,而且会自动往下读。
//int ch=fr.read();
//想读多个方式一:
/*
int ch=0;
while((ch=fr.read())!=-1)
System.out.println("ch="+(char)ch);
*/
//想读多个方式二:通过字符数组进行读取
//定义一个字符数组,用于存储读到的字符,
//读read(char[])返回的是读到字符的个数
//char[] buf=new char[3];
char[] buf=new char[1024];
int num=0;
while((num=fr.read(buf))!=-1){
//System.out.println("num="+num+"......"+new String(buf));
System.out.println("num="+num+"......"+new String(buf,0,num));
}
}
catch (IOException e)
{
System.out.println(e);
}
finally{
try
{
if(fr!=null)
fr.close();
}
catch (IOException e)
{
System.out.println(e);
}
}
}
}
方式一结果: