您的位置:首页 > 职场人生

黑马程序员__java基础__IO流(字节流、字符流)

2015-06-15 17:06 656 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
IO流
一.概述
(1)IO流用来处理设备之间的数据传输。Java对数据的操作是通过流的方式。Java用于操作流的对象都在IO包中。
(2)流按操作数据分为两种:字节流和字符流。
        1.字节流:InputStream和OutputStream
        2.字符流:Reader和Writer
(3)流按流向分为:输入流和输出流。
 
      1.输入流:InputStream和Reader
 
      2.输出流:OutputStream和Writer
字符流

一.字符流的描述
(1)字符流中的对象融合了编码表。使用的是默认的编码,即当前系统的编码。

(2)字符流只用于处理文字数据,而字节流可以处理媒体数据。

二.字符流的读写
(1)写入字符流步骤:

 
      1.创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件。且该目录下如果已有同名文件,则同名文件将              被覆盖。其实该步就是在明确数据要存放的目的地。
 
      2.调用write(String s)方法,将字符串写入到流中。
 
      3.调用flush()方法,刷新该流的缓冲,将数据刷新到目的地中。
 
      4.调用close()方法,关闭流资源。但是关闭前会刷新一次内部的缓冲数据,并将数据刷新到目的地中。
例子:
public class FileWriter1
{
public static void main(String[] args) throws IOException
{
FileWriter fw=new FileWriter("d:/demo.txt");//括号内必须有数据存储的目的地
fw.write("dh");//写入数据
fw.flush();//进行刷新,将数据直接写入到目的地中
fw.close();//关闭流,关闭资源
}
}
如果想续写,在构造函数中加入true即可。如:
import java.io.*;
public class FileWriter1
{
public static void main(String[] args) throws IOException
{
FileWriter fw=new FileWriter("d:/demo.txt",true);
fw.write("fyf");
fw.flush();
fw.close();
}
}
(2)读取字符流步骤
        1.创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件已经存在,若不存在,将会发生异常。
        2.调用读取流对象的read()方法。read():一次读一个字符,且会继续往下读。
 
         第一种读取方式:使用read()方法读取文本文件数据。
 
         第二种读取方式:使用read(char[])方法读取文本文件数据。
 
      3.读取后要调用close方法将流资源关闭。
