标准输入输出流

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. Directx11教程(46) alpha blend(3)

    原文:Directx11教程(46) alpha blend(3)       现在我们尝试改变box的贴图,使用一张带alpha的dds文件wirefence.dds, 用directx textu ...

  2. 微信公众号系统在Linux下的部署操作

    ps -ef | grep tomcat 查看tomcat进程

  3. python 代码中的类和对象

  4. 外贸电子商务网站之Prestashop 安装后台中文语言包

    1.先进入到后台,我们进入Localization-> Localization2, 在下面的国家列表中,我们选择china ,导入即可. 3.进入Localization-> Trans ...

  5. win2003开启ftp

    首先你要添加IIS,然后才可以启动配置FTP,步骤如下: 1.控制面板→添加或删除程序→添加/删除windows组件: 2.在弹出的windows组件向导窗口中,选择并勾选“应用程序服务器”,然后点击 ...

  6. List容器-ArrayList

    特点:   有序重复,包括null,通过整数索引访问 实现类ArrayList和LinkedList ArrayList--动态数组   不线程同步  单线程合适 List<String> ...

  7. 【JZOJ2224】【NOI2006】最大获利

    题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成 ...

  8. SDUT-2107_图的深度遍历

    数据结构实验之图论二:图的深度遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请定一个无向图,顶点编号从0到n-1 ...

  9. iOS 9适配系列教程:后台定位

    http://www.cocoachina.com/ios/20150624/12200.html Demo:GitHub地址 [iOS9在定位的问题上,有一个坏消息一个好消息]坏消息:如果不适配iO ...

  10. 2015 Objective-C 三大新特性

    http://www.cocoachina.com/ios/20150617/12148.html Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的 ...