1. 流的基本概念

在java.io包里面File类是唯一一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作。输入和输出实质上传递的就是一种数据流的处理形式,数据流指的是字节数据 。而对于这种流的处理形式在java.io包里面提供有两类支持。

  • 字节处理流:OutputStream(输出字节流)InputStream(输入字节流)
  • 字符处理流:Writer(输出字符流)Reader(输入字符流)

流操作的统一处理步骤(以文件处理流程为例):

  • 果现在要进行的是文件的读写操作,则一定要通过File类找到一个文件路径
  • 通过字节流或字符流中的方法来实现数据的输入与输出操作
  • 流的操作属于资源操作,资源操作必须进行关闭处理

2.字节输出流:OutputStream类

字节的数据是以byte类型为主实现的操作,在进行字节内容的输出的时候可以使用OutputStream类完成

类的基本定义:

  • public abstract class OutputStream extends Object implements Closeable, Flushable

三个内容输出的方法:

  • 输出一组字节数据:public void write​(byte[] b) throws IOException
  • 输出部分字节数据:public void write​(byte[] b,int off,int len)throws IOException
  • 输出单个字节数据:public abstract void write​(int b)throws IOException

注意:

OutputSream是一个抽象类,如果想要获得实例化对象应该通过对子类实例的向上转型完成,如果说现在要进行的是文件处理操作,则可以使用FileOutputStream子类

FileOutputStream构造方法:

  • public FileOutputStream​(File file)throws FileNotFoundException
  • public FileOutputStream​(File file,boolean append)throws FileNotFoundException

范例:使用OutputStream类实现内容输出(符合上述的流操作的统一处理步骤)

import java.io.*;

public class OutputStreamDemo {

    public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("D:"+File.separator+"hello"
+File.separator+"demo.txt"); //1.指定要操作的文件路径
if(!file.getParentFile().exists()) { //文件不存在
file.getParentFile().mkdirs(); //创建父目录
}
try (OutputStream output = new FileOutputStream(file,true)) {//2.通过子类实例化
String str = "hello world\r\n"; //要输出的文件内容
output.write(str.getBytes());//3.将字符串变为字节数组并输出
} catch (IOException e) {
e.printStackTrace();
}//4.AutoCloseable 自动关闭
//执行后会自动帮助用户创建文件
} }

3.字节输入流:InputStream类

类的基本定义:

  • public abstract class InputStream extends Object implements Closeable

核心方法:

  • 读取单个字节数据,如果以及读取到底,返回-1:public abstract int read() throws IOException
  • 读取一组字节数据,返回的是读取的个数,如果没有则返回-1:public int read​(byte[] b) throws IOException
  • 读取一组字节数据的部分内容(只占数组的部分):public int read​(byte[] b,int off,int len) throws IOException

InputoutStream和OutputStream一样都属于抽象类,要依靠子类来实例化对象

FileInputStream构造方法:

  • public FileInputStream​(File file) throws FileNotFoundException

范例:读取数据

import java.io.*;

public class InputStreamDemo {

    public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("D:"+File.separator+"hello"
+File.separator+"demo.txt");//读取的文件路径
InputStream input = new FileInputStream(file);
byte[] data = new byte[1024];//用于存放读取出的内容的缓冲区
int len = input.read(data);//读取的内容长度
System.out.println("【"+new String(data,0,len)+"】");//输出缓冲区读取的内容
input.close();
} }

4.字符输出流:Writer类

OutputStream数据输出的时候使用的是字节,而很多时候字符串的输出是比较方便的,所以在JDK1.1时推出字符输出流

类的基本定义:

  • public abstract class Writer extends Object implements Appendable, Closeable, Flushable

两个主要的输出方法:

  • 输出字符数组:public void write​(char[] cbuf)throws IOException
  • 输出字符串:public void write​(String str)throws IOException

范例:使用Writer输出

import java.io.*;

public class WriterDemo {

    public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("D:"+File.separator+"hello"
+File.separator+"demo.txt"); //1.指定要操作的文件路径
if(!file.getParentFile().exists()) { //文件不存在
file.getParentFile().mkdirs(); //创建父目录
}
Writer out = new FileWriter(file,true);
String str = "goodbye world\r\n";
out.write(str);
out.append("hahahaha");//追加输出内容
out.close();
} }

5.字符输入流:Reader类

类的基本定义:

  • public abstract class Reader extends Object implements Readable, Closeable

输入方法:

  • 读取单个字节数据,如果以及读取到底,返回-1:public abstract int read() throws IOException
  • 读取一组字节数据,返回的是读取的个数,如果没有则返回-1:public int read​(byte[] b) throws IOException
  • 读取一组字节数据的部分内容(只占数组的部分):public int read​(byte[] b,int off,int len) throws IOException

字符流读取的时候只能够按照数组的形式来实现处理操作,不能够直接按照字符串的形式

范例:实现数据读取

import java.io.*;

public class ReaderDemo {

    public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("D:"+File.separator+"hello"
+File.separator+"demo.txt");
if(file.exists()) {
Reader in = new FileReader(file);
char[] data = new char[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
in.close();
}
} }

6.字节流和字符流大的区别

在使用OutputStream类输出的时候如果没有使用close()方法关闭输出流发现内容依然可以实现正常的输出
但是如果在使用Writer的时候没有使用close()方法关闭输出流,那么这个内容将无法进行输出,因为Writer使
用到缓冲区,当使用了close()方法的时候实际上会出现有强制刷新缓冲区的情况,所以这个时候会将内容进行
输出操作,所以此时如果在不关闭的情况下想要将全部内容输出可以使用flush()方法强制情况缓冲区

