标准输入输出流

1.1标准输入流

源数据源是标准输入设备(键盘、鼠标、触摸屏)等输入设备。在java中用System.in 得到一个InputStream字节输入流。

[1]在控制台输入一句话,然后原样输出

package Io2;

import java.io.IOException;
import java.io.InputStream; public class Test01 {
public static void main(String[] args) throws IOException {
//system.in是字节输入流InputStream
InputStream in=System.in;
//一次性读取的字节数和长度
byte[] buf=new byte[1024];
int len;
len=in.read(buf);
String str=new String(buf, 0, len);
System.out.println(str);
}
}
nihao
nihao

标准输入流以字节流流入内存,如果在控制台中输入字符,字符以默认编码(win简体:gbk)编码成字节进入标准输入流。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; //需求:从控制台高效读取一行数据。把一首诗写入文件。
public class Test02 {
public static void main(String[] args) throws IOException {
// [1] system.in是控制台字节输入流InputStream
InputStream in = System.in;
// 【3】 输入的是字节流,通过字节转换器转换成字符流 读取到cpu
InputStreamReader reader = new InputStreamReader(in, "GBK");
// [2] 编写快速字节读取管道,实现读的对象 字节-------字符
BufferedReader br = new BufferedReader(reader); // 【4】 创建file文件
File file = new File("D:\\javatest\\l.txt");
// 【6】 cpu的是字符流,写入文件中需要转换成字节流 需要一次性写入多个,FileWriter
FileWriter writer = new FileWriter(file);
// OutputStreamWriter writer=new OutputStreamWriter(out, "GBK")
// 【5】 编写快速字节写入管道,字符-----字节
BufferedWriter bw = new BufferedWriter(writer);
String end = "bye";
while (true) {
String line = br.readLine();
if (line.equals(end)) {
break;
} bw.write(line);
bw.newLine();
}
bw.flush();
bw.close();
writer.close();
}
}

1.2 标准输出流(PrintStream)

数据目的地是标准输出设备(显示器)等输出设备。在java中用System.out得到一个PrintStream 字节输出流(字节打印流)。提供了更强大的

print

println

打印方法用于打印各种数据类型。

需求:读取文件,显示到标准输出设备

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream; public class Test04 {
public static void main(String[] args) throws IOException {
File file = new File("d:\\javatest\\k.txt");
FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader);
//PrintStream 字节输出流(字节打印流)
PrintStream ps = System.out;
String line;
while ((line = br.readLine()) != null) {
ps.println(line);
}
}
}

1.3 Scanner

通过scanner扫描文件、字节流等

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
// 扫描平台默认编码的文件
public class Test03 {
public static void main(String[] args) throws IOException {
File file = new File("d:\\javatest\\k.txt");
Scanner sc = new Scanner(file);
String line;
while (sc.hasNextLine()) {
line = sc.nextLine();
System.out.println(line);
} }
}

1.4  序列化

把内存中的对象永久保存到硬盘的过程称为对象序列化,也叫做持久化。

把硬盘持久化的内存恢复的内存的过程称为对象反序列化。

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,并抛出异常

Serializable接口没有方法或字段,仅用于标识可序列化的语义

public class Student implements Serializable{
// 。。。

1.5 序列化对象

ObjectOutputStream 继承于OutputStream,专门用于把对象序列化到本地。提供了

writeXXX

writeObject() 用于写入一个对象

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream; public class Test05 {
public static void main(String[] args) throws IOException {
Student stu=new Student("001", "张三", 20, Gender.男);
File file =new File("D:\\javatest\\m.txt");
FileOutputStream out=new FileOutputStream(file);
ObjectOutputStream oos=new ObjectOutputStream(out);
oos.writeObject(stu);
oos.close();
out.close();
System.out.println("格式化完成");
}
}

ObjectInputStream 继承于InputStream ,专门用于把本地持久化内容反序列化到内存,提供了

readXXX

readObject() 用于读取一个序列化内容并返回一个对象。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; public class Test06 {
public static void main(String[] args) throws IOException,
ClassNotFoundException {
File file = new File("D:\\javatest\\m.txt");
FileInputStream in = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(in);
// readObject() 用于读取一个序列化内容并返回一个对象。
Student stu = (Student) ois.readObject();
System.out.println(stu.getId());
System.out.println(stu.getName());
System.out.println(stu.getAge());
System.out.println(stu.getGender());
ois.close();
in.close();
}
}
001
张三
20

1.5 序列化版本

当序列化完成后,后期升级程序中的类(Student),此时再反序列化时会出现异常。

异常原因:序列化流的serialVersionUID和升级后类的版本不匹配。

解决方案:给Student类加序列化版本号,有两种方式

default serial version ID 生成默认的serial version ID 一般值都是1L。

generated serial version ID 根据当前类的属性、方法生成一个唯一ID。

public class Student implements Serializable {
private static final long serialVersionUID = -6876240585925178921L;
                                                                                            

transient


开发过程中,如果想忽略某些字段不让其序列化时,可以使用transient修饰。

public class Student implements Serializable {
private static final long serialVersionUID = -6876240585925178921L;
private String id;
//忽略某些字段不让其序列化时,可以使用transient修饰
private transient String name;
private transient int age;

1.6 DataInputStream/DataOutputStream

DataOutputStream 继承OutputStream,专门用于把基本java数据类型写入输出流。提供了writeXXX 写入基本java数据类型。

DataInputStream 继承于InputStream,允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。

DataInputStream/DataOutputStream 特别适合读取/写入在网络传输过程中的数据流。

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; public class Test07 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\javatest\\n.txt");
FileOutputStream out=new FileOutputStream(file);
DataOutputStream dos=new DataOutputStream(out);
dos.writeInt(10);
dos.writeUTF("hellow中国");
dos.close();
out.close();
System.out.println("ok");
}
}
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; public class Test08 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\javatest\\n.txt");
FileInputStream in=new FileInputStream(file);
DataInputStream dis=new DataInputStream(in);
int a=dis.readInt();
String string=dis.readUTF();
System.out.println(a);
System.out.println(string);
}
}

