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

------- android培训java培训、期待与您交流! ----------

 

IO流概述

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

Java对数据的操作是通过流的方式

Java用于操作流的对象都在IO包中

 

IO流的分类:

流向:

         输入流     读取数据

         输出流 写出数据

数据类型:

         字节流

                   字节输入流     读取数据         InputStream

                   字节输出流     写出数据         OutputStream

       字符流

                 字符输入流     读取数据         Reader

                 字符输出流     写出数据         Writer

 

1、  字节流

在计算机中,无论是文本、图片、音频还是是视屏,所有的文件都是以二进制(字节)形式存在的,IO流中针对字节的输入输出提供了一系列的流,统称为字节流。

 

字节输出流操作步骤:

         A:创建字节输出流对象

         B:写数据

         C:释放资源

 

例:需求:我要往一个文本文件中输入一句话:"nihao java";

//首先需要创建字节输出流对象

File file = new File("fos.txt");

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

 

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

         A:调用系统功能去创建文件

         B:创建fos对象

         C:把fos对象指向这个文件】

//写数据

Fos.write("nihao java".getBytes());

 

//关闭此文件输出流并释放与此流有关的所有系统资源。

fos.close();

【关流的原因:

A:让流对象变成垃圾,这样就可以被垃圾回收器回收了

B:通知系统去释放跟该文件相关的资源】

 

如何实现数据的换行?

windows:\r\n

linux:\n

Mac:\r

// 创建一个向具有指定 name 的文件中写入数据的输出文件流。如果第二个参数为 true,//则将字节写入文件末尾处,而不是写入文件开始处。

FileOutputStream fos = newFileOutputStream("fos3.txt", true);

// 写数据

for (int x = 0; x < 10; x++) {

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

                   fos.write("\r\n".getBytes());

}

// 释放资源

fos.close();

 

字节输入流操作步骤:

A:创建字节输入流对象

B:调用read()方法读取数据,并把数据显示在控制台

C:释放资源

 

读取数据的方式:

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

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

 

 

一次读取一个字节:

//创建字节读取流对象

FileInputStream fis = newFileInputStream("java.txt");

 

int by = 0;

// 读取,赋值,判断

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

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

}

// 释放资源

fis.close();

 

一次读取一个字节数组:

//创建字节读取流对象

FileInputStream fis = newFileInputStream("java.txt");

byte[] bys = new byte[1024];

int len = 0;

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

         System.out.print(newString(bys, 0, len));

}

// 释放资源

fis.close();

 

复制文本的例子:

 

通过定义数组的方式比以前一次读取一个字节的方式快很多,所以有一个缓冲区还是非常好的。java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。

这种类被称为:缓冲区类(高效类)

写数据:BufferedOutputStream

读数据:BufferedInputStream

 

//定义一个字节写入流缓冲区

BufferedOutputStream bos = newBufferedOutputStream(new FileOutputStream("bos.txt"));

// 写数据

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

// 释放资源

bos.close();

 

//定义一个字节读取流缓冲区

BufferedInputStream bis = newBufferedInputStream(new FileInputStream("bos.txt"));

byte[] bys = new byte[1024];

int len = 0;

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

         System.out.print(newString(bys, 0, len));

}

// 释放资源

bis.close();

 

字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。

 

2、字符流:

字符流为了高效读写,也提供了对应的字符缓冲流。

BufferedWriter:字符缓冲输出流

BufferedReader:字符缓冲输入流

 

BufferedWriter:字符缓冲输出流

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

可以指定缓冲区的大小,或者接受默认的大小。

//建立一个字符写入流的缓冲区

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

//写入数据

bw.write("java");

//刷流

bw.flush();

bw.close();

 

BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

可以指定缓冲区的大小,或者可使用默认的大小。

// 创建字符缓冲输入流对象

BufferedReader br = new BufferedReader(newFileReader("bw.txt"));

char[] chs = new char[1024];

