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

黑马程序员----IO流

2014-02-14 10:20 302 查看
------- android培训java培训、期待与您交流!
----------

java中的流可以按不同角度进行分类:

1、从操作数据的流不同分为:字节流和字符流

2、从流向不同分为:输入流,输出流

IO流常用基类:

     (1)字节流

          输出字节流:OutputStream:字节写入流抽象类

                   |--->FileOutputStream字节写入流

                   |--->BufferedOutputStream: 字节写入流缓冲区

                   |--->PrintStream:  打印流

          输入字节流:InputStream:字节读取流抽象类

                   |--->FileInputStream:  字节读取流

                   |--->BufferedInputStream: 字节读取流缓冲区

     (2)字符流    

          输出字符流:Writer:字符写入流的抽象

                   |--->FileWriter:  字符写入流

                   |--->BufferedWriter:  字符写入流缓冲区

                   |--->OutputStreamWriter:字符通向字节的转换流(涉及键盘录入时用)

                   |--->OutputStreamWriter:      打印流,可处理各种类型的数据

          输入字符流:Reader: 字符读取流的抽象类

                   |--->FileReader:  字符读取流

                        |--->LineNumberReader:跟踪行号的缓冲字符读取流

                   |--->BufferedReader:   字符读取流缓冲区

                   |--->InputStreamReader:

                                  字节通向字符的转换流(涉及键盘录入时用)

 

字符流总结:

文件读取和写入:FileReader, fileWriter,

分别提供常用的两种读写方式:

第一种:FileReader提供 fr.read();一个字符一个字符的读取,返回读取的个数(int c),当返回-1时表示文件已读取结束。理所当然fileWriter也提供了每次写入一个字符的方法,fw.write(int c);

其中参数表示  :c - 指定要写入字符的 int。

第二种:FileReader提供读取字符数组方法,fr.read(char [] buf) 返回读取的字符数,如果已到达流的末尾,则返回 -1。fileWriter也提供了写入数组的方法 fw.write(char[] buf,int off,int len);

buf - 字符缓冲区

off - 开始写入字符处的偏移量

len - 要写入的字符数

 

字符流的缓冲区: 

缓冲区的出现了读取数据的效率。

对应的类:BufferedReader  BufferedWriter

缓冲区要结合流才能使用。是在流的基础上进行加强。

 

Buffered缓冲流::BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流。

缓冲流的作用:避免每次跟磁盘打交道,提高数据的访问效率。(提高流的操作效率),所以在缓冲区之前必须要有流对象。

缓冲区中有个跨平台换行符方法newLine();

利用缓冲区技术字符流读取操作。(BufferedReader)

        步骤:定义流对象与被读取文件相关联FileReader fr=new FileReader("f:\\1.txt");

                 定义缓冲区,把流对象作为参数放进缓冲区:

                BufferedReader br=new BufferedReader(fr);

                利用while循环,一行一行的读取(br.readLine();此处返回类型是一个String,如果返回为null说明已读取到末尾处)

            String  len=null;

            while((len=br.readLine())!=null){

                  System.out.println("读出了:"+len);

}

               最后关闭资源。

 

  readLine原理:无论是读一行,获取多个字符,最终都是从硬盘上一个一个的读取,都是使用read方法中一次读取一个字符的方法。readLine中封装了数组,每读一个就放在缓冲区中(不立即返回),当读到\r\n时,表示读取一行结束,因此此时就返回一行数据。

            

        自定义缓冲区解析readLine();

import java.io.FileReader;
import java.io.IOException;
public class MyBufferedReaderDemo {

public static void main(String[] args) throwsIOException{

FileReader fr1=newFileReader("f:\\1.txt");
MyBufferedReader myBufferedReader=new MyBufferedReader(fr1);
String line=null;
while((line=myBufferedReader.myReadLine())!=null) {
System.out.println("读取:"+line);

}
myBufferedReader.myClose();

}

}
//自定义缓冲区,实现自定义readLine()方法
class MyBufferedReader {

private FileReader fr;

public MyBufferedReader(FileReader fr){
this.fr=fr;
}

//自定义myreadLine方法每次读取一行数据
public String myReadLine() throws IOException{
int ch=0;
//定义stringBuffer临时容器,因为最终还是要将数据变为字符窜返回。
//原bufferedReader中封装的是数组
StringBuffer sb=newStringBuffer();
while((ch=fr.read())!=-1) {

if(ch=='\r')
continue;
if (ch=='\n')
return sb.toString();
else
sb.append((char)ch);

}
if(sb.length()!=0){
return sb.toString();
}
return null;
}
public void myClose() throws IOException{
fr.close();
}

}

流的操作规律:

往往流对象很多,在开发时不知道该用哪一个流对象。

下面我们通过三个明确来判断该选用那个刘对象。

