I/O流(二)

一.缓冲流(缓冲区):

特点:本身没有读写的能力,需要借助普通的读写流进行读写,但可以加快读写的效率

分类:字符缓冲流:BufferedReader(读),BufferedWriter(写)

字节缓冲流:BufferedInputStream(读),BufferedOutputStream(写)

字符缓冲流代码实现文件读写:

public class Test {

    public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\Downloads\\workSpaceCJY\\WorkDemoIO\\c.txt"));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("j.txt")); String num=null;
while((num = bufferedReader.readLine())!=null) {//缓冲流特有方法,一次读一行
System.out.println(num);
bufferedWriter.write(num);
bufferedWriter.newLine();//缓冲流特有换行方式
bufferedWriter.flush();
}
bufferedReader.close();
bufferedWriter.close();
} }

字节缓冲流

public class Test {

    public static void main(String[] args) throws IOException {
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("D:\\Downloads\\workSpaceCJY\\WorkDemoIO\\c.txt"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("j.txt")); int num=0;
byte[]arr=new byte[10];
while((num = bufferedInputStream.read(arr))!=-1) {
System.out.println(new String(arr,0,num));
bufferedOutputStream.write(arr); bufferedOutputStream.flush();
}
bufferedInputStream.close();
bufferedOutputStream.close();
} }

LineNumberReader(父类是BufferedReader):可以设置行号

       LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("D:\\Downloads\\workSpaceCJY\\WorkDemoIO\\c.txt"));
lineNumberReader.setLineNumber(0); int num = 0 ;
char[]arr = new char[10];
while((num=lineNumberReader.read(arr))!=-1) {
System.out.println(new String(arr,0,num));
}

二. 标准输入流:默认是将数据从控制台写入内存,接收的是键盘敲入的数据

标准输出流:默认是将数据从内存写入控制台

//实例:从键盘不断的接收,一次接收一行

public static void main(String[] args) throws IOException {
InputStream in = System.in;// 这里可以直接得到标准输入流的对象,并与键盘绑定,可以直接从键盘接收数据,标准输入流是字节流
// int num = in.read();//称为阻塞式的方法 特点是一直等待用户输入 StringBuffer buffer = new StringBuffer();
while (true) {
int num = in.read();// 读一个字节 if (num == '\r') {
continue;
} else if (num == '\n') {
// over字符串作为停止的表示
if (buffer.toString().equals("over")) {
break;
}
System.out.println(buffer.toString());
// 清空
buffer.delete(0, buffer.length());
} else {
buffer.append(num);
} } }

三.转化流:

作用:将字节流转化成字符流

分类:输入转化流:InputStreamReader

输出转化流:OutputStreamWriter

public static void main(String[] args) throws IOException {
// 分析:刚才实现的功能类似于BufferedReader里面的readLine(),现在的标准输入流是字节流,要想使用readLine(),就将字节流转换成字符流 // 1.获取标准输入流
// InputStream in = System.in;
// 2.通过转化流,转成字符流
// InputStreamReader is = new InputStreamReader(in);
// 3.得到缓冲流
// BufferedReader br = new BufferedReader(is); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 4.获取标准输出流 PrintStream:打印流,是输出标准的一种
// PrintStream pr = System.out;
// 5.通过转化流,转成字符流
// OutputStreamWriter osw = new OutputStreamWriter(pr);
// 6.得到字符缓冲写出流
// BufferedWriter bw = new BufferedWriter(osw); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 7.进行读写(读一行,写一行)
String data = null;
while ((data = br.readLine()) != null) {
bw.write(data);
bw.newLine();// 换行
bw.flush();// 因为没执行到close所以单独加个刷新 // 将over字符串作为结束的标记
if (data.equals("over")) {
break;
}
} br.close();
bw.close(); }

四.打印流

特点:除了拥有流的特点之外,还有打印的功能

分类:字节打印流:PrintStream(直接支持的设备:File类型的文件,字符串类型的文件,字节输出流)

字符打印流:PrintWriter(直接支持的设备:File类型的文件,字符串类型的文件,字节输出流,字符输出流)

