深入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,不知道有没有同学已经下手了呢?一万三的价位确实让很多人望而却步啊.据说为了赢得中国的用户,专门出了双卡双待的,可想而知中国市场这块“肥肉”人人 ...
随机推荐
- MYSQL<四>
-- ########## 01.ER关系 ########## -- ER关系(逻辑描述) -- A:E---Entity简写,实体,具有相同属性(特征)的对象归为同一实体 -- Attribute ...
- 基于Ubuntu 搭建 WordPress 个人博客 - 开发者实验室 - 腾讯云
1.准备 LAMP 环境 安装 Apache2 在终端输入该命令 ,使用 apt-get 安装 Apache2: sudo apt-get install apache2 -y 安装好后,您可以通过访 ...
- 对js库的调研研究------引用
1. 引言 从以下几个方面来阐述这个问题: 特性. 稳定性. 性能. 包生态. 社区. 学习曲线. 文档. 工具. 发展历史. 团队. 兼容性. 趋势. 2.概述 & 精读 特性 当你调研一个 ...
- postman—创建collection,执行collection和批量执行
接口测试中,可以在 Postman 逐个创建请求.但当请求逐渐增多时,如果我们不采取任何措施管理,散乱的请求维护起来就比较麻烦了.这个时候我们可以创建测试集 Collection 来对这些请求进行管理 ...
- js dom 添加类
var sheng = document.getElementById("sheng"); ; sheng.onclick = function() { if(this.paren ...
- linux的字符集转换
命令查看编码类型 查看命令参数 查看支持的字符集 将文件转换成utf-8 的文件(经测试比较鸡肋,不好用) [root@ag-1 hh]# iconv oldboy -f us-ascii -t ut ...
- Python 爬虫十六式 - 第一式:HTTP协议
HTTP:伟大而又无闻的协议 学习一时爽,一直学习一直爽! Hello,大家好啊,我是Connor,一个从无到有的技术小白.有的人一说什么是HTTP协议就犯愁,写东西的时候也没想过什么是HTTP协 ...
- [design pattern](5) Factory Method
前言 在前面一章博主介绍了简单工厂模式(Simple Factory),接着上面的章节,今天博主就来介绍下工厂方法模式(Factory Method). 思考题 首先,让我们来思考下面的问题: 在上一 ...
- EMC存储同时分配空间到两台LINUX服务器路径不一致导致双机盘符大小不一致
操作系统:Centos linux6.6 当我们从EMC存储上划分空间同时分配给两台或者多台服务器上时,有的时候会出现在服务器上所生成的磁盘路径是不一致的,这样就会导致盘符名称不一致或者是盘符对应的大 ...
- 修改apache2配置,禁止目录访问+禁止访问.git文件夹
通过url访问服务器,无论是本地服务器还是远程服务器 如果你的文件根目录里有 index.html,index.php,浏览器就会显示 index.html的内容,如果没有 index.html,浏览 ...