字符流的优势在于处理中文数据上

7.转换流

转换流就是可以实现字节流与字符流操作的功能转换,例如:进行输出的时候OutputStream需要将内容变
为字节数组后才可以输出,而Writer可以直接输出字符串,这一点是方便的,所以很多人就认为需要提供一种
转换的机制,来实现不同的流类型的转换操作,为此在java.io包里面提供有两个类:InputStreamReader
OutputStreamWriter。

类:           OutputStreamWriter                                                            InputStreamReader

定义:       public class OutputStreamWriter extends Writer                public class InputStreamReader extends Reader

构造方法:public OutputStreamWriter​(OutputStream out)                   public InputStreamReader​(InputStream in)

从构造方法可以看出,所谓的转换处理,就是将接收到的字节流对象向上转型变为字符流对象

范例:转换流

import java.io.*;

public class OutputStreamWriterDemo {

    public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
File file = new File("D:"+File.separator+"hello"
+File.separator+"demo.txt");
if(!file.getParentFile().exists()) { //文件不存在
file.getParentFile().mkdirs(); //创建父目录
}
OutputStream output = new FileOutputStream(file,true);
Writer out = new OutputStreamWriter(output);
out.write("i am back");
out.close();
} }

java学习笔记之IO编程—字节流和字符流的更多相关文章

  1. java学习笔记之IO编程—打印流和BufferedReader

    1.打印流(PrintWriter) 想要通过程序实现内容输出,其核心一定是要依靠OutputStream类,但是OutputStream类有一个最大缺点,就是这个类中的输出操作功能有限,所有的数据一 ...

  2. Java学习笔记之 IO包 字节流

    IO包最重要的五个类和一个接口 File/OutputStream/InputStream(字节流)/Writer/Reader(字符流) 一个接口:Serializable   File类: 字节流 ...

  3. java学习笔记之IO编程—内存流、管道流、随机流

    1.内存操作流 之前学习的IO操作输入和输出都是从文件中来的,当然,也可以将输入和输出的位置设置在内存上,这就需要用到内存操作流,java提供两类内存操作流 字节内存操作流:ByteArrayOutp ...

  4. java学习笔记之IO编程—对象序列化

    对象序列化就是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或网络传输. 并不是所有的对象都可以被序列化,如果要序列化的对象,那么对象所在的类一定要实现java.io.Serial ...

  5. java学习笔记之IO编程—目录和文件的拷贝

    进行文件或目录的拷贝时,要先判断处理对象是文件还是目录,如果是文件则直接拷贝,如果是目录还需要拷贝它的子目录及其文件,这就需要递归处理了 import java.io.*; class FileUti ...

  6. java学习笔记之IO编程—File文件操作类

    1. File类说明 在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一一个与文件本身操作( ...

  7. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  8. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  9. 【原】Java学习笔记033 - IO

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 需求:继承关系中爷 ...

随机推荐

  1. 测试用例设计:PICT的安装及使用

    一.下载与安装 打开百度网页,搜索PICT,即可找到许多下载链接,点击这里,下载到桌面,点击安装.一直NEXT,安装路径保存在C盘: 二.PICT 使用 1.找到安装目录,即可看到以下内容 2.创建t ...

  2. 文件(file 类)

    题目: 编写一个应用程序,输入一个目录和一个文件类型,显示该目录下符合该类型的所有文件.之后,将这些文件中的某一个文件剪切到另外一个目录中. 代码: File_Demo /** * 包含两个类,一个主 ...

  3. 你都这么拼了,面试官TM怎么还是无动于衷

    面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. 我相 ...

  4. xgboost load model from demp text file

    python package : https://github.com/mwburke/xgboost-python-deploy import xgboost as xgb import numpy ...

  5. 动手学习pytorch——(2)softmax和分类模型

    内容太多,捡重要的讲. 在分类问题中,通常用离散的数值表示类别,这里存在两个问题.1.输出值的范围不确定,很难判断值的意义.2.真实标签是离散值,这些离散值与不确定的范围的输出值之间的误差难以衡量. ...

  6. django项目中使用KindEditor富文本编辑器

    先从官网下载插件,放在static文件下 前端引入 <script type="text/javascript" src="/static/back/kindedi ...

  7. 一次压力测试Bug排查-epoll使用避坑指南

    Bug复现 使用Webbench对服务器进行压力测试,创建1000个客户端,并发访问服务器10s,正常情况下有接近8万个HTTP请求访问服务器. 结果显示仅有7个请求被成功处理,0个请求处理失败,服务 ...

  8. Python Flask 开发学习笔记

    Flask学习 安装pipenv虚拟环境 pip Install pipenv 运行pipenv pipenv --version 进入虚拟容器 pipenv install 安装flask pipe ...

  9. React之虚拟DOM中的Diff算法

    一.React中的setState ( 异步函数,异步获取数据 ) 若操作的时间间隔短,它可以将多个setState结合成一个setState,减少虚拟DOM的比对次数,提高性能 二.同层虚拟DOM对 ...

  10. 《自拍教程29》Sublime_小脚本编写首选

    Sublime Sublime 是一个轻量.简洁.高效.跨平台的编辑器, 最新的是Sublime Text 3. Sublime对Python支持非常好,如果只是简单的编写批处理脚本编写, 或者小范围 ...