IO流(二)I/O
一.IO流概述
1.定义:Java的IO流是实现输入输出的基础,它可以方便地实现数据的输入/输出操作。
2.流的分类:
(1)按流向来分:输入流和输出流
(2)按操作的数据来分:字节流和字符流
(3)按流的角色来分:节点流和处理流
二.IO流类图
常用流分类:
通常来说,字节流的功能比字符流强大,因为计算机里所有的数据都是二进制的,而字节流可以处理所有的二进制文件,但如果使用字节流来处理文本文件,则需要将字节转换为字符,这增加了编程复杂度。所以有这样一个规则:如果操作的内容是文本,则考虑使用字符流,如果操作的内容是二进制内容,则应考虑使用字节流。
三.常用流介绍
1.转换流:输入/输出流体系中还提供了两个转换流,这两个转换流用于实现将字节流转换成字符流。
InputStreamReader将字节输入流转换成字符输入流,OutputStreamWriter将字节输出流转换成字符输出流。
public class InputStreamReaderDemo {
public static void main(String[] args) {
// 将标准字节输入流转换为字符流
InputStreamReader reader = new InputStreamReader(System.in);
// 将字符流进一步包装成缓冲流
BufferedReader buffer = new BufferedReader(reader);
String line = null;
try {
// System.out.println("请输入:");
while ((line = buffer.readLine()) != null) { if ("exit".equals(line)) {
System.exit(1);// 读取到exit,程序退出
}
System.out.println("输出内容:" + line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.缓冲流
BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedeWriter
使用缓冲流的好处:能够高效的读写信息,原理是先将数据缓存起来,然后再一起写入或者读取出来。
3.打印流
PrintStream,PrintWriter
使用打印流的好处:可以很方便的进行输出
public class PrintDemo { public static void main(String[] args) {
printToFile();
System.out.println("success");
} public static void printToFile(){
try {
OutputStream output = new FileOutputStream("D:\\code\\999.txt");
PrintWriter pw = new PrintWriter(new BufferedOutputStream(output));
pw.println("我是一只小小小鸟");
pw.println(true);
pw.println(999);
pw.println(1.114);
pw.flush();
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} }
}
4.对象流:序列化和反序列化对象
(1)什么是对象序列化
对象序列化的目标是将对象保存到磁盘中,或在网络中传输对象。
对象序列化机制允许把内存中的对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点,其他程序一旦获得这个二进制流,就可以将这种二进制流恢复成原来的java对象。
(2)如何让类是可序列化的
实现Serializable接口,该接口是一个标记接口,接口内无任何需要实现的方法。
(3)对象的序列化和反序列化
对象序列化(Serialize)是指将一个java对象写入IO流中,对象的反序列化(Deserialize)是指从IO流中恢复该java对象
(4)怎么使用对象流实现序列化
两个类:ObjectOutputStream,ObjectInputStream 对象流是处理流,需要建立在节点流的基础之上。
两个方法:writeObject(), readObject()
如果不想序列化某个成员变量,可以在声明中加入关键字 transient, 例如private transient int age;
使用方法见下面代码:(Dog类省略)
package com.gdp.xuliehua; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream; public class TestDog {
public static void main(String[] args) {
//writeObject();
//readObject();
//writeObject2();
readObject2();
}
/**
* 将对象写入到文件中
*/
public static void writeObject(){
try {
OutputStream out = new FileOutputStream("D:\\dog.txt");
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeInt(130);
Dog dog = new Dog("小黑",3);
oos.writeObject(dog);
oos.flush();
oos.close();
out.close();
System.out.println("OK");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
/**
* 从文件中读取对象
*/
public static void readObject(){
try {
InputStream in = new FileInputStream("D:\\dog.txt");
ObjectInputStream ois = new ObjectInputStream(in);
int i = ois.readInt();
Dog dog = (Dog)ois.readObject();
ois.close();
in.close();
System.out.println(i);
System.out.println(dog);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
/**
* 序列化多个对象,采用对象数组来实现将对象写入文件中
*/
public static void writeObject2(){
Dog dog1 = new Dog("小黑",5);
Dog dog2 = new Dog("小白",3);
Dog dog3 = new Dog("小红",6);
try {
OutputStream out = new FileOutputStream("D:\\obj.tmp");
ObjectOutputStream oos = new ObjectOutputStream(out);
Dog[] dogs = new Dog[]{dog1,dog2,dog3};
oos.writeObject(dogs);
oos.flush();oos.close();out.close();
System.out.println("ok");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
/**
* 将多个对象从文件中读取出来
* 1.读取出来的对象是对象数组
* 2.遍历数组,取出对象
*/
public static void readObject2(){
try {
InputStream in= new FileInputStream("D:\\obj.tmp");
ObjectInputStream ois = new ObjectInputStream(in);
Dog[] dogs = (Dog[])ois.readObject();
ois.close();in.close();
for (Dog dog : dogs) {
System.out.println(dog);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
}
5.ByteArrayInputStream和ByteArrayOutputStream
(1)ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
关闭ByteArrayInputStream无效,此类的方法在关闭流后仍可被调用,而不会产生任何IOException。
(2)ByteArrayOutputStream,此类实现一个输出流,其中的数据被写入一个byte数组,缓冲区会随着数据的不断写入而自动增长,可以使用toByteArray()和toString()获取数据.
关闭ByteArrayOutputStream无效,此类的方法在关闭流后仍可被调用,而不会产生任何IOException。
(3)使用方法如下列代码:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; public class ByteArrayDemo {
public static void main(String[] args) {
write();
}
/**
* 写入数据,不与文件关联,写入内存
* 读取数据并显示
*/
public static void write(){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String info = "我是一只小小小小鸟!";
try {
bos.write(info.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
//读取数据
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
StringBuffer buf = new StringBuffer();
byte[] bytes = new byte[1024];
int temp ;
try {
while((temp=bis.read(bytes))!=-1){
buf.append(new String(bytes, 0, temp));
}
System.out.println(buf.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
6.过滤器数据流:DataInputStream和DataOutputStream
(1)DataInputStream和DataOutputStream专门用于读写基本数据类型数据,而对象流既可以读写基本数据类型的数据也可以读写对象。
(2)它是一个处理流,需要建立在节点流的基础之上,如new DataInputStream(new FileInputStream("text.txt"))
(3)DataInputStream和DataOutputStream有读写的相关方法一一对应,基本使用方法见下面代码:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class DataStreamDemo {
public static void main(String[] args) {
// write();
read();
} /**
* 向文件写入数据
*/
public static void write() {
try {
OutputStream out = new FileOutputStream("D:\\test.txt");
DataOutputStream dos = new DataOutputStream(out);
dos.writeInt(100);// 写入int数值
dos.writeDouble(99.99);// 写入double数值
dos.writeBoolean(true);// 写入boolean值
dos.writeUTF("我是一只小小小小鸟");
dos.flush();
dos.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 从文件读取数据
*/
public static void read() {
try {
InputStream in = new FileInputStream("D:\\test.txt");
DataInputStream dis = new DataInputStream(in);
System.out.println(dis.readInt());
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
System.out.println(dis.readUTF());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}
IO流(二)I/O的更多相关文章
- Java学习之路(十二):IO流<二>
字符流 字符流是可以直接读写字符的IO流 使用字符流从文件中读取字符的时候,需要先读取到字节数据,让后在转换为字符 使用字符流向文件中写入字符时,需要把字符转为字节在写入文件 Reader和Write ...
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- IO流二
1 数据流(了解) 1.1 概述 为了方便的操作java语言的基本数据类型和String类型的数据,可以使用数据流. 数据流的分类: DataInputStream DataOutputStream ...
- Java IO流(二)
目录 字节缓冲流 概述 BufferedOutputStream类 继承父类的共性成员方法 构造方法 BufferedInputStream类 继承自父类的方法: 构造方法 文件复制练习(增强版 使用 ...
- IO流(二)
一:字符流 字符输入流 写入文件字符流 import java.io.FileWriter; import java.io.IOException; //fileWriter public class ...
- IO流(二)__BufferedReader和BufferedWriter
BufferedReader和BufferedWriter 字符流的缓冲区:缓冲区的而出现提高了对数据的读写效率对应类:BufferedWriter BufferedReader缓冲区要结合流才可以 ...
- JavaSE(十二)之IO流的字节流(一)
前面我们学习的了多线程,今天开始要学习IO流了,java中IO流的知识非常重要.但是其实并不难,因为他们都有固定的套路. 一.流的概念 流是个抽象的概念,是对输入输出设备的抽象,Java程序中 ...
- IO流(二)
二.File类 概述 文件和目录路径名的抽象表示形式 构造方法 public File(String pathname) public File(String parent,String child) ...
- Java第三阶段学习(二、IO流--------递归,字节流Stream)
一.递归 定义:指方法在方法内调用自己 适用于方法的运算主体不变,但运行的时候,参与运算的方法参数会变化注意:一定要给递归一个出口,否则内存溢出 练习题1:使用递归打印文件夹中所有的文件,包含子目录中 ...
- Java中的IO流(二)
上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...
随机推荐
- 使用org.jsoup.Jsoup下载网络中的图片
package com.enation.newtest; import java.io.BufferedOutputStream; import java.io.File; import java.i ...
- 原生js提取非行间样式
js用style属性可以获得html标签的样式,但是不能获取非行间样式,如何获取css的非行间样式呢,在低版本ie我们可以用currentStyle,在其他浏览器我们可以用getComputedSty ...
- HDU RPG的错排 【错排&&组合】
RPG的错排 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 信息竞赛程序卡时_C++
一.卡时简介 卡时是一个竞赛时常用的技巧 有些题目我们想不到完美算法就只能用暴力解决,但是此类方法一般时间复杂度较高,此时我们需要进行卡时 通俗来讲就是进行一个时间限制,让程序在达到这个时间后立马退出 ...
- COMPANY_点取消会卡死的解决方法
// OLD void ctonedlg::onbtn_basedir_clicked() { m_basedir = getUserSelectDir(); doSearchDir( ...
- BeeFramework 系列
http://ilikeido.iteye.com/category/281079 BeeFramework 系列三 MVC篇上 博客分类: Beeframework iphone开发 mvc框架Be ...
- 网站开发只需数小时?Meteor 说这才是未来
原文: http://www.geekpark.net/topics/211573/ 那个想要挑战过去数十年沿用至今的网站开发模式的新势力来了. Meteor 是从 YC 孵化而出的现代网站开发平台, ...
- J.U.C并发框架源码阅读(五)Semaphore
基于版本jdk1.7.0_80 java.util.concurrent.Semaphore 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is sub ...
- 51nod 1091 线段的重叠【贪心/区间覆盖类】
1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...
- 加强版dd工具dc3dd
加强版dd工具dc3dd dd是Linux最常用的磁盘备份工具,但缺少渗透测试常用的数据校验.hash等重要功能.Kali Linux提供的一款专用工具dc3dd.该工具是dd的加强版.它在dd的 ...