//File类型的文件
// new PrintStream(new File("D\\下载\\AV\\H.txt"));
//字符串类型
//new PrintStream("D.txt");
//字节输出流
//new PrintStream(FileOutputStream("H.txt")); PrintStream p = new PrintStream("C.txt");
p.write(97);
p.write(353);
p.write(String.valueOf(353).getBytes());
p.close //1.File类型的文件
//new PrintWriter(new File(""));
//2.字符串类型的文件
//new PrintWriter("temp1.txt");
//3.字节输出流
//new PrintWriter(new FileOutputStream("temp1.txt"));
//4.字符输出流
//new PrintWriter(new FileWriter("temp1.txt")); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); PrintWriter printWriter = new PrintWriter(System.out); String data = null;
while ((data = bufferedReader.readLine()) != null) {
printWriter.write(data);
printWriter.write("\r\n");
printWriter.flush();
}
bufferedReader.close();
printWriter.close();

五.序列化流和反序列化流

序列化流:将数据从内存存储到磁盘中的过程,数据可以长久的保存

反序列化流:将数据从磁盘取出,放入内存的过程

序列化的作用:主要是实现数据的长久存储(数据持久化)

实现序列化的流:ObjectOutputStream

实现反序列化的流:ObjectInputStream

注意:序列化流和反序列化流都要通过对应的流实现读写

public class Test1 {

    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {

        // 完成序列化-写出
// writeFile();
// 完成序列化-读入
readFile();
} public static void writeFile() throws FileNotFoundException, IOException {
// 创建序列化流对象并关联对象流
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ObjectFile"));
// objectOutputStream.writeInt(4);
// 调用方法实现序列化:序列化的内容不能直接查看(中文乱码),要想查看内容必须进行反序列化
objectOutputStream.writeObject(new Person("bingbing", 11));
// 关闭流
objectOutputStream.close(); } public static void readFile() throws FileNotFoundException, IOException, ClassNotFoundException { // 创建反序列化流对象并关联对象流
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("ObjectFile"));
Object object = inputStream.readObject();
System.out.println(object);
inputStream.close();
} }

六.随机流

定义:随机流又叫随机访问流,不属于IO体系,只能操作文件,内部既有字节输入流,也有字节输出流(同一个对象)

原理:在随机流内部有一个大的字节数组,可以通过指针进行操控,当我们进行随机访问时,让指针指向对应的字节,就可以从当前字节开始读或写

//随机流
public class Test {
public static void main(String[] args) throws IOException {
// 写
// writeFile();
// 读
readFile();
} // 写
public static void writeFile() throws IOException {
// 1.创建随机访问流对象并关联文件
RandomAccessFile accessFile = new RandomAccessFile("data.txt", "rw");// mode指定当前对象的可操作模式:read只读,write只写,readwrite读写 // 验证读
// byte[]arr = new byte[50];
// accessFile.read(arr);
// System.out.println(new String(arr)); // 2.写
accessFile.write("bingbing".getBytes());// 8个字节
accessFile.writeInt(97);// 4个字节
accessFile.write(97);// 1个字节 // 获取当前的所有字节数(获取当前文件指针的位置)
System.out.println(accessFile.getFilePointer());// 13
// 要求:从第十六个字节开始写内容:seek(16);参数代表当前指针指向的位置(默认指向文件的最后一个字节)
accessFile.seek(16);
accessFile.write(100);// 4个字节
System.out.println(accessFile.getFilePointer());// accessFile.close(); } // 读
public static void readFile() throws IOException {
RandomAccessFile accessFile = new RandomAccessFile("data.txt", "rw"); // 要求只读bingbing,指针指向了15
accessFile.seek(15);
// 验证读
byte[] arr = new byte[50];
accessFile.read(arr);
System.out.println(new String(arr)); accessFile.close();
}
}

Java I/O流详解与应用(二)的更多相关文章

  1. Java之IO流详解

    IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. ...

  2. java I/O流详解

