黑马程序员-java基础学习IO流1
1.IO(Input Output)流
1)IO流用来处理设备之间的数据传输
2)java对数据的操作是通过流的方式
3)java且用于操作流的对象都在IO包中
4)流按操作数据分为两种:字节流与字符流。
IO流常用基类
1)字节流的抽象基类:InputStream, OutputStream
2)字符流的抽象基类:Reader, Writer
注:由这四个类派生出来的子类名称都是以其父类名
作为子类名的后缀。
既然IO流是用于操作数据的,
那么数据的最常见体现形式是:文件。
例子
需求:在硬盘上,创建一个文件并写入一些文字数据。
*/
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw = new FileWriter("demo.txt");
//调用write方法,将字符串写入到流中。
fw.write("abcde");
//刷新流对象中的缓冲中的数据。
//将数据刷到目的地中。
//fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
//将数据刷到目的地中。
//和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();
}
}
.IO流(IO异常处理方式)
1.凡是能和设备上的数据发生关联的,调用底层资源的都会发生IOException。
2."K:\\demo.txt"没有K盘,会抛出出FileNotFoundException(系统找不到指定的路径)异常。
FileNotFoundException是IOException的子类。
3.初始化抛出异常,说明初始化失败,fw还为空,故不可调用对象的close()方法,
所以抛出NullPointerException异常,finally中一定要对关闭的流对象进行不等于空的判断。
例子:
/*
IO异常的处理方式。
*/
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw = null;//外部创建引用
try
{
/*如果在try内部写FileWriter fw=new FileWriter("demo.txt");
而不是在外部写FileWriter fw = null;
内部写fw = new FileWriter("demo.txt");
那么fw这个变量作用范围只是try语句块。
*/
fw = new FileWriter("demo.txt");//内部初始化
fw.write("abcdefg");
}
catch (IOException e)
{
System.out.println("catch:"+e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();//这句话也产生异常所以也要try
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
}
}
IO流(文件的续写)
1.FileWriter的加一个重载构造函数:
public FileWriter(String fileName,boolean append) throws IOException
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
参数:
fileName - 一个字符串,表示与系统有关的文件名。
append - 一个 boolean 值,如果为 true,则将数据写入文件末尾处,而不是写入文件开始处。
/*
演示对已有文件的数据续写。
*/
import java.io.*;
class FileWriterDemo3
{
public static void main(String[] args) throws IOException
{
//传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
FileWriter fw = new FileWriter("demo.txt",true);
fw.write("nihao\r\nxiexie");//windoe中“\r\n”为换行作用
fw.close();
}
}
IO流(文本文件读取方式一)
Reader--->FileReader(java.io包中)
1.Reader类
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
1)构造方法:
protected Reader() //protected说明只有子类可使用。
创建一个新的字符流 reader,其重要部分将同步其自身的 reader。
2)特有方法:
(1)abstract void close()
关闭该流并释放与之关联的所有资源。
(2)int read()
public int read()throws IOException
读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,
此方法一直阻塞。用于支持高效的单字符输入的子类应重写此方法。
返回:
作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),
如果已到达流的末尾,则返回 -1
(3)int read(char[] cbuf)
将字符读入数组。
2.FileReader类
1)public class FileReader extends InputStreamReader
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream。
2)构造函数:
public FileReader(File file) throws FileNotFoundException
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
/*
第一种方式:读一个字符,打印一个字符
*/
import java.io.*;
class FileReaderDemo
{
public static void main(String[] args) throws IOException
{
/*创建一个文件读取流对象,和指定名称的文件相关联。
要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException*/
FileReader fr = new FileReader("demo.txt");
//调用读取流对象的read方法。
//read():一次读一个字符。而且会自动往下读。
int ch = 0;
while((ch=fr.read())!=-1)//结束标志为-1;
{
System.out.println(
}
fr.close();
}
}
第二种方式:通过字符数组进行读取。
1.read(char[] chs)方法
public int read(char[] cbuf)
throws IOException将字符读入数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
参数:
cbuf - 目标缓冲区
返回:
读取的字符数,如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误
/*
第二种方式:通过字符数组进行读取。
*/
import java.io.*;
class FileReaderDemo2
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("demo.txt");
//定义一个字符数组。用于存储读到字符。
//该read(char[])返回的是读到字符个数。
char[] buf = new char[1024];
int num = 0;
while((num=fr.read(buf))!=-1)
{
System.out.println(new String(buf,0,num));
}
fr.close();
}
}
补充:软件开发 , Java ,