IO流的概述及其分类

  • IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式
  • Java用于操作流的类都在IO包中

流按流向分为两种:输入流(读写数据)     输出流(写数据)

流按操作类型分为两种:

  • 字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
  • 字符流:字符流只能操作纯字符数据,比较方便

常用的IO流的类

字节流的抽象父类:InputStream     OutputStream

字符流的抽象方法:Reader   Writer

InputStream实现类FileInputStream

InputStream是抽象类,表示字节输入流

FileInputStream从文件系统中的某个文件中获得输入字节。FileInputStream用于读取图像数据之类的原始字节流。要读取字符流,就要用FileReader

构造方法:

  • FileInputStream(File file)
  • FileInputStream(String name)

FileInputStream的构造方法可以传一个File对象,也可以传一个字符串路径

成员方法:

  • int read()   从此输入流中读取到一个数据字节

案例:读取一个txt文件数据

package null08031628;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("C:/Users/Administrator/Desktop/baiduyunpan.txt");
FileInputStream fis = new FileInputStream(file);
int i = ;
while((i = fis.read()) != -){
System.out.println(i);
}
     fis.close();
} }

OutputStream实现类FileOutputStream文件输出流

文件输出流就是用于将数据写入File的输出流

案例:从一个文件读入数据写入另一个文件package null08031638;import java.io.File;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class Demo01 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub File filein = new File("C:/Users/Administrator/Desktop/baiduyunpan.txt"); InputStream fis = new FileInputStream(filein); //创建一个输入流 File fileout = new File("C:/Users/Administrator/Desktop/baiduyunpan-2.txt"); OutputStream fos = new FileOutputStream(fileout); //创建一个输出流 int i = 0;
while((i=fis.read())!=-1){
fos.write(i);
}
     fos.close();
     fis.close();
} }

通过available()方法,进行字节数组拷贝(错误的,不推荐的,如果文件超级大怎么办?)

package null08031700;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub FileInputStream input = new FileInputStream("C:/Users/Administrator/Desktop/baiduyunpan.txt"); FileOutputStream out = new FileOutputStream("C:/Users/Administrator/Desktop/baiduyunpan-3.txt"); byte[] bs = new byte[input.available()];//定义一个文件输入流那么大的字节数组
input.read(bs); //一次性将数据写入到字节数组中 out.write(bs); //一次性将文件写入
input.close();
out.close(); } }

自定义一个大小的数组,进行一个流的读写(正确的方法)

package null08031707;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub FileInputStream input = new FileInputStream("C:/Users/Administrator/Desktop/baiduyunpan.txt"); FileOutputStream out = new FileOutputStream("C:/Users/Administrator/Desktop/baiduyunpan-3.txt"); byte[] bs = new byte[8*1024]; int i = 0;
while((i=input.read(bs))!=-1){
out.write(i);
}
out.close();
input.close(); } }

通过字节数组的方法操作流,其实就是相当于是创建了一个缓冲区

自带缓冲区的实现类BufferedInputStream和BufferedOutputStream

BufferedInputStream

  • 内置了一个缓冲区(就是之前定义的那个数组)
  • 从BufferedInputStream中读取一个字节时,BufferedInputStream会一次性的读入8192个,放在缓冲区,在返回给程序
  • 程序再次读取时,就不会再从文件中取了,直接从缓冲区获取
  • 知道缓冲区中的所有都被用过了,BufferedInputStream才重新从文件中读取8192个

BufferedOutputStream

  • 内置了一个缓冲区(数组)
  • 程序向流中写入字节时,不会直接写到文件,而是先写入缓冲区当中
  • 知道缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写入文件

一个小小的例子:

package null08031732;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = new FileInputStream("C:/Users/Administrator/Desktop/baiduyunpan.txt");
BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream("C:/Users/Administrator/Desktop/baiduyunpan-4.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos); int i;
while((i=bis.read())!=-1){
bos.write(i);
}
bis.close();
bos.close();
} }

带Buffered的流和自己写的字节数组缓冲对比

  • 字节写的数组在速度上回略胜一筹,因为自己写的读和写的操作都是在同一个数组之中
  • 而Buffered操作的是两个数组,所以效率低于一个的

BufferedOutputStream中的一些方法

  • flush()方法:用来刷新缓冲区,刷新后就可以再次写入了
  • close()方法:关闭流,而且在关闭前后会刷新一次缓冲区

补充

字节流读写中文时乱码的问题

字节流读取中文:

  • 字节流读取中文的问题
  • 字节流在读取中文的时候有可能会读到半个中文,造成乱码

字节流写入中文的问题:

  • 字节流直接操作的字节,所以写入中文的时候必须将字符串转换成字节数组
  • 写出回车换行write("\r\n".getBytes())

流的标准处理异常代码1.6版本前

package null08041019;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = null;
FileOutputStream fos = null; try{
fis = new FileInputStream("");
fos = new FileOutputStream(""); int b;
while((b=fis.read())!=-1){
fos.write(b);
}
}finally{
try{
fis.close();
}finally{
fos.close();
}
}
}
}

流的处理1.7版本

package null08041024;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub try(
//写在括号中的代码,执行完成后,会自动调用对象的close方法
//能写在括号中的代码的类一定是要继承AutoCloseable接口的类
FileInputStream fis = new FileInputStream("");
FileOutputStream fos = new FileOutputStream(""); ){
int i;
while((i=fis.read())!=-1){
fos.write(i);
}
}
} }

一个图片加密的例子:

package null08041031;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner; public class Demo01 { public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
System.out.println("请将图片放到和此文件的同级目录下");
System.out.println("请输入要加密的文件名:");
String fileName = sc.nextLine();
System.out.println("请输入加密后的文件名:");
String endFileName = sc.nextLine();
System.out.println("请输入密码:");
String pwd = sc.nextLine();
int pwdInt = Integer.parseInt(pwd); try(
FileInputStream fis = new FileInputStream(fileName);
FileOutputStream fos = new FileOutputStream(endFileName);
){
int i;
while((i=fis.read())!=-1){
fos.write(i^pwdInt);
}
}finally{
System.out.println("加密结束");
} } }

代码

Java学习之路(十二):IO流的更多相关文章

  1. Java学习之路(十二):IO流<二>

    字符流 字符流是可以直接读写字符的IO流 使用字符流从文件中读取字符的时候,需要先读取到字节数据,让后在转换为字符 使用字符流向文件中写入字符时,需要把字符转为字节在写入文件 Reader和Write ...

  2. Java学习之路(十二):IO流<三>

    复习:序列流 序列流可以把多个字节输入整合成一个,从序列流中读取到数据时,将从被整合的第一个流开始读取,读完这个后,然后开始读取第二个流,依次向后推. 详细见上一篇文章 ByteArrayOutput ...

  3. Java学习之路(十一):IO流<前戏>

    File类的概述和构造方法 构造方法: File(String pathname):根据一个路径得到File对象 File(String parent,String child):根据一个目录和一个子 ...

  4. java学习第21天(IO流的使用)

    IO流分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 注意: a:如果我们没有明确说明按照什么分,默认按照数据类型分 ...

  5. Java学习之路(十):异常

    ---恢复内容开始--- 异常的概述和分类 Throwable类是Java语言中所有错误或者异常的超类(也就是说,Java中所有的报错都是继承与Throwable的),也只有当对象是此类或者此类的子类 ...

  6. JAVA学习第五十二课 — IO流(六)File对象

    File类 用来给文件或者目录封装成对象 方便对文件与目录的属性信息进行操作 File对象能够作为參数传递给流的构造函数 一.构造函数和分隔符 public static void FileDemo( ...

  7. java痛苦学习之路[十二]JSON+ajax+Servlet JSON数据转换和传递

    1.首先client须要引入 jquery-1.11.1.js 2.其次javawebproject里面须要引入jar包  [commons-beanutils-1.8.0.jar.commons-c ...

  8. JAVA学习第六十二课 — TCP协议练习

    通过练习掌握TCP在进行传输过程中的问题 练习1:创建一个英文大写转换server client输入字母数据,发送给服务端,服务端收到后显示到控制台,并将该数据转成大写返回client,知道clien ...

  9. JAVA学习第五十七课 — IO流(十一)

    一.管道流 PipedInputStream 和 PipedOutPutStream 输入和输出能够直接进行连接.结合线程使用 管道流,顾名思义,写一个读一个.连成一个管子 API文档:管道输入流应该 ...

随机推荐

  1. s111 stark组件

    内容回顾: 1. 类当做key 2. django中的model所在app名称.以及小写类名. def index(request): # print(m1.UserInfo,m1.UserInfo. ...

  2. POJ2502乘坐地铁上学

    POJ2502 题目大意:给你一个二维地图,起点终点,以及多条地铁线路(只有相邻两站才可互通)中的站点坐标.步行以及坐地铁的速度: 思路:难点在于建图,一个多小时磨磨蹭蹭,都是因为思路没捋清楚~~,对 ...

  3. ibatIs中的isNotNull、isEqual、isEmpty

    isNull判断property字段是否是null,用isEmpty更方便,包含了null和空字符串 例子一:isEqual相当于equals,数字用得多些,一般都是判断状态值<isEqual ...

  4. Delphi 动态与静态调用DLL(最好的资料)

    摘要:本文阐述了 Windows 环境下动态链接库的概念和特点,对静态调用和动态调用两种调用方式作出了比较,并给出了 Delphi 中应用动态链接库的实例. 一.动态链接库的概念    动态链接库(  ...

  5. MLLib实践Naive Bayes

    引言 本文基于Spark (1.5.0) ml库提供的pipeline完整地实践一次文本分类.pipeline将串联单词分割(tokenize).单词频数统计(TF),特征向量计算(TF-IDF),朴 ...

  6. 使用ABP框架踩过的坑系列1

        企业级(例如ERP)应用, 一遍一遍的在重复:认证.验证.异常处理.日志.国际化和本地化.数据库连接管理.配置管理. 审计记录等,同时.NET有很多最佳实践:分层.模块化.DDD领域驱动.DI ...

  7. HTTP响应状态码说明

    当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(Server Header)用以响应浏览器的请求. HTTP状态码共分为五种类型: 1**:信息,服务器接收到请求,需 ...

  8. 深入浅出“跨视图粒度计算”--2、INCLUDE表达式

    本文由  网易云发布. 上一篇,讲了什么是数据的粒度,以及网易有数中,哪些地方能够改变视图上的数据粒度. 现在正式开始跨视图粒度计算表达式的讲解,我们首先来看一下INCLUDE表达式 { INCLUD ...

  9. python 发qq邮件

    import smtplibfrom email.mime.text import MIMETextmsg_from = '979477675@qq.com' # 发送方邮箱passwd = 'irg ...

  10. Day 31 面向对象考试题 第四次考试.

    一 基础知识和函数: 1.文件操作有哪些模式?请简述各模式的作用 r ,只读模式[默认模式,文件必须存在,不存在则抛出异常] w,只写模式[不可读:不存在则创建:存在则清空内容] x, 只写模式[不可 ...