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

黑马程序员——JAVA基础——IO流

2015-11-27 11:36 549 查看

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

一、IO流:

     1、概述:

           IO用于在设备间进行数据传输的操作

     2、分类:

        A:流向:

            输入流 读取数据

            输出流 写出数据

        B:数据类型:

           字节流:

                字节输入流

                字节输出流

 

          字符流:

                 字符输入流

                字符输出流

图解:



   注意:

           a:如果没有明确说明按照什么分,默认按照数据类型分。

           b:除非文件用windows自带的记事本打开能够读懂,才采用字符流,否    则建议使用字节流。

      3、FileOutputStream写出数据

          A:操作步骤

            a:创建字节输出流对象

            b:调用write()方法

            c:释放资源

         B:代码体现:

             FileOutputStream fos = new FileOutputStream("fos.txt");

             fos.write("hello".getBytes());

             fos.close();

         C:要注意的问题?

           a:创建字节输出流对象做了几件事情?

           b:为什么要close()?

           c:如何实现数据的换行?

           d:如何实现数据的追加写入?

Eg:

 

<span style="font-family:Arial Black;">package cn.itcast_02;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
// 创建对象
// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
// "osw.txt")); // 默认GBK
// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
// "osw.txt"), "GBK"); // 指定GBK
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
"osw.txt"), "UTF-8"); // 指定UTF-8
// 写数据
osw.write("中国");

// 释放资源
osw.close();
}
}</span>


4、FileInputStream读取数据

    A:操作步骤

       a:创建字节输入流对象

       b:调用read()方法

       c:释放资源

   B:代码体现:

       FileInputStream fis = new FileInputStream("fos.txt");

       //方式1

           int by = 0;

           while((by=fis.read())!=-1) {

            System.out.print((char)by);

        }

    //方式2

          byte[] bys = new byte[1024];

          int len = 0;

           while((len=fis.read(bys))!=-1) {

          System.out.print(new String(bys,0,len));

       }

        fis.close();

Eg:

 

<span style="font-family:Arial Black;">package cn.itcast_01;

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream fis = new FileInputStream("a.txt");

// 读取数据
// int by = 0;
// while ((by = fis.read()) != -1) {
// System.out.print((char) by);
// }

byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
System.out.print(new String(bys, 0, len));
}

// 释放资源
fis.close();
}
}
</span>


 

二、字节流

     1、概述:

               字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。

               由于媒体文件数据中都是以字节存储的,所以,字节流对象可直接对媒体文件的数据写入到文件中,而可以不用再进行刷流动作。

                读写字节流:InputStream   输入流(读)

                                     OutputStream  输出流(写)

    2、为何不用进行刷流动作:

            因为字节流操作的是字节,即数据的最小单位,不需要像字符流一样要进行转换为字节。所以可直接将字节数据写入到指定文件中。

    3、字节缓冲区流

        A:BufferedOutputStream

        B:BufferedInputStream

三、字符流

      1、概述:

         字节流操作中文数据不是特别的方便,所以就出现了转换流。

                转换流的作用就是把字节流转换字符流来使用。

      2、转换流其实是一个字符流

              字符流 = 字节流 + 编码表

      3、编码表

             A:就是由字符和对应的数值组成的一张表

             B:常见的编码表

                  ASCII :最高位为符号位,其余位数值为

                       Eg:    ‘a’   97

                                     ‘A’   65

                                     ‘0’   48

                ISO-8859-1:拉丁码表   8为表示一个数据

                GB2312:中国的中文编码表;

                GBK:中国的中文编码表升级,融合了更多的中文文字符号;

                GB18030:GBK的取代版本

                UTF-8:最多用三个字节来表示一个字符;            

                Unicode:国际标准码,融合了多种文字;(所有文字都用两个字节来表示,java       语言就是Unicode)

 

          C:字符串中的编码问题

                    编码:

                        String -- byte[]

                    解码:

                       byte[] -- String

      4、IO流中的编码问题

          A:OutputStreamWriter

                OutputStreamWriter(OutputStream os):默认编码,GBK

                OutputStreamWriter(OutputStream os,String charsetName):指定编码。

          B:InputStreamReader

                InputStreamReader(InputStream is):默认编码,GBK

                InputStreamReader(InputStream is,String charsetName):指定编码

          C:编码问题其实很简单

                     编码只要一致即可

      5、字符缓冲区流

          A:BufferedReader:readLine()方法可以读取一行字符(不包含换行符号),读到最后不是-1而是return

Eg:

<span style="font-family:Arial Black;">package cn.itcast_05;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
// 创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("bw.txt"));

// 方式1
// int ch = 0;
// while ((ch = br.read()) != -1) {
// System.out.print((char) ch);
// }

// 方式2
char[] chs = new char[1024];
int len = 0;
while ((len = br.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}

// 释放资源
br.close();
}
}</span>


          B:BufferedWriter:newLine()可以读出一个跨平台的换行符号”\r\n”

Eg:

<span style="font-family:Arial Black;">package cn.itcast_05;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*
* 字符流为了高效读写,也提供了对应的字符缓冲流。
* BufferedWriter:字符缓冲输出流
* BufferedReader:字符缓冲输入流
*
* BufferedWriter:字符缓冲输出流
* 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
* 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
*/
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
// BufferedWriter(Writer out)
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
// new FileOutputStream("bw.txt")));

BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

bw.write("hello");
bw.write("world");
bw.write("java");
bw.flush();

bw.close();
}
}
</span>


 

 

四、总结:

     IO流

         |--字节流

              |--字节输入流

                       InputStream

                       int read():一次读取一个字节

                       int read(byte[] bys):一次读取一个字节数组

                        |--FileInputStream

                        |--BufferedInputStream

              |--字节输出流

                       OutputStream

                       void write(int by):一次写一个字节

                       void write(byte[] bys,int index,int len):一次写一个字节数组的一部分

                      |--FileOutputStream

                      |--BufferedOutputStream

        |--字符流

             |--字符输入流

                       Reader

                       int read():一次读取一个字符

                       int read(char[] chs):一次读取一个字符数组

                       |--InputStreamReader

                           |--FileReader

                       |--BufferedReader

                          String readLine():一次读取一个字符串

            |--字符输出流

                      Writer

                      void write(int ch):一次写一个字符

                      void write(char[] chs,int index,int len):一次写一个字符数组的一部分

                      |--OutputStreamWriter

                           |--FileWriter

                      |--BufferedWriter

                          void newLine():写一个换行符

                         void write(String line):一次写一个字符串

图解:

 

 


 

-----------android培训java培训、java学习型技术博客、期待与您交流!------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: