黑马程序员——java IO

来源:互联网 发布:iapp免杀软件 编辑:程序博客网 时间:2024/05/01 09:27

 

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

1、IO(Input Output)

(1)IO流用来处理设备之间的数据传输

(2)Java对数据的操作是通过流的方式l

(3)Java用于操作流的对象都在IO包中l

(4)流按操作数据分为两种:字节流与字符流 。l

(5)流按流向分为:输入流,输出流。

2、IO流常用基类

(1)字节流的抽象基类:

InputStream OutputStream。l

(2)字符流的抽象基类:

Reader Writer。l

:由这四个类派生出来的子类名称都是 以其父类名作为子类名的后缀。

•如:InputStream的子类FileInputStream

•如:Reader的子类FileReader

3、IO程序的书写

(1)导入IO包中的类l

(2)进行IO异常处理

(3)finally中对流进行关闭

4、字符流FileWriter——创建文件l

(1)创建流对象,建立数据存放文件

FileWriter fw = new FileWriter(Test.txt);l

(2)调用流对象的写入方法,将数据写入流

fw.write(text);l

(3)关闭流资源,并将流中的数据清空到文件中。

fw.close();

5、字符流FileReader——读取文件

(1)建立一个流对象,将已存在的一个文件加载进 流。

FileReader fr = new FileReader(Test.txt);

(2)创建一个临时存放数据的数组。

char[] ch = new char[1024];

(3)调用流对象的读取方法将流中的数据读入到数组 中。

fr.read(ch);

注意:l

(1)定义文件路径时,可以用“/”或者“\\”。l

(2)在创建一个文件时,如果目录下有同名文 件将被覆盖。l

(3)在读取文件时,必须保证该文件已存在, 否则出异常。

 

6、字符流的缓冲区BufferedReaderBufferedWriter

1、缓冲区的出现提高了对数据的读写效率

2、缓冲区要结合流才可以使用

3、在流的基础上对流的功能进行了增强

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

记住,

只要用到缓冲区,就记得刷新flush

关闭缓冲区,就是在关闭缓冲区中的流对象close

输出流缓冲区中提供了一个方法newLine();跨平台的换行

    输入流缓冲区中提供了一个方法newLine();读取一行,当到了结尾时,返回null

    newLine不包含\r\n或\n,如果到了结尾,就返回null

    

    【缓冲区综合运用】

    /**

 * 拷贝一个java文件

 */

public class IO_09_Buffered {

public static void main(String[] args) {

BufferedReader bufr = null;

BufferedWriter bufw = null;

try {

//创建输入流缓冲区

bufr = new BufferedReader(new FileReader("A.java"));

//创建输出流缓冲区

bufw = new BufferedWriter(new FileWriter("B.java"));

String line = null;//保存行数据,后面就是循环读取了

while ((line=bufr.readLine())!=null) {

bufw.write(line);

//因为readLine不读取换行符,所以要自己加换行符

bufw.newLine();

bufw.flush();

}

catch (IOException e) {

e.printStackTrace();

finally{

if(bufw!=null){

try {

bufw.close();

catch (IOException e) {

e.printStackTrace();

}

}

if(bufr!=null){

try {

bufr.close();

catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

 

7、LineNumberReader 类

    public class IO_10_LineNumberReader {

public static void main(String[] args) throws IOException {

FileReader fr = new FileReader("A.java");

LineNumberReader lr = new LineNumberReader(fr);

//不会真正改变行号,只是会改变getLineNumber的行号

lr.setLineNumber(100);

String line = null;

while ((line=lr.readLine())!=null) {

System.out.println(lr.getLineNumber()+":"+line);

}

lr.close();

}

}

8、字节流

字节流操作与字符流相同,但它不仅可以操作字符,还可以操作其他媒体文件。

例如:拷贝图片

FileInputStream

public static void readFile() throws IOException{

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

byte[] buf = new byte[1024];

//available方法表明了还有几个字节可以读取

System.out.println("还可读几个字符:"+fis.available());

int len = fis.read(buf);

//这里的available返回数是上一个available返回数减去len

System.out.println("还可读几个字符:"+fis.available());

System.out.println(new String(buf,0,len));

fis.close();

}

字节流缓冲区的操作与字符流操作步骤相似

读取键盘录入

public static void main(String[] args) throws IOException {

InputStream in = System.in;

StringBuilder sb = new StringBuilder();

while(true){

int ch = in.read();

if(ch=='\r')

continue;

//遇到回车就输出内容

if(ch=='\n'){

String s = sb.toString();

//如果等于over,就退出程序

if("over".equals(s))

break;

System.out.println(s.toUpperCase());

//清空StringBuilder

sb.delete(0, sb.length());

}

sb.append((char)ch);

}

}

 

转换流

InputStreamReaderOutputStreamWriter

转换流的由来

(1)字符流与字节流之间的桥梁

(2)方便了字符流与字节流之间的操作

转换流的应用

    字节流中的数据都是字符时,转成字符流操作更高效

 

流操作规律

1

源:键盘录入

目的:控制台

2

源:键盘录入

目的:文件

3

源:文件

目的:控制台

4

源:文件

目的:文件

流操作的基本规律:最痛苦的就是流对象太多,不知道该用哪一个。

 

通过3个明确来完成。(重点)

1、明确源和目的

源:输入流:InputStreamReader

目的:输出流:OutputStreamWriter

2、操作的数据是否是纯文本

是:字符流

不是:字节流

3、当体系明确后,在明确要使用哪些具体的对象

    通过设备来进行区分:

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

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

 

 

File

(1)用来将文件或者文件夹封装成对象l

(2)方便对文件与文件夹的属性信息进行操作 。

(3)File对象可以作为参数传递给流的构造函数。

(4)了解File类中的常用方法。

 

递归

函数自己调用自己。

注意:递归时一定要明确结束条件。l

应用场景:

当某一功能要重复使用时。

 

IO包中的其他类

RandomAccessFile

•随机访问文件,自身具备读写的方法。

•通过skipBytes(int x),seek(int x)来达到随机访问。

 

管道流

•PipedInputStream和PipedOutputStream

•输入输出可以直接进行连接,通过结合线程使用。

 

打印流

•PrintWriter与PrintStream

•可以直接操作输入流和文件。

 

序列流

•SequenceInputStream

•对多个流进行合并。

 

操作对象

•ObjectInputStream与ObjectOutputStream

•被操作的对象需要实现Serializable (标记接口);

 

操作基本数据类型

•DataInputStream与DataOutputStream

 

操作字节数组

•ByteArrayInputStream与ByteArrayOutputStream

 

操作字符数组

•CharArrayReader与CharArrayWrite

 

操作字符串

•StringReader 与StringWriter

 

字符编码

字符流的出现为了方便操作字符。l

更重要是的加入了编码转换。l

通过子类转换流来完成。

•InputStreamReader

•OutputStreamWriter

 

在两个对象进行构造的时候可以加入字符集。

 

 

常见的编码表

(1)ASCII:美国标准信息交换码。

•用一个字节的7位可以表示。

(2)ISO8859-1:拉丁码表。欧洲码表

•用一个字节的8位表示。

(3)GB2312:中国的中文编码表。

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

(5)Unicode:国际标准码,融合了多种文字。

•所有文字都用两个字节来表示,Java语言使用的就是unicode

(6)UTF-8:最多用三个字节来表示一个字符。

 

转换流的编码应用

(1)可以将字符以指定编码格式存储。

(2)可以对文本数据指定编码格式来解读。

(3)指定编码表的动作由构造函数完成。

 

字符编码

(1)编码:字符串à字节数组

(2)解码:字节数组à字符串

 

个人学习总结 

    java IO中的流对象很多,但是每一种都有自己的专长,如FileReader专门读取纯文本,FileInputStream可以读取所有的文件等,在运用是,我们只要按照以下来分析,就可以很好地运用io操作。

通过3个明确来完成。(重点)

1、明确源和目的

源:输入流:InputStreamReader

目的:输出流:OutputStreamWriter

2、操作的数据是否是纯文本

是:字符流

不是:字节流

3、当体系明确后,在明确要使用哪些具体的对象

    通过设备来进行区分:

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

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

 

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


                                                         详细请查看:http://edu.csdn.net/heima

 

 

原创粉丝点击