int len = 0;

while ((len = br.read(chs)) != -1) {

         System.out.print(newString(chs, 0, len));

}

// 释放资源

br.close();

 

字符缓冲流的特殊方法:

BufferedWriter:

                   publicvoid newLine():根据系统来决定换行符

BufferedReader:

                   publicString readLine():一次读取一行数据

                   包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

 


3、 可以读写基本数据类型的数据

数据输入流:DataInputStream

                            DataInputStream(InputStreamin)

  数据输出流:DataOutputStream

                           DataOutputStream(OutputStreamout)

 

// 创建数据输入流对象

DataInputStream dis = new DataInputStream(newFileInputStream("dos.txt"));

// 读数据

byte b = dis.readByte();

short s = dis.readShort();

int i = dis.readInt();

long l = dis.readLong();

float f = dis.readFloat();

double d = dis.readDouble();

char c = dis.readChar();

boolean bb = dis.readBoolean();

// 释放资源

dis.close();

 

// 创建数据输出流对象

DataOutputStream dos = newDataOutputStream(new FileOutputStream("dos.txt"));

// 写数据了

dos.writeByte(10);

dos.writeShort(100);

dos.writeInt(1000);

dos.writeLong(10000);

dos.writeFloat(12.34F);

dos.writeDouble(12.56);

dos.writeChar('a');

dos.writeBoolean(true);

// 释放资源

dos.close();

 

4、内存操作流:用于处理临时存储信息的,程序结束,数据就从内存中消失。

字节数组:

                   ByteArrayInputStream

                   ByteArrayOutputStream

字符数组:

                   CharArrayReader

                   CharArrayWriter

字符串:

                StringReader

                   StringWriter

 

// 写数据

ByteArrayOutputStream baos = newByteArrayOutputStream();

// 写数据

for (int x = 0; x < 10; x++) {

         baos.write(("hello"+ x).getBytes());

}

 

// 读数据                 

ByteArrayInputStream bais = newByteArrayInputStream(bys);

int by = 0;

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

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

}

 

5、打印流

 字节流打印流       PrintStream

 字符打印流  PrintWriter

 

 打印流的特点:

                   A:只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。

                B:可以操作任意类型的数据。

                   C:如果启动了自动刷新,能够自动刷新。

                D:该流是可以直接操作文本文件的。

// 创建打印流对象

PrintWriter pw = new PrintWriter(newFileWriter("pw2.txt"), true);

pw.println("java");

pw.println(true);

pw.println(100);

pw.close();

 

6、标准输入输出流

System类中的两个成员变量:

                   publicstatic final InputStream in “标准”输入流。

                   publicstatic final PrintStream out “标准”输出流。

 

                   InputStreamis = System.in;

                   PrintStreamps = System.out;

 

通过字符缓冲流包装标准输入流实现

 BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));

// 获取标准输入流

BufferedWriter bw = new BufferedWriter(newOutputStreamWriter(System.out));

 

 

7、序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)

 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)

 

// 创建序列化流对象

ObjectOutputStream oos = newObjectOutputStream(new FileOutputStream("oos.txt"));

// 创建对象

Person p = new Person("张三", 22);

// public final void writeObject(Objectobj)

oos.writeObject(p);

// 释放资源

oos.close();

 

// 创建反序列化对象

ObjectInputStream ois = newObjectInputStream(new FileInputStream("oos.txt"));

// 还原对象

Object obj = ois.readObject();

// 释放资源

ois.close();

 

8、Properties:属性集合类。是一个可以和IO流相结合使用的集合类。

Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

特殊功能:

 public Object setProperty(String key,Stringvalue):添加元素

 publicString getProperty(String key):获取元素

 public Set<String>stringPropertyNames():获取所有的键的集合

public void load(Reader reader):把文件中的数据读取到集合中

 publicvoid store(Writer writer,String comments):把集合中的数据存储到文件

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值