read()方法:
import java.io.*;
public class FileReadre1
{
public static void main(String[] args) throws IOException
{
FileReader fw=new FileReader("d:/demo.txt");//括号内为读取的源文件
int num=0;//read方法的返回值是Int类型
while((num=fw.read())!=-1)//read方法一次读一个字符,且会继续往下读
{
System.out.println((char)num);//强转为字符型
}
fw.close();
}
}
read(char[])方法:
import java.io.*;
public class FileReadre1
{
public static void main(String[] args) throws IOException
{
FileReader fw=new FileReader("d:/demo.txt");//括号内为读取的源文件
char[] arr=new char[1024];//定义一个字符型数组,用来接收read方法读出的字符
int num=0;
while((num=fw.read(arr))!=-1)//read方法读到的字符装到arr数组中
{
System.out.println(arr);
}
fw.close();
}
}
拷贝文件:
import java.io.*;
public class FileReadre1
{
public static void main(String[] args)
{
FileReader fr=null;
FileWriter fw=null;
try
{
fr=new FileReader("d:/demo.txt");
fw=new FileWriter("d:/demo2.txt");
char[] arr=new char[1024];
int num=0;
while((num=fr.read(arr))!=-1)
{
fw.write(arr, 0, num);
}
}
catch(IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
try
{
fr.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}
三.字符流的缓冲区——BufferedReader和BufferedWriter
(1)缓冲区的出现提高了对数据的读写效率。所以在缓冲区创建前,要先创建流对象。即先将流对象初始化到构造函数中。
(2)缓冲技术原理:此对象中封装了数组,将数据存入,再一次性取出。
(3)写入字符流缓冲区步骤:
        1.创建一个字符写入流对象。
        2.将字符写入流对象作为参数传递给缓冲区的构造函数。
        3.调用write方法写入数据到指定文件。然后调用newLine()方法另起一行。之后调用flush()方法进行刷新。
        4.关闭缓冲区,就是在关闭缓冲区中的流对象。
(4)读取字符流缓冲区步骤:
 
      1.创建一个读取流对象和文件相关联。
 
      2.将字符读取流对象作为参数传递给缓冲区对象的构造函数。
 
      3.调用该缓冲区提供的readLine方法一行一行读取,如果到达文件末尾,则返回null。
 
      4.关闭流资源。
(5)通过缓冲区复制一个文本文件:
import java.io.*;
public class BufferedDemo
{
public static void main(String[] args)throws IOException
{
FileReader fr=new FileReader("d:/demo.txt");//创建读取流对象
FileWriter fw=new FileWriter("d:/demo1.txt");
BufferedReader br=new BufferedReader(fr);//把读取流对象作为参数传给读取流缓冲区
BufferedWriter bw=new BufferedWriter(fw);
String s=null;
while((s=br.readLine())!=null)//readLine()返回值是字符串,且会自动往下读
{
bw.write(s);
bw.newLine();//换行
bw.flush();//刷新
}
bw.close();//关闭流资源
br.close();
}
}

字节流
一.字节流的描述
(1)字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。
(2)由于媒体文件数据中都是以字节存储的,字节流对象可直接对媒体文件的数据写入到文件中,而不用再进行刷流动作。
(3)InputStream特有方法:int available();//返回文件中的字节个数
(4)复制一图片:
import java.io.*;
public class InputStream1
{
public static void main(String[] args)throws IOException
{
FileInputStream in=new FileInputStream("d:/aa.jpg");
FileOutputStream out=new FileOutputStream("d:/d.jpg");

//第一种用数组的方式
byte[] arr1=new byte[1024];
int num1=0;
while((num1=in.read(arr1))!=-1)
{

out.write(arr1, 0, num1);
}

//第二种利用available方法指定数组长度
byte[] arr2=new byte[in.available()];
int num2=0;
while((num2=in.read(arr2))!=-1)
{

out.write(arr2, 0, num2);
}
out.close();//关闭流资源
in.close();
}
}
二.字节流缓冲区
(1)提高了字节流的读写效率。
(2)读写特点: read()会将字节byte型值提升为int型值;write()会将int型强转为byte型,即保留二进制数的最后八位。
(3)用字节流缓冲流复制一段声音:
import java.io.*;
public class BufferedStream1
{
public static void main(String[] args)throws IOException
{
FileInputStream in=new FileInputStream("d:/a.mp3");
FileOutputStream out=new FileOutputStream("d:/d.mp3");
BufferedInputStream bin=new BufferedInputStream(in);
BufferedOutputStream bout=new BufferedOutputStream(out);

byte[] arr=new byte[1024];
int num=0;
while((num=bin.read(arr))!=-1)
{

bout.write(arr, 0, num);
}
bout.close();
bin.close();
}
}

流操作规则
一.键盘录入
(1)标准输入输出流:
        1.System.in:对应的标准输入设备,键盘。System.in的类型是InputStream.
        2. System.out:对应的是标准的输出设备,控制台 System.out的类型是PrintStream是OutputStream的子类。
(2)转换流:
 
      1.字符流与字节流之间的桥梁,方便了字符流与字节流之间的操作。
 
      2.字节流中的数据都是字符时,转成字符流操作更高效。
 
      3.InputStreamReader:字节到字符的桥梁,解码。 OutputStreamWriter:字符到字节的桥梁,编码。 
  
(3)键盘录入的数据,控制台输出数据:
import java.io.*;
public class BufferedStream1
{
public static void main(String[] args)throws IOException
{
//字节流转向字符流
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//字符流转向字节流
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=br.readLine())!=null)
{
if("over".equals(line))//输入的数据中包含over,则终止循环
break;
bw.write(line.toUpperCase());//写入转化成大写的数据
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
二.流操作规则
(1)明确源和目的: 源:InputStream
和 Reader。目的:OutputStream和Writer。
(2)明确数据是否是纯文本数据:源:是纯文本Reader
,否InputStream。目的:是纯文本Writer,否OutputStream 。
(3)明确具体的设备:
        1.源设备:硬盘:File;键盘:System.in;内存:数组;网络:Socket流。
 
      2.目的设备:硬盘:File;控制台:System.out;内存:数组; 网络:Socket流
(4)是否需要其他额外功能 :是否需要高效(缓冲区):是,就加上buffer 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: