深入IO 想学必看!受益匪浅哦~
一:IO流概述
我们的程序需要通过InputStream或Reader从数据源读取数据,然后用OutputStream或者Writer将数据写入到目标媒介中。其中,InputStream和Reader与数据源相关联,OutputStream和writer与目标媒介相关联。 以下的图说明了这一点:

二:字符流
public class CharDemo {
public static void main( String[] args )
{
//创建输入和输出流
Reader reader = null;
Writer writer = null;
try {
//目的是明确数据要存放的目的地。
reader = new FileReader("e:/a.txt");
writer = new FileWriter("e:/a.txt",true);
//在文件中写入
writer.write("啦啦啦");
writer.write("啦啦啦");
writer.write("我是卖报的小行家");
//清空缓冲区
writer.flush();
writer.write("啦啦啦");
writer.write("啦啦啦");
writer.write("啦啦啦");
writer.close();
//读取
//创建一次性读取多少个字符
char[] data = new char[1024];
int num = 0;
StringBuffer sb = new StringBuffer();
//判断如果文件中有数据,则在后面追加数据
while ((num = reader.read(data))!=-1){
sb.append(data);
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// writer.close();应该放到添加数据完之后
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三:字节流
在Java中,字节流一般适用于处理字节数据(诸如图片、视频),字符流适用于处理字符数据(诸如文本文件),但二者并没有严格的功能划分,因为有转换流的存在,使得对于数据的处理变得更加灵活。InputStream和OutputStream分别是字节输入流与字节输出流的基类,它们的子类都是字节流,主要用在按字节来处理二进制数据。
废话不多说,上示例!
public class ByteDemo {
public static void main( String[] args )
{
//创建输入流和输出流对象
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = new FileInputStream("e:/a.txt");
//true 代表是否向文件中拼接,不删除之前的内容
outputStream = new FileOutputStream("e:/a.txt",true);
//先向文件写入内容
outputStream.write("54321".getBytes());//outputStream.flush();自己没有实现
//read方法将返回0-255之间的数字 如果流读到了最后,将返回-1
int num = 0;
while ((num=inputStream.read())!=1){
System.out.println((char) num);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四:二进制流
二进制流有两个顶级类:InputStream和OutputStream, 下面的两个类是各种附属类。作为对比,二进制流的关系比字符流的更加多样化和复杂。关于二进制流,LineNumberInputStream和StringBufferInputStream两个类在JDK1.5中,尽量不要使用,因为它们已被弃用。
public class DataDemo {
public static void main(String[] args) {
//创建输入流和输出流对象
InputStream inputStream = null;
OutputStream outputStream=null;
DataInputStream dis = null;
DataOutputStream dos=null;
try {
//获取了输入流 txt进入内存
inputStream=new FileInputStream("e:/a.txt");
dis=new DataInputStream(inputStream);
//获取输出流
outputStream=new FileOutputStream("e:/public/a.txt");
dos=new DataOutputStream(outputStream);
//先读取
int num=0;
while ((num=dis.read())!=-1){
dos.write(num); //复制
}
} catch (Exception e) {
e.printStackTrace();
}finally { //释放资源
try {
dos.close();
dis.close();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
五:缓冲流
定义:在内存与硬盘之间创建一个大小合适的缓冲区,当内存和硬盘进行数据访问时,能提高访问硬盘的次数,提高效率。
分类:缓冲分为字节缓冲流(BufferedInputStream和BufferedOutputStream)和字符缓冲流(BufferedReader和BufferedWrite)。
小小的案例,大大的了解~
public class BufferDemo {
public static void main(String[] args) {
//创建输出流
Reader reader = null;
Writer writer = null;
BufferedReader br = null;
BufferedWriter bw = null;
try {
writer = new FileWriter("e:/a.txt",true);
bw = new BufferedWriter(writer);
bw.write("你好!");
//换行
bw.newLine();
bw.write("llll");
//清空缓冲区
bw.flush();
bw.write("222");
bw.write("333");
bw.write("444");
bw.close();
writer.close(); //如果不关闭 后续两句话没法获取
//读取
reader=new FileReader("e:/a.txt");
br=new BufferedReader(reader);//封装
String line=null;
StringBuffer sb=new StringBuffer();
while ((line=br.readLine())!=null){
sb.append(line);
}
System.out.println(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
br.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
六:序列化和反序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。(持续化)
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
比如说登陆注册,注册就是序列化,登陆就是反序列化!!!为什么呢?注册,就是把用户的信息存储到硬盘中,就是持久化!登陆就是把信息再返回来,意思就是,从硬盘中读取出来,称之为反序列化!
来个栗子更直观一些!
首先来一个实体类
package com.ftx; import java.io.Serializable; /**
* @author 岔气的猫
* @create 2018-07-03 15:49
* @博客地址:https://home.cnblogs.com/u/fl72/
* 必须实现Serializable接口,否则在执行过程中,会报错!实现不了序列化
**/ public class User implements Serializable {
private String userName;
private String userPassword; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getUserPassword() {
return userPassword;
} public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public User(String userName, String userPassword) {
this.userName = userName;
this.userPassword = userPassword;
} public User() {
} @Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
'}';
}
}
接下来,好戏就要开始喽!
public class ObjectDemo {
static Scanner input = new Scanner(System.in);
//创建需要的输入和输出流对象
static InputStream inputStream = null;
static OutputStream outputStream = null;
static ObjectInputStream objectInputStream = null;
static ObjectOutputStream objectOutputStream = null;
public static void main(String[] args) {
//注册 序列化
//register();
//登录 反序列化
login();
}
//注册
private static void register() {
User user = new User();
System.out.println("请输入您的用户名:");
user.setUserName(input.next());
System.out.println("请输入您的密码:");
user.setUserPassword(input.next());
try {
outputStream = new FileOutputStream("e:/user.txt");
objectOutputStream = new ObjectOutputStream(outputStream);
//把对象输出到文件中
objectOutputStream.writeObject(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
objectOutputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//登录
private static void login() {
try {
inputStream = new FileInputStream("e:/user.txt");
objectInputStream = new ObjectInputStream(inputStream);
//读取对象
User user = (User) objectInputStream.readObject();
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
objectInputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
怎么样,明白了吗?
七:字节流转字符流
public static void convertByteToChar() throws IOException{
File file= new File( "d:/test.txt");
//获得一个字节流 InputStream is= new FileInputStream( file);
//把字节流转换为字符流,其实就是把字符流和字节流组合的结果。
Reader reader= new InputStreamReader( is);
char [] byteArray= new char[( int) file.length()];
int size= reader.read( byteArray);
System. out.println( "大小:"+size +";内容:" +new String(byteArray));
is.close();
reader.close();
}
八:File的使用
public class FileDemo
{
static Scanner input=new Scanner(System.in);
public static void main( String[] args )
{
System.out.println( "*************欢迎进入文件操作系统*************" );
System.out.println( "*************1.创建文件*************" );
System.out.println( "*************2.删除文件*************" );
System.out.println( "*************3.修改文件*************" );
System.out.println( "*************4.创建文件夹*************" );
System.out.println( "*************5.查询文件夹下所有的文件列表*************" );
System.out.println( "*************请选择:*************" ); //获取用户的输入
int choose = input.nextInt();
switch (choose){
case 1://创建文件
createNewFile();
break;
case 2://删除文件
deleteFile();
break;
case 3://修改文件
updateFile();
break;
case 4://创建文件夹
mkdirs();
break;
case 5://查询文件夹下所有的文件列表
findFileList();
break;
}
}
//查询文件夹下所有的文件列表
private static void findFileList() {
System.out.println("请您输入需要查询的文件夹的名称:(默认是E:/)");
String fileName = input.next();
//创建File对象
File file=new File("E:/"+fileName);
File[] files = file.listFiles();
int driNums = 0;
int fileNums = 0;
System.out.println("此文件夹下包含了:");
for (File f:files) {
if (f.isDirectory()){
driNums++;
System.out.println(f.getName());
}
if (f.isFile()){
fileNums++;
System.out.println(f.getName());
}
}
System.out.println("此文件夹下的文件夹有"+driNums);
System.out.println("此文件夹下的文件有"+fileNums);
} //创建文件夹
private static void mkdirs() {
System.out.println("请您输入创建的文件的名称:(默认是E:/)");
String fileName = input.next();
//创建File对象
File file=new File("E:/"+fileName);
if(file.mkdirs()){
System.out.println("创建成功!");
}else{
System.out.println("创建失败!");
}
} //修改文件
private static void updateFile() {
System.out.println("请您输入需要修改的文件的名称:(默认是E:/)");
String oldFileName = input.next();
System.out.println("请您输入修改后的文件的名称:(默认是E:/)");
String newFileName = input.next();
//创建File对象
File oldFile=new File("E:/"+oldFileName);
File newFile=new File("E:/"+newFileName);
if (oldFile.renameTo(newFile)){
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
} //删除文件
private static void deleteFile() {
System.out.println("请您输入需要删除的文件的名称:(默认是E:/)");
String fileName = input.next();
//创建File对象
File file=new File("E:/"+fileName);
if(file.exists()){
boolean falg = file.delete();
if (falg){
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
}else {
System.out.println("您输入的文件不存在!");
}
} //创建文件
private static void createNewFile() {
System.out.println("请您输入文件的名称:(默认是E:/)");
String fileName = input.next();
//创建File对象
File file=new File("E:/"+fileName);
if (file.exists()){ //文件已经存在
System.out.println("该文件已经存在!");
}else{
try {
boolean flag= file.createNewFile();
if (flag){
System.out.println("文件创建成功!");
}else{
System.out.println("文件创建失败!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
深入IO 想学必看!受益匪浅哦~的更多相关文章
- python知识大全目录,想学的看过来!
Python总结篇——知识大全 python装饰器 PyCharm安装与配置,python的Hello World sort与sorted的区别及实例 我必须得告诉大家的MySQL优化 ...
- [转载] JAVA面试题和项目面试核心要点精华总结(想进大公司必看)
JAVA面试题和项目面试核心要点精华总结(想进大公司必看) JAVA面试题和项目面试核心要点精华总结(想进大公司必看)
- 学Java必看!零基础小白再也不用退缩了
程序员们!请往这儿看 对于JAVA的学习,可能你还会有许多的顾虑 不要担心 接着往下看吧 学Java前 一.数学差,英语也不好是不是学不好Java? 答案是:是~ 因为你在问这个问题的时候说明你对自己 ...
- 结合jquery的前后端加密解密 适用于WebApi的SQL注入过滤器 Web.config中customErrors异常信息配置 ife2018 零基础学院 day 4 ife2018 零基础学院 day 3 ife 零基础学院 day 2 ife 零基础学院 day 1 - 我为什么想学前端
在一个正常的项目中,登录注册的密码是密文传输到后台服务端的,也就是说,首先前端js对密码做处理,随后再传递到服务端,服务端解密再加密传出到数据库里面.Dotnet已经提供了RSA算法的加解密类库,我们 ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- Linux网络编程必看书籍推荐
首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- 成为JAVA架构师必看书籍推荐
原创文章 “学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书 ...
- 新手必看,史上最全的iOS开发教程集锦,没有之一!
最近大火的iPhone XS Max和iPhone XS,不知道有没有同学已经下手了呢?一万三的价位确实让很多人望而却步啊.据说为了赢得中国的用户,专门出了双卡双待的,可想而知中国市场这块“肥肉”人人 ...
随机推荐
- java获取访问者真实的IP地址
众所周知java方法request.getremoteaddr()可以获得访问者的IP地址 但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了.如果使用了反向代理软件 ...
- Text-CNN 文本分类
1.简介 TextCNN 是利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在 “Convolutional Neural Networks for Sentence Classifica ...
- 【leetcode】1189. Maximum Number of Balloons
题目如下: Given a string text, you want to use the characters of text to form as many instances of the w ...
- js-头部的下拉框出现与隐藏,注意加上stop??
效果: 主要代码:
- Dw 表单制作 与 dedecms 结合实现提交效果
Dw 表单制作 与 dedecms 结合实现提交效果 自定义表单的用处 1.教育类网站的学员报名 2.企业网站的在线订单 3.普通网页上的一些和用户交互的小功能 实现原理:首先添加表单:核心-频道模型 ...
- CodeForces 1200E Compress Words
\(C_n^m\)的typora,点了一下启用源代码模式就把我已经写好的博客弄没了,就给我留个标题,自动保存也只给我保存了个标题--\(C_n^m\),wdnmd Time limit 1000 ms ...
- yii 1.1简单文件缓存
缓存组件配置在config\main.php文件,简单配置下文件缓存 'components'=>array( 'cache' => array( 'class' => 'syste ...
- gdb break 断点设置
http://sourceware.org/gdb/current/onlinedocs/gdb/ 断点设置 gdb断点分类: 以设置断点的命令分类: breakpoint 可以根据行号.函数.条件生 ...
- 20175221 曾祥杰 数据库MySQL(课下作业,必做)
数据库MySQL(课下作业,必做) 题目要求: 1. 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB ...
- 【机器学习速成宝典】模型篇02线性回归【LR】(Python版)
目录 什么是线性回归 最小二乘法 一元线性回归 多元线性回归 什么是规范化 Python代码(sklearn库) 什么是线性回归(Linear regression) 引例 假设某地区租房价格只与房屋 ...