1、明确源和目的。

      源:输入流 inputStream  reader

      目的:输出流 OutputStreamwriter

2、操作的数据是不是纯文本?

    是!字符流  不是!字节流

3、当体系明确后,在明确使用那个流对象。(通过设备来区分。)

    源设备:内存、硬盘、键盘

    目的设备:内存、硬盘、控制台

例:将一个文本文件存储到另一个文件中。(复制文件)

     源:因为是源,所以使用读取流。InputStream reader

          是不是操作文本文件:是!这时就可以选择reader(字符流读取)  

          接下来明确改使用那个流对象。 

             明确设备:硬盘。一个文件。所以reader体系中可以操作文件读取数据的流对象是:FileReade    

             明确是否需要提高效率 

             FileReader fr=new FileReader("f:\\1.txt"); //创建流对象与文件相关联

             BUfferedReader buff=new  bufferedReader(fr);

     目的:  OutputStream writer

     明确是不是纯文本文件:是!利用reader体系中FileWriter对象

     接下来明确改使用那个流对象。    

             明确设备:硬盘。一个文件。所以reader体系中可以操作文件读取数据的流对象是:FileWriter 

               FileWriter fw=newFileWriter("f:\\2.txt"); //创建流对象与文件相关联

             BUfferedWriter buff=new BUfferedWriter (fr);

转换流:InputStreamReader  OutputStreamWirter 

什么时候使用:字节转换为字符时使用   编码转换

字节转字符:

package IO;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class InputStreamReaderDemo {
/**
* @param 字节流转成字符流 InputStreamReader(用于字节转为字符流的桥梁)
* 在利用字符流的缓冲技术readLine方法 更高效的读取操作。
* 需求:从键盘录入数据,写入文本文件中(从键盘录入属于字节流操作,所以为了提供效率,要进行字节流转成字符流)
* 源:键盘录入
* 目的:文本文件
*/
publicstatic void main(String[] args) throws IOException {

/* //获取键盘输入流对象
InputStream in=System.in;
//将字节流转为字符流
InputStreamReader isr=new InputStreamReader(in);
//将字符流对象放进缓冲区中,提供更高的效率操作数据
BufferedReader buff=new BufferedReader(isr);*/

//BufferedReader buff=new BufferedReader(new InputStreamReader(System.in));
BufferedReader buff=new BufferedReader(newInputStreamReader(new FileInputStream("F:\\1.txt")));

//--------->>outPutStreamReader字符流转为字节流的桥梁
/*OutputStream out=System.o
aeaf
ut;
OutputStreamWriter osw=newOutputStreamWriter(out);
BufferedWriter bw=new BufferedWriter(osw);*/
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
// BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(newFileOutputStream("f:\\1.txt")));

String line=null;
while((line=buff.readLine())!=null){
//自定义键盘输入结束标记
if("over".equals(line))
break;
//System.out.println(line.toUpperCase());
bw.write(line.toUpperCase());
bw.flush();
}

}

}

编码转换:

 package IO;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class EncodeStream {

/**
* @param 转换流:InputStreamReader OutputStreamWirter
* 什么时候使用转换流??? 1、字节转换成字符 2、编码转换。
*/
publicstatic void main(String[] args) throws IOException{

// wirterText();
readText();
}

public static void wirterText() throwsIOException{
//GBk编码中,一个字符占两个字节。
//UTF-8编码中,一个字符占3个字节。
OutputStreamWriter osWriter=new OutputStreamWriter(newFileOutputStream("f:\\utf.txt"),"UTF-8");
osWriter.write("你好");
osWriter.close();
}

public static void readText() throwsIOException{

InputStreamReader isr=new InputStreamReader(newFileInputStream("f:\\utf.txt"),"GBK");
char[]ch=new char[1024];
intlen=0;
len=isr.read(ch);
String str=new String(ch, 0, len);
System.out.println(str);
}
}
File类解析说明:

    file类的常见方法:

    1、创建。

        boolean createNewFile();在指定位置创建文件,如果文件已经存在则不创建,返回false。和输出流不一样,输出流对象一建立就创建文件,如果存在就会覆盖  File f=new File("f:\\filedemo.txt");   f.createNewFile();

       booleanmkdir();创建文件夹,只能一级一级的创建 eg: File  dir=new File("f:\\abc");

       boolean mkdirs();创建文件夹,多级同时创建 eg: File  dir=newFile("f:\\abc\\kk\\yy\\a");

 

    2、删除。boolean delete();删除失败返回false   void deleteOnExit();在虚拟机退出时,删除指定位置文件。

    3、判断。boolean exists();文件是否存在。

                   boolean  isDirectory();判断目录是否存在  

                   boolean  isFile();判断文件是否存在。  

                   boolean isHidden();是否隐藏文件。

  4、获取信息:getName();  getParent();获取父目录,length();.........
------- android培训java培训、期待与您交流!
----------

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: