标准输入输出流

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. jquery的innerWidth 和 innerHeight的使用

    innerWidth This method returns the width of the element, including left and right padding, in pixels ...

  2. windows下 python中报错ImportError: No module named 'requests'

    原因没有安装requests模块, 可以切换到python的安装目录找到 script文件夹 example: 进入cmd窗口切换到上面的目录直接运营下面两个命令中的一个 1. > Path\p ...

  3. LeetCode Top 100 Liked Questions in Golang(updating...)

    leetcode go语言版本,主要为了熟悉下语言 1. Two Sum 双指针版本, O(NlogN) func twoSum(nums []int, target int) []int { val ...

  4. Hibernate 数据库方言配置;no dialect mapping for jdbc type:-9;生僻字

    最近因为生僻字在界面上显示为?: 主要原因是该字段在数据库中就是varchar类型,显示的就是?:如䶮(yan):现把varchar类型改为nvarchar类型:数据中能够正常显示: 但是Spring ...

  5. pl/sql基础知识—过程快速入门

    n  过程 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数可以将执行部分的数据传递 ...

  6. Black-White-Blocks

    微信小程序黑白块游戏 代码如下: //play.js // play var app = getApp() Page({ data: { typeName: '计时模式', score: 0, tim ...

  7. Ubuntu 18.04中的Vim编辑器的高级配置

    VIM (Unix及类Unix系统文本编辑器) Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是开源软件. Vim普遍被推崇为类Vi编辑器中 ...

  8. oracle显示和设置环境变量

    概述:可以用来控制输出的各种格式. (1)linesize  用于控制每行显示多少个字符,默认80个字符. 基本用法:set linesize 字符数 aql>show linesize sql ...

  9. Java练习 SDUT-2401最大矩形面积

    最大矩形面积 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个矩形区域内有很多点,每个点的坐标都是整数.求一个矩形 ...

  10. 在 Linux 启动或重启时执行命令与脚本

    有时可能会需要在重启时或者每次系统启动时运行某些命令或者脚本.我们要怎样做呢?本文中我们就对此进行讨论. 我们会用两种方法来描述如何在 CentOS/RHEL 以及 Ubuntu 系统上做到重启或者系 ...