Java第三十天,I/O操作
一、基本概念
输入输出一般是相对与内存、CPU寄存器、当前进程来说的
输入:从硬盘、键盘等外部设备读取数据到内存、当前进程或CPU寄存器中
输出:利用当前进程将数据写入到硬盘、终端显示屏等外部设备中
二、Java中IO操作的方法——字节流、字符流
输入流 | 输出流 | |
---|---|---|
字节流 |
InputStream |
OutputStream |
字符流 |
Reader |
Writer |
三、OutputStream
该类是所有字节输出流的抽象父类
1.公共方法
void close() ===> 关闭输出流并释放系统资源
void flush() ===> 刷新输出流并强制缓冲的输出字节被写出
void write(byte[] b) ===> 将b.length字节从指定的字节数组写入此输出流
void write(byte[] b,int off,int len) ===> 从指定的字节数组写入len个字节,从偏移off开始输出到此输出流
abstract void write(int b) ===> 将指定的字节写入此输出流
2.直接子类
ByteArrayOutputStream
FileOutputStream
FilterOutputStream
ObjectOutputStream
OutputStream
PipedOutputStream
3.FileOutputStream使用
(1)构造方法
FileOutputstream(File file) ===> 创建文件输出流
FileOutputstream(File file,boolean append) ===> 创建文件输出流,第二个参数指出是否追加写入
Fileoutputstream(String name) ===> 创建文件输出流以指定的名称写入文件
FileOutputstream(String name,boolean append) ===> 创建文件输出流,第二个参数指出是否追加写入
(2)具体代码实现
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class MyWrite {
public static void main(String[] args) throws IOException {
for (int i = 97; i < 117; i++) {
File file1 = new File("F:\\a.txt");
String file2 = new String("F:\\b.txt");
File file3 = new File("F:\\c.txt");
String file4 = new String("F:\\d.txt");
FileOutputStream fosA = new FileOutputStream(file1);
FileOutputStream fosB = new FileOutputStream(file2);
FileOutputStream fosC = new FileOutputStream(file3,true);
FileOutputStream fosD = new FileOutputStream(file4,true);
fosA.write(i);
fosB.write(i);
fosC.write(i);
fosD.write(i);
fosA.close();
fosB.close();
fosC.close();
fosD.close();
}
File file5 = new File("F:\\e.txt");
FileOutputStream fosE = new FileOutputStream(file5);
byte[] bytes1 = {97,98,99,100,101,102,103,104,105,106,107};
fosE.write(bytes1);
fosE.close();
File file6 = new File("F:\\f.txt");
FileOutputStream fosF = new FileOutputStream(file6);
byte[] bytes2 = {97,98,99,100,101,102,103,104,105,106,107};
fosF.write(bytes2,0,2);
fosF.close();
File file7 = new File("F:\\g.txt");
FileOutputStream fosG = new FileOutputStream(file7);
byte[] bytes3 = "我爱Java".getBytes();
fosG.write(bytes3);
fosG.close();
}
}
(3)注意事项
- 创建文件,写入文件,关闭文件都有异常,可以直接处理三个异常中最顶层的父类异常——IOException
- 任意的记事本(例如记事本,notepad++......),在打开文件的时候都会查询编码表,把字节准换成字符表示,若二进制的数值是0-127,则会查询accii表,否则查询系统默认码表(例如GBK,UTF-8)
- 当一次性写入多个字节的时候,若第一个字节是正数(0-127),那么显示的时候会查询ascii码表;若第一个字节为负数,那么显示的时候,第一个字节会和第二(二三)个字节组合成一个中文字符显示。GBK中两个字节表示一个中文,UTF-8中,三个字节表示一个中文
- mac系统的换行是/r,linux系统的换行是/n,Windows系统的换行是\r\n
四、InputStream
该类是所有字节输入流的抽象父类
1.公共方法
int available() ===> 返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞
void close() ===> 关闭此输入流并释放与流相关联的任何系统资源
void mark(int readlimit) ===> 标记此输入流中的当前位置
boolean markSupported() ===> 测试这个输入流是否支持mark和reset方法
abstract int read() ===> 从输入流读取数据的下一个字节
int read(byte[]b) ===> 从输入流读取一些字节数,并将它们存储到缓冲区b
int read(byte[] b,int off,int len) ===> 从输入流读取最多1en字节的数据到一个字节数组
void reset() ===> 将此流重新定位到上次在此输入流上调用mark方法时的位置
long skip(long n) ===> 跳过并丢弃来自此输入流的n字节数据
2.直接子类
AudioInputStream
ByteArrayInputStream
FileInputStream
FilterInputStream
InputStream
ObjectInputStream
PipedInputStream
SequenceInputStream
StringBufferInputStream
3..FileInputStream使用
int available() ===> 返回该输入流中可以读取(或跳过)的字节数的估计值
关闭此输入流并释放与流相关联的任何系统资源。
voidmark(int readlimit)
标记此输入流中的当前位置。
booleanmarksupported()
测试这个输入流是否支持mark和reset方法。
abstract intread()从输入流读取数据的下一个字节。
intread(byte[]b)
从输入流读取一些字节数,并将它们存储到缓冲区b。
intread(byte[]b,int off,int len)
从输入流读取最多len字节的数据到一个字节数组。
voidreset()
将此流重新定位到上次在此输入流上调用mark方法时的位置。
1ongskip(long n)
跳过并丢弃来自此输入流的n字节数据。
import java.io.FileInputStream;
import java.io.IOException;
public class MyRead {
public static void main(String[] args) {
int data;
try {
FileInputStream file = new FileInputStream("F:\\info.txt");
while( (data = file.read())!= -1){
System.out.print(data + " ");
}
file.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileInputStream file = new FileInputStream("F:\\info.txt");
int len = file.available();
byte[] bytes = new byte[len];
file.read(bytes);
System.out.println("\n" + new String(bytes));
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:
1.read方法每读一次,指针向后移一位
2.String(byte[] bytes) ===> 通过使用平台的默认字符集解码指定的字节数组来构造新的String
3.当我们要利用流进行文件复制的时候,就不可能使用InputStream.available()方法获取整个文件的字节长度,因为这个长度很有可能超过Java虚拟机甚至外部系统的缓冲内存,这个时候就需要用到read(byte[] b, int off, int len) 或 read(byte[] b) 方法进行复制了。但是用这样的方法进行复制或读取中文时,可能会出现问题。因为一个汉字不是一个字节,而是两个或三个字节。
五、Reader
该类是字符输入流的最顶层抽象父类
1.公共方法
abstract void close() ===> 关闭流并释放系统资源
voidmark(int readAheadLimit) ===> 标记流中的当前位置
booleanmark supported() ===> 判断该流是否支持mark()操作
int read() ===> 读一个字符
int read(char[] cbuf) ===> 将字符读入数组
abstract int read(char[] cbuf,int off,int len) ===> 将字符读入数组的一部分
int read(CharBuffer target) ===> 尝试将字符读入指定的字符缓冲区
boolean ready() ===> 告诉这个流是否准备好被读取
void reset() ===> 重置流
long skip(long n) ===> 跳过字符
2.直接子类
BufferedReader
CharArrayReader
FilterReader
InputStreamReader
PipedReader
StringReader
3.
- java.lang.Object
- java.io.Reader
- java.io.InputStreamReader
java.io.FileReader
(1)构造方法
FileReader(File file)
FileReader(String fileName)
(3)具体使用
import java.io.FileReader;
import java.io.IOException;
public class MyFileReader {
public static void main(String[] args) throws IOException {
FileReader file = new FileReader("F:\\data.txt");
int info ;
while((info = file.read()) != -1){
System.out.print((char)info);
}
file.close();
FileReader fileTwo = new FileReader("F:\\data.txt");
char[] array = new char[100];
int len;
while((len = fileTwo.read(array)) != -1){
System.out.println("\n" + new String(array));
}
fileTwo.close();
}
}
六、Writer
这是字符输出流中最顶层的抽象父类
1.公共方法
Writer append(char c) ===> 将指定的字符附加到此writer
Writer append(CharSequence csq) ===> 将指定的字符序列附加到此writer
Writer append(CharSequence csq,int start,int end) ===> 将指定字符序列的子序列附加到此writer
abstract void close() ===> 关闭流,先刷新
abstract void flush() ===> 刷新流
void write(char[] cbuf) ===> 写入一个字符数组
abstract void write(char[] cbuf,int off,int len) ===> 写入字符数组的一部分
void write(int c) ===> 写一个字符
void write(string str) ===> 写一个字符串
void write(string str,int off,int len) ===> 写一个字符串的一部分
2.直接子类
BufferedWriter
CharArrayWriter
FilterWriter
OutputStreamWriter
PipedWriter
PrintWriter
StringWriter
3.
- java.lang.Object
- java.io.Writer
- java.io.OutputStreamWriter
java.io.FileWriter
import java.io.FileWriter;
import java.io.IOException;
public class MyFileWriter {
public static void main(String[] args) throws IOException {
FileWriter file = new FileWriter("F:\\data.txt");
file.write(100);
file.flush();
file.write("英雄联盟");
file.flush();
char[] chars ={67,68,69,70};
file.write(chars);
file.flush();
file.close();
}
}
注意:
1.使用字符输出流时,需要知道,该对象会先将字符写入缓冲中(该过程发生的是字符转换字节的过程),然后调用flush()方法才会写入文件中
2.close()方法执行时,也会先执行fluse()方法完成数据的写入
3.close()方法和fluse()方法都会执行数据的写入,但是fluse()以后,该对象还可以继续写入。close()方法执行之后,系统资源会被释放,该对象不可再次使用
4.构建FileWriter对象时,第二个布尔类型参数可以绝对是否是对该文件追加写入。true是追加,false不追加
5.windows换行符是\r\n,Linux换行符是/n,mac换行符是/r
Java第三十天,I/O操作的更多相关文章
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- Java进阶(三十六)深入理解Java的接口和抽象类
Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...
- Java进阶(三十五)java int与integer的区别
Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- Java进阶(三十二) HttpClient使用详解
Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...
- “全栈2019”Java第三十九章:构造函数、构造方法、构造器
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第三十八章:类与方法
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第三十六章:类
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第三十五章:面向对象
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- 测试必知必会系列- Linux常用命令 - mkdir
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! 新建一个文件夹 yyTest mkdir yyTest 新建三个文件夹 yyTest1 yyTest2 yyTe ...
- Silence主题 美观清爽的cnblog第三方主题
为什么推荐? 才开通cnblog,但苦于官方主题都不是很好看,翻找Github的时候发现了这个项目Silence 这是预览地址 官方展示图片 安装中的坑 不显示公共模块.博文目录.博文签名.博文赞赏. ...
- tomcat 对 vue的history默认支持 tomcat 开启步骤 1.build文件放入webapps目录 2.进入conf目录修改server.xml端口号改成8088 3.进入bin目录运行startup.bat 4.浏览器 localhost:8088/workName 访问即可
tomcat 对 vue的history默认支持 tomcat 开启步骤 1.build文件放入webapps目录 2.进入conf目录修改server.xml端口号改成8088 3.进入bin目录运 ...
- Python - 面向对象(一)入门篇
Python里面有一句话:万物皆是对象 如何面向对象编程 设计类 创建类实例对象 实例对象调用方法 创建对象 在内存中为对象分配空间 调用初始化方法 __init__ 为对象初始化 对象创建后,内 ...
- 普通人学习rust——从零到放弃 简单输入输出
普通人学习rust--从零到放弃 简单输入输出 环境 本文章内容基于如下环境,如若出入请参考当前环境. rustc 1.42.0 (b8cedc004 2020-03-09) cargo 1.42.0 ...
- angular vue通过node启动项目局域网内关闭防火墙无法访问的解决办法
先试 ng serve --host 0.0.0.0 不行再试 ng serve --host 0.0.0.0 --disable-host-check
- SOFARPC模式下的Consul注册中心
Consul大家不陌生,就是和Zookeeper.Nacos一伙的,能够作为微服务基础架构的注册中心,算是比较成熟的组件,和Springcloud集成顺滑, 考虑到Eureka已经停止更新,所以有必要 ...
- javaweb_HTML
第一章:网页的构成 1.1概念:b/s与c/s 1.1.1 现在的软件开发的整体架构主要分为B/S架构与C/S架构: b/s:浏览器/服务器 c/s:客户端/服务器 客户端:需要安装在系统里,才可使用 ...
- CERN Root与CLING
CERN Root on Arch Linux For WSL: 一个CLI才是本体的程序居然有图形启动界面,莫名的微妙感 接触到Root是在一个4chan上喷matlab的thread里.某anon ...
- Electron 踩坑记录- require is not defined
从 github 上拉取 electron-sample-apps 后,运行 electron printing, 出现如下报错信息 解决方案 在 main.js 中增加 nodeIntegratio ...