注意:

以什么顺序写入基本java数据类型,就以什么顺序读取基本java数据类型。

写入基本java数据类型

java Io流的应用的更多相关文章

  1. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  2. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  3. Java IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  4. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  5. java io流 对文件夹的操作

    java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...

  6. Java IO流题库

    一.    填空题 Java IO流可以分为   节点流   和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...

  7. Java IO流总结

    Java IO流分类以及主要使用方式如下: IO流 |--字节流 |--字节输入流 InputStream: int read();//一次读取一个字节 int read(byte[] bys);// ...

  8. java io流 运行错误时,保存异常到文件里面

    java io流 运行错误时,保存异常到文件里面 下面这个实例,运行后,输入数字,为正确,如果输入字符串,则报错,保存错误信息 //运行错误时,保存异常到文件里面 //下面这个实例,运行后,输入数字, ...

  9. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...

  10. java io流 数据流传输

    java io流 数据流传输 把这段当公式用就可以了 //数据流传输 import java.io.*; public class Index{ public static void main(Str ...

随机推荐

  1. 深入浅出Cocoa之消息(二)-详解动态方法决议(Dynamic Method Resolution) 【转】

    序言 如果我们在 Objective C 中向一个对象发送它无法处理的消息,会出现什么情况呢?根据前文<深入浅出Cocoa之消息>的介绍,我们知道发送消息是通过 objc_send(id, ...

  2. LintCode_167 链表求和

    题目 你有两个用链表代表的整数,其中每个节点包含一个数字.数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头.写出一个函数将两个整数相加,用链表形式返回和. 样例 给出两个链表 3-&g ...

  3. Directx教程(26) 简单的光照模型(5)

    原文:Directx教程(26) 简单的光照模型(5)     在前面的工程中,我们都是在vs中实现顶点光照计算,然后再把顶点颜色传到ps中.本章中我们尝试fragment光照(或者说叫ps光照),在 ...

  4. IOS 后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务

    我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UI ...

  5. python socketserver ftp上传功能

    一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...

  6. JAVA中this的三种用法的详解

    this关键字必须放在非静态方法里面 this关键字代表自身,在程序中主要的使用用途有以下几个方面: ? 使用this关键字引用成员变量 ? 使用this关键字在自身构造方法内部引用其它构造方法 ? ...

  7. thinkphp5.0 路由规则配置

    开启路由‘url_route_on’ => true 首页路由'/' =>'home/index/index' 其它路由(1)'route' => 'home/index/route ...

  8. oracle Sql语句分类

    dml语句:数据操作语句[insert,update,delete] ddl语句:数据定义语言[create table,drop table] dql语句:数据查询语句[select] dtl语句: ...

  9. 02docker简单使用和配置(网络、存储和Hub)

    四:网络 1:命名容器 在各种docker命令中,可以通过名字中找到对应的容器.之前创建的容器都是由docker自动命名的,可以在docker  run中,通过--name参数指定容器的名字.比如: ...

  10. 快速完成智能数据构建,Dataphin公共云版本全面解读

    公测两个月,Dataphin公共云版本已经受到了阿里云上众多轻量级用户的关注.事实上,Dataphin作为一款大数据智能构建与管理的产品,其核心功能是面向各行各业大数据建设.管理及应用诉求,一站式提供 ...