------- android培训、java培训、期待与您交流! ----------
IO流的三种分类方式:
1.按照流向来分:
输入流:只能从中读取字节数据,不能向其写出数据
输出流:只能向其写入字节数据,不能从中读取数据
2.按照流所处理的数据类型划分:可分为:
字节流:用于处理字节数据。
字符流:用于处理Unicode字符数据据。
3.按照格式可以分为:
节点流(低级流):可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流。
处理流(高级流):可以对一个已存在的流的连接和封装,通过所封装的流的功能实现数据读写功能的流。
字符流和字节流:
字节流两个基类:InputStream OutputStream
字符流两个基类:
Reader Writer
既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件.
需求:在硬盘上,创建一个文件并写入一些文字数据。
demo1:
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();
}
}
/*
第二种方式:通过字符数组进行读取。
*/
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();
}
}
/*
IO异常的处理方式。
*/
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw = null;
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();
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
}
字节流:Demo2
InputStream OutputStream
需求,想要操作图片数据。这时就要用到字节流。
复制一个图片.
*/
import java.io.*;
class FileStream
{
public static void main(String[] args) throws IOException
{
readFile_3();
}
public static void readFile_3()throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
// int num = fis.available();
byte[] buf = new byte[fis.available()];//定义一个刚刚好的缓冲区。不用在循环了。
fis.read(buf);
System.out.println(new String(buf));
fis.close();
}
public static void readFile_2()throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1)
{
System.out.println(new String(buf,0,len));
}
fis.close();
}
缓冲流:
BufferedReader ->Reader
BufferedWriter
BufferedInputStream ->InputStream
BufferedOutputStream
Print流:
1.Print流只有输出流没有输入流,PrintWriter和PrintStream分别针对字符和字节
2.提供print和println方法,用于多种数据类型的输出。
3.输出操作不会抛出异常。
4.PrintWriter和PrintStream可设置自动刷新功能
Object流:
1.序列化,用于直接将Object写入或者读出。
2.static和transient关键字修饰的属性是不能被序列化的。
3.需要序列化的类必须实现Serializable接口或者Externalizable
4.方法:
-writeObject(Object obj)
-Object readObject();
若想得到Object的原始类型,需要通过强制转型。
特殊的文件流(RandomAccessFile):
1.RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或插入数据
2.RandomAccessFile同时实现了DataInput和DataOutput接口,所以可以用它来读写文件
3.构造方法
RandomAccessFile(File file,String mode);
RandomAccessFile(String file,String mode);
通过三个明确,确定使用哪个流。
1,明确源和目的。
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer。
2,操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘。键盘
目的设备:内存,硬盘,控制台。
需求:从键盘录入并输出,输入“exit”结束。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class PrintWriterDemo {
public static void main(String args[]) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(System.out);
String line=null;
while((line=br.readLine())!=null){
if(line.equals("exit")){
break;
}else{
pw.println(line);
pw.flush();
}
}
br.close();
pw.close();
}
}