javaIO——输入输出流
字节流与字符流
File类不支持对文件内容进行相关的操作,所有若要处理文件的内容,则需要通过流操作模式来完成。
流的基本操作步骤:
Step1:根据文件路径创建File类对象.
Step2:根据字节流或字符流的子类实例化父类对象.
Step3:进行数据的读取或写入操作.
Step4:关闭流(Close()).
(1)字节流
A. 字节输出流(OutputStream)
(1)Outputstream的类结构
public abstract class OutputStream implements Closeable, Flushable
观察OutputStream的结构,可以发现其为一个抽象类(要想对父类实例化必须使用子类)并且实现了Closeable和Flushable两个接口:
public interface Closeable extends AutoCloseable
public interface Flushable
若要通过程序对内容进行输出,则需要引入java.io.OutputStream.
(1)Outputstream类提供的方法
因为OutputStream为抽象类,所以要用子类对其进行实例化操作。我们若要对文件进行操作,则需用到FileOutputStream类对其进行实例化。
|
将给定字符数组的内容全部输出: 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 |
-
public class Test2 {
-
public static void main(String[] args) throws IOException {
-
String singal = File.separator;
-
//1.根据文件路径创建File对象
-
File file = new File("G:"+singal+"lemon"+singal+"testIO"+singal+"TestIO.java");
-
//保证父目录存在
-
if(!file.getParentFile().exists()) {
-
//若目录不存在则创建多级目录
-
file.getParentFile().mkdirs();
-
}
-
//根据字节流的子类实例化父类对象
-
//此时只能操作File类
-
OutputStream outputStream = new FileOutputStream(file);
-
//使得内容实现追加操作,而非覆盖
-
//OutputStream outputStream = new FileOutputStream(file,true);
-
//将指定语句输出到文件的内容中
-
String string = "今天真热啊!";
-
//将内容变为字节数组
-
outputStream.write(string.getBytes());
-
//将内容变为字节数组,并且设置要输出的范围
-
//outputStream.write(string.getBytes(),0,5);
-
outputStream.close();
-
}
-
}
在进行文件输出的时候,所有的文件会自动帮助用户创建,不在需要调用createFile()方法手工创建。
当我们运行多次时发现文件中的内容仍然只有一句,这是因为FileOutputStream(File file)该构造函数只能实现内容的覆盖并不能实现内容的追加处理,若想使得内容得到追加,则需使用提供的另外一个构造函数 FileOutputStream(File file,boolean append)来实现。
实现追加输出运行结果如下:
将给定部分内容输出结果如下:
(2)字符流
字符流适用于处理中文数据
A. 字符输出流(Writer)
public abstract class Writer implements Appendable, Closeable, Flushable比OutputStream多实现了一个Appendable接口。
在Writer类里面也提供write()方法,而且该方法接收的类型都是char型,要注意的是,Writer类提供了一个直接输出字符串的方法
public void write(String str) throws IOException
Writer类的结构与方法的使用与OutputStream非常相似,只是Writer类对于中文的支持很好并且提供了直接写入 String的方法而已。
-
/*
-
* 字符输出流
-
* */
-
public class Test2{
-
public static void main(String[] args) throws IOException {
-
String singal = File.separator;
-
//1.根据文件路径创建File对象
-
File file = new File("G:"+singal+"lemon"+singal+"testIO"+singal+"TestIO.java");
-
//利用子类实例化父类对象
-
Writer writer = new FileWriter(file);
-
writer.write("你好");
-
writer.close();
-
}
-
}
B. 字符输入流(Reader)
public abstract class Reader implements Readable, Closeable
Reader仍然为抽象类,若要对文件进行读取操作,则要使用FileReader对其进行实例化操作。
由上面的Writer类中可知其提供的方法可以直接向目标源写入字符串,但是Reader类提供的方法中只能通过字符数组进行读取操作,而没有直接的方法使其可以直接读取字符串类型。
-
/*
-
* 字符输入流
-
* */
-
public class Test2{
-
public static void main(String[] args) throws IOException {
-
String singal = File.separator;
-
//1.根据文件路径创建File对象
-
File file = new File("G:"+singal+"lemon"+singal+"testIO"+singal+"TestIO.java");
-
//利用子类实例化父类对象
-
Reader reader = new FileReader(file);
-
char[] cs = new char[1024];
-
int len = reader.read(cs);
-
String result = new String(cs,0,len);
-
System.out.println(result);
-
//关闭流
-
reader.close();
-
}
-
}
(3)字符流与字节流的区别
A. 字节流是原生操作,而字符流是经过加工处理后的操作。
B. 字符流适合处理中文,字节流适合处理一切数据类型(对中文支持不好)。
C. 所有字符流的操作,无论是写入还是输出,数据都先保存在缓存中。
D. 如果字符流不关闭,数据就有可能保存在缓存中并没有输出到目标源。这种情况下就必须强制刷新才能够得到完整数据。
-
public class Test2{
-
public static void main(String[] args) throws IOException {
-
String singal = File.separator;
-
//1.根据文件路径创建File对象
-
File file = new File("C:"+singal+"Users"+singal+"lenovo"+singal+"DeskTop"+singal+"Test.txt");
-
if(!file.getParentFile().exists()) {
-
file.getParentFile().mkdirs();
-
}
-
Writer writer = new FileWriter(file);
-
writer.write("hello world !");
-
//进行刷新,若不进行刷新,则内容无法写入
-
//强制清空所有缓冲区内容,所有内容都输出
-
//writer.flush();
-
}
-
}
javaIO——输入输出流的更多相关文章
- Java-IO 输入输出流详解
一.文件的编码 开发时一定要注意项目默认的编码!!!!!!!! 文件操作的时候一定要记得关闭!!!!!!!! ASCII:美国标准 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- 第27章 java I/O输入输出流
java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...
- java 对象输入输出流
对象的输入输出流的作用: 用于写入对象 的信息读取对象的信息. 对象的持久化. 比如:用户信息. ObjectInputStream : 对象输入流 ...
- 【转】输入/输出流 - 全面掌握IO
File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...
- 输入输出流(IO)
输入输出流(IO)文件(File)java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录.File类只用于表示文件(目录)的信息(名称.大小等), ...
- Java输入/输出流体系
在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...
- JAVA Io 缓冲输入输出流
java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...
随机推荐
- zabbix部署文档
环境:zabbix server centos 7 1611最小化安装 172.16.103.2 zabbix client Centos 7 1611 最小化安装 172.16.103.3 1,配置 ...
- jmeter 插件安装之阶梯式压测(五)
一.Jmeter插件安装 jmeter-plugins-manager-1.4.jar 下载地址:https://jmeter-plugins.org/install/Install/ 下载之后将插件 ...
- 初试Docker-打包构建镜像
在 docker 中,镜像的结构是以层次划分的,也就是可以在每一层上添加自己的修改,变成新的镜像. docker 两种打包方式如下: commit build docker commit 注意: do ...
- 大白话讲解调用Redis的increment失败原因及推荐使用
大家在项目中基本都会接触到redis,在spring-data-redis-2.*.*.RELEASE.jar中提供了两个Helper class,可以让我们更方便的操作redis中存储的数据.这两个 ...
- Spring Cache 带你飞(二)
接着上一篇讲了 Spring Cache 如何被 Spring Aop 代理加载对应的代码,以及何如注入相关界面逻辑. Spring Cache 带你飞(一) 本篇我们围绕两个要点展开: 一个数据是如 ...
- 用户登录成功后重新获取新的Session
HttpSession session = request.getSession(); // 用来存储原sessionde的值 ConcurrentHash ...
- vue项目在打包时,去掉所有的console.log输出
npm i babel-plugin-transform-remove-console -S const proPlugins = [];// 开发环境 不做操作 // 生产环境,去掉console ...
- php多域名跳转nginx
当web服务器nginx已经配置好了网站根目录时,需要增加另外的域名.但是由于限制必须在原来的网站根目录下面,nginx已经无法实现.只能通过php index页面进行调试.如下面: define(' ...
- [loj3523]分糖果
做法1 将问题离线,并在左端点和右端点打上差分,之后即可以看作求$f(C,[a_{1},a_{2},...,a_{n}])$,其表示以$C$为上限(0为下限),从0开始不断加上$a_{i}$(可以为负 ...
- 【JAVA】笔记(12)---集合(1)-概述篇
楔子: 1.集合相当于一个容器,数组虽然也相当于一个容器,但是集合的特性更符合我们日常开发的需求,所以集合的使用更加频繁: 2.集合特性: 1)集合的长度可变,数组一经初始化,长度固定: 2)集合可以 ...