    概况 I/O流主要分为二大类别:字符流和字节流. 字节流(基本流) 1.字节输入流    类名:FileInputStream    特点:读(对文件进行读取操作)    父类:InputStream ...

  3. JAVA中IO流详解

    IO流:数据传输是需要通道的,而IO流就是数据传输的通道. IO流可以形象的比喻为运送货物的传输带. IO流的分类: ①根据操作的数据类型的不同可以分为 :字节流与字符流. ②根据数据的流向分为:输入 ...

  4. java之IO流详解(二)

    好了,昨天讲了字节流,现在我们就来讲字符流吧... 字符流可以这样理解,字符流 = 字节流 + 编码表,目的是为了更好的操作中文字符(注:字符流只可以可以操作字符类型的文件,不能操作影音图像文件,要操 ...

  5. java之IO流详解(一)

    IO流的分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流  InputStream 字节输出流  OutputStream 字符流 字符输入流  Reader 字 ...

  6. Java I/O流详解与应用

    注:学习之前,需要自己思考,不要盲目的去看!!!!!不然没有任何意义 I/O流(一) 1.定义:实现设备之间的传输 2.作用:实现数据的读入和写出 3.分类:根据操作分为:输入流和输出流 根据类型分为 ...

  7. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  8. Java输出流FileOutputStream使用详解

    Java输出流FileOutputStream使用详解 http://baijiahao.baidu.com/s?id=1600984799323133994&wfr=spider&f ...

  9. java网络编程(TCP详解)

    网络编程详解-TCP 一,TCP协议的特点              面向连接的协议(有发送端就一定要有接收端)    通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...

随机推荐

  1. java——封装和关键字

    封装:将类的属性和方法的实现细节隐藏起来的过程 封装的好处:1重用性(代码)2,利于分工3,隐藏细节 访问关键字:public private 默认访问修饰符,protected static关键字 ...

  2. JNDI 使用

    J2EE技术规范(一)——JNDI 分类: java 基础2012-12-02 20:05 1539人阅读 评论(14) 收藏 举报 学习Java,我们首先要掌握的就是十三种技术规范,我们接下来就一步 ...

  3. Day14 Javascript 点击添加出弹窗,取消隐藏弹窗小练习 反选,全选,取消边框

    点击添加出弹窗,取消隐藏弹窗小练习 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  4. JWT实现用户权限认证

    网上的java基础教程曾教会我们,将用户登录信息存在session(服务器端)中,需要验证的时候拿出来作对比以达到身份 验证的效果.但这种方式暴露的问题也是可想而知的: 1.Seesion:每次认证用 ...

  5. 多线程中操作UI

    遇到过要在工作线程中去更新UI以让用户知道进度,而在多线程中直接调用UI控件操作是错误的做法. 最后解决方法是将操作UI的代码封装,通过Invoke / BeginInvoke 去委托调用. 代码封装 ...

  6. Vue作者尤雨溪:以匠人的态度不断打磨完善Vue (图灵访谈)

    访谈对象: 尤雨溪,Vue.js 创作者,Vue Technology创始人,致力于Vue的研究开发. 访谈内容: 你为何选择从事前端方面的工作? 其实,我本科读的是艺术史,研究生阶段学习Design ...

  7. 微信小程序之获取用户位置权限(拒绝后提醒)

    微信小程序获取用户当前位置有三个方式: 1. wx.getLocation(多与wx.openLocation一起用) 获取当前的精度.纬度.速度.不需要授权.当type设置为gcj02 返回可用于w ...

  8. lintcode 在O(1)时间复杂度删除链表节点

    题目要求 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 样例 Linked list is 1->2->3->4, and giv ...

  9. Java并发之ReentrantReadWriteLock

    上篇文章简单的介绍了ReentrantLock可重入锁.事实上我们可以理解可重入锁是一种排他锁,排他锁在同一个时刻只能够由一个线程进行访问.这就与我们实际使用过程中有点不想符合了,比如说当我们进行读写 ...

  10. 【转】详解JavaScript中的异常处理方法

    有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个 ...