IO流
IO流
java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。在java中抽象表述为流( stream)
IO流的分类
1.按照流的流向分,可以分为输入流和输岀流
输入流:只能从中读取数据,而不能向其写入数据
输出流:只能向其写入数据,而不能向其读取数据
2.按照操作单元划分,可以划分为字节流和字符流
字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,一个字符等于两个字节
字节流主要是由InputStream和OutputStream作为基类,而字符流则主要有 Reader和Writer作为基类
3.按照流的角色划分为节点流和处理流
可以从/向—个特定的io设备(如磁盘,网络)读/写数据的流,称为节点流 节点流也被称为低级流
处理流则是用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能 处理流也被称为髙级流
了解数据源
IO流分类表
Java中四大io抽象类
InputStream
常用方法
read() 返回值 int类型 (0-255之间的一个值) 如果未读出字节则返回-1,表示读取结束 读取一个字节的数据
close() 无返回值 关闭输入流对象,释放相关资源
OutputStream
常用方法
write(int n) 无返回值 向目的地写入一个字节
close() 无返回值 关闭输出流对象,释放相关资源
Reader
常用方法
read() 返回值 int类型 (0-65535之间的一个Unicode值) 如果未读出字节则返回-1,表示读取结束 读取一个字符的数据
close() 无返回值 关闭输入流对象,释放相关资源
Writer
常用方法
write(int n) 无返回值 写入一个字符的数据
close() 无返回值 关闭输出流对象,释放相关资源
小总结
动手写第一个io程序
package com.vis_yang.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @author Vis.Yang
* @project_name study io
* @date 2021/5/10 11:06
*/
public class Demo {
public static void main(String[] args) throws IOException {
//为什么定义在外面(全局变量),方便最后关闭流对象,防止资源的浪费
FileInputStream fis = null;
try {
/*
* 创建字节输入流对象
* FileInputStream fis=new FileInputStream("C:/Users/ASUS/Desktop/a.txt");
*/
fis = new FileInputStream("C:/Users/ASUS/Desktop/a.txt");
//read()方法 读取文件里的第一个字符,会把这个字符基于字节的形式读取出来,将字节转换成一个十进制的整数返回,即返回这个整数相应的ASCII码
int read = fis.read();
System.out.println(read);
//得到类容 (char) read ASCII码转成文字
System.out.println((char) read);
//read()方法 并不是一次性读出所有的字符,想要一次性全部读出需要使用循环
// int i;
// while(( i=fis.read())!=-1){
// System.out.print((char) i);
// }
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("找不到此文件");
} finally {
if (fis != null) {
fis.close();
}
}
}
}
ASCII相关
不同的字符所占的字节是不同的
ASCII码:
一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:
一个英文字符等于一个字节,一个中文(含繁体)等于三个字节
Unicode编码:
一个英文等于两个字节,一个中文(含繁体)等于两个字节
File类简介
针对文件操作的方法
敲代码
createNewFile() 返回布尔值 成功:true 失败:false
exists() 返回值 boolean 判断文件是否存在
delete () 返回值 boolean 删除文件
一起上
字节数获取
针对目录操作的方法
mkdir() 返回值 boolean 创建目录成功返回true 失败则是false 创建一个单级目录 | mkdirs() 同理 创建一个多级目录
😇
一起上
常用流对象
文件字节流
文件字节输入流
FileInputStream
写代码
文件字节输出流
FileOutPutStream
通过缓冲区提高读写效率 不再是一个字节一个一字节读写,而是一个缓冲区一个缓冲区的读写了
通过创建一个指定长度的字节数组(byte[ ])作为缓冲区,以此来提高io流的读写效率。该方式适用于读取较大图片时的缓冲区定义。注意:缓冲区的长度一定是2的整数幂,一般情况下1024长度较为合适。
写代码
缓冲区长度固定 1024字节 如操作的文件过大则建议采用此方法,节省内存 比拟:一袋一袋拿 利用缓冲区方法,读写流都必须传入缓冲参数,此外缓冲区长度固定的写出流还要而外指定长度
读取速度加快
预估缓冲区长度 操作大文件不建议 ,内存占用很大 比拟:一次性拿走 利用缓冲区方法,读写流都需要要传入定义好的缓冲区参数
通过字节缓冲流提高读写效率
字节输入缓冲流
BufferedInputStream
字节输出缓冲流
BufferedOutStream
写一个文件拷贝工具类
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 定义文件拷贝类
* @date 2021/5/10 22:09
*/
public class FileCopyTools {
public static void main(String[] args) throws IOException {
//桌面的power.png 复制到 E盘
copyFile("C:\\Users\\ASUS\\Desktop\\power.png","E:\\power.png");
}
//可以操作多种文件
public static void copyFile(String src, String des) throws IOException {
//1.定义字节流和缓冲流
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
//实例化字节流和缓冲流
try {
fis = new FileInputStream(src);
fos = new FileOutputStream(des);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
int i=0;
while ((i=bis.read())!=-1){
bos.write(i);
}
bos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
//关闭资源
if (bos!=null){
bos.close();
}
if (bis!=null){
bis.close();
}
if (fis!=null){
fis.close();
} if (fos!=null){
fos.close();
}
}
}
}
文件字符流
文件字符输入流
FileReader
文件字符输出流
FileWriter
换行?就这样😁
多个字符输出流同时操作同一个文件
实现追加
使用字符流实现文本文件拷贝
敲代码
全局代码
package com.vis_yang.io;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author Vis.Yang
* @project_name TxtFileCopyTools
* @date 2021/5/11 13:59
*/
public class TxtFileCopyTools {
public static void main(String[] args) {
copyTxtFile();
}
/**
* @MethodName:copyTxtFile
* @Description:只能操作文本文件
* @Author: Vis.Yang
* @Date: 2021/5/11 14:08
* @return: void
*/
public static void copyTxtFile() {
FileReader fr = null;
FileWriter fw = null;
try {
//从a.txt里读取
fr = new FileReader("C:\\Users\\ASUS\\Desktop\\a.txt");
//写入c.txt
fw = new FileWriter("C:\\Users\\ASUS\\Desktop\\c.txt");
//读取方式
int i = 0;
while ((i = fr.read()) != -1) {
fw.write(i);
}
fw.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fr != null) {
fr.close();
}
if (fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
通过缓冲区提高读写效率 不再是一个字符一个一字符读写,而是一个缓冲区一个缓冲区的读写了
通过创建一个指定长度的字符数组(char[ ])作为缓冲区,以此来提高io流的读写效率。该方式适用于读取较大图片时的缓冲区定义。注意:缓冲区的长度一定是2的整数幂,一般情况下1024长度较为合适。
长度固定 利用缓冲区方法,读写流都必须传入缓冲区参数 并且写出流有长度
全局代码
package com.vis_yang.io;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author Vis.Yang
* @project_name TxtFileCopyTools
* @date 2021/5/11 13:59
*/
public class TxtFileCopyTools {
public static void main(String[] args) {
copyTxtFile();
}
/**
* @MethodName:copyTxtFile
* @Description:只能操作文本文件
* @Author: Vis.Yang
* @Date: 2021/5/11 14:08
* @return: void
*/
public static void copyTxtFile() {
FileReader fr = null;
FileWriter fw = null;
try {
//从a.txt里读取
fr = new FileReader("C:\\Users\\ASUS\\Desktop\\a.txt");
//写入c.txt
fw = new FileWriter("C:\\Users\\ASUS\\Desktop\\c.txt");
//读取方式 改进:加入字符数组作为缓冲区,加快读写速度
//定义一个char[]字符数组作为缓冲区 类似一个装米的包(字符数据)的包
char [] buffer=new char[1024];
//利用缓冲区方法,读写流都必须传入缓冲区参数 并且写出流有长度
int i = 0;
while ((i = fr.read(buffer)) != -1) {
/*
*缓冲区用法 write(buffer,0,i) 长度:起始位置从0开始到i=fr.read(buffer) 比拟:若包未装满返回-1,数据读取结束 写入也随即停止
*相当于一次拿一整个的buffer缓冲区里存的数据写入磁盘 类似一堆大米(字符数据),原来一粒粒(字符)拿,现在一包一包拿
*/
fw.write(buffer,0,i);
}
fw.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fr != null) {
fr.close();
}
if (fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符流没有预估长度的缓冲区的方法
字符缓冲流
字符输入缓冲流
BufferedReader
字符输出缓冲流
BufferedWriter
全局代码
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 学习字符输入输出缓冲流,提高文本文件读取效率
* @date 2021/5/11 15:35
*/
public class BufferedReaderTest {
public static void main(String[] args) {
//定义变量
FileReader fr = null;
FileWriter fw = null;
BufferedReader br = null;
BufferedWriter bw = null;
//实例化
try {
fr = new FileReader("C:\\Users\\ASUS\\Desktop\\a.txt");
fw = new FileWriter("C:\\Users\\ASUS\\Desktop\\c.txt");
br = new BufferedReader(fr);
bw = new BufferedWriter(fw);
/*加入缓冲流后,直接操作缓冲流即可
*学习一下readline()这个按行读取的方法
* 每次读取一行,效率更高
*/
String str = "";
while ((str = br.readLine()) != null) {
bw.write(str+"\r\n");
}
/*
每次读取一个字符,相对readline()要慢
bw = new BufferedWriter(fw);
加入缓冲流后,直接操作缓冲流即可
int i = 0;
while ((i = br.read()) != -1) {
bw.write(i);
}
*/
//刷新
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
if (fr != null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
换行改进
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 学习字符输入输出缓冲流,提高文本文件读取效率
* @date 2021/5/11 15:35
*/
public class BufferedReaderTest {
public static void main(String[] args) {
//定义变量
FileReader fr = null;
FileWriter fw = null;
BufferedReader br = null;
BufferedWriter bw = null;
//实例化
try {
fr = new FileReader("C:\\Users\\ASUS\\Desktop\\a.txt");
fw = new FileWriter("C:\\Users\\ASUS\\Desktop\\c.txt");
br = new BufferedReader(fr);
bw = new BufferedWriter(fw);
/*加入缓冲流后,直接操作缓冲流即可
*学习一下readline()这个按行读取的方法
* 每次读取一行,效率更高
*/
String str = "";
while ((str = br.readLine()) != null) {
//bw.write(str+"\r\n"); 其实这样也挺快
bw.write(str);
//new line()方法换行:代替\r\n
bw.newLine();
}
/*
每次读取一个字符,相对readline()要慢
bw = new BufferedWriter(fw);
加入缓冲流后,直接操作缓冲流即可
int i = 0;
while ((i = br.read()) != -1) {
bw.write(i);
}
*/
//刷新
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
if (fr != null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
通过字符缓冲流为文件中的内容添加行号
JAVA 中int类型转String类型的通常方法,有三种:
1、Integer.toString(int i)
2、String.valueOf(int i)
3、i + " " i 为 int类型 先将int型的i转为string接上后面的字符串
三种方法效率排序为:
Integer.toString(int i) > String.valueOf(int i) > i+" "
全局代码
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 通过字符缓冲流实现为文件中的内容添加行号
* @date 2021/5/11 15:35
*/
public class BufferedReaderTest {
public static void main(String[] args) {
//定义变量
FileReader fr = null;
FileWriter fw = null;
BufferedReader br = null;
BufferedWriter bw = null;
//实例化
try {
fr = new FileReader("C:\\Users\\ASUS\\Desktop\\a.txt");
fw = new FileWriter("C:\\Users\\ASUS\\Desktop\\c.txt");
br = new BufferedReader(fr);
bw = new BufferedWriter(fw);
/*加入缓冲流后,直接操作缓冲流即可
*学习一下readline()这个按行读取的方法
* 每次读取一行,效率更高
*/
int i=1;
String str = "";
while ((str = br.readLine()) != null) {
//bw.write(str+"\r\n"); 其实这样也挺快
//添加功能:每行加行号
bw.write(i+"."+str);
//new line()方法换行:代替\r\n
bw.newLine();
i++;
}
/*
每次读取一个字符,相对readline()要慢
bw = new BufferedWriter(fw);
加入缓冲流后,直接操作缓冲流即可
int i = 0;
while ((i = br.read()) != -1) {
bw.write(i);
}
*/
//刷新
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
if (fr != null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
缓冲流
功能:将字节流转换成字符流
通过转换流实现键盘输入屏幕输出
InputStream is=System.in "标准"字节输入流对象 OutputStream os=System.out "标准"字节输出流对象 采用转换流
全局代码
package com.vis_yang.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @author Vis.Yang
* @project_name 学习转换流
* @date 2021/5/11 17:19
*/
public class ConvertString {
public static void main(String[] args) throws IOException {
InputStream is = null;
BufferedReader br = null;
InputStreamReader isr = null;
try {
//"标准"字节输入流对象 System.in
is = System.in;
// 使用 InputStreamReader(is)转换流把字节流 is= System.in 转换成字符流
isr = new InputStreamReader(is);
//字符流才可以添加到字符缓冲流
br = new BufferedReader(isr);
//这样一波三折后就可以使用BufferedReader字节缓冲流的readLine()方法了
String input = br.readLine();
System.out.println(input);
} finally {
try {
br.close();
isr.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
全局代码
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 学习转换流
* @date 2021/5/11 17:19
*/
public class ConvertString {
public static void main(String[] args) throws IOException {
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
BufferedWriter bw = null;
InputStreamReader isr = null;
OutputStreamWriter osw = null;
try {
//"标准"字节输入流对象 System.in
is = System.in;
// 使用 InputStreamReader(is)转换流把字节流 is= System.in 转换成字符流
isr = new InputStreamReader(is);
//字符流才可以添加到字符缓冲流
br = new BufferedReader(isr);
//"标准"字节输出流对象 System.out
os = System.out;
// 使用 OutputStreamWriter(os) 转换流把字节流 os=System.out 转换成字符流
osw = new OutputStreamWriter(os);
//字符流才可以添加到字符缓冲流
bw = new BufferedWriter(osw);
//这样一波三折后就可以使用BufferedReader字节缓冲流的readLine()方法了
String input = br.readLine();
// System.out.println(input);
bw.write(input);
bw.flush();
} finally {
try {
bw.close();
osw.close();
os.close();
br.close();
isr.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
键盘输入屏幕输出
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 学习转换流
* @date 2021/5/11 17:19
*/
public class ConvertString {
public static void main(String[] args) throws IOException {
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
BufferedWriter bw = null;
InputStreamReader isr = null;
OutputStreamWriter osw = null;
try {
//"标准"字节输入流对象 System.in
is = System.in;
// 使用 InputStreamReader(is)转换流把字节流 is= System.in 转换成字符流
isr = new InputStreamReader(is);
//字符流才可以添加到字符缓冲流
br = new BufferedReader(isr);
//"标准"字节输出流对象 System.out
os = System.out;
// 使用 OutputStreamWriter(os) 转换流把字节流 os=System.out 转换成字符流
osw = new OutputStreamWriter(os);
//字符流才可以添加到字符缓冲流
bw = new BufferedWriter(osw);
//这样一波三折后就可以使用BufferedReader字节缓冲流的readLine()方法按行读取了
//这样一波三折后就可以使用BufferedWriter字节缓冲流的newLine()方法换行了
while (true){
String input = br.readLine();
if (input.equals("exit")){
break;
}
bw.write("你输入的是:"+input); //另起一行输出
bw.newLine();
bw.flush();
}
} finally {
try {
bw.close();
osw.close();
os.close();
br.close();
isr.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
全局代码
package com.vis_yang.demos;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 通过转换流实现键盘输入屏幕输出
* @date 2021/5/11 19:01
*/
public class NewTab {
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br=new BufferedReader(new InputStreamReader(System.in));
bw=new BufferedWriter(new OutputStreamWriter(System.out));
while (true){
String input = br.readLine();
if (input.equals("exit")){
break;
}
bw.write("你输入的是:"+input);
//另起一行输出
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
通过字节流读取文本文件并添加行号 肯定要转换流对象
全局代码
读到键盘中
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 通过字节流读取文本文件并添加行号
* @date 2021/5/11 19:18
*/
public class NewConvertString {
public static void main(String[] args) throws IOException {
//肯定要转换流对象
BufferedReader br=null;
BufferedWriter bw=null;
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\ASUS\\Desktop\\a.txt")));
bw=new BufferedWriter(new OutputStreamWriter(System.out));
String str="";
int i=1;
while (true){
str = br.readLine();
if (str==null){
break;
}
bw.write(i+"."+str);
bw.newLine();
i++;
bw.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
读到文本文件里
全局代码
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 通过字节流读取文本文件并添加行号
* @date 2021/5/11 19:18
*/
public class NewConvertString {
public static void main(String[] args) throws IOException {
//肯定要转换流对象
BufferedReader br=null;
BufferedWriter bw=null;
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\ASUS\\Desktop\\a.txt")));
bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\ASUS\\Desktop\\b.txt")));
String str="";
int i=1;
//readLine()每次只读一行,循环才会流动,就像游标卡尺上的游标
while ((str = br.readLine())!=null){
bw.write(i+"."+str);
//代替换行符
bw.newLine();
i++;
}
bw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符输出流
有它自己的输出方法,同时不需要刷新 ,println()方法自带换行功能
字节数组流
字节数组输入流
ByteArrayInputStream
全局代码
package com.vis_yang.io;
import java.io.ByteArrayInputStream;
import java.io.IOException;
/**
* @author Vis.Yang
* @project_name 学习字节数组输入流 ByteArrayInputStream
* @date 2021/5/11 20:51
*/
public class ByteArrayInputStreamTest {
public static void main(String[] args) {
//创建字节数组 "HelloWorld".getBytes() 字符串.getBytes()可以形成一个字节数组
byte [] byteArray="HelloWorld".getBytes();
ByteArrayInputStream bais=null;
StringBuilder sb=new StringBuilder();
try {
//该构造方法的参数是一个字节数组,这个字节数组就是数据源,需要读取哪个字节数组就把哪个数组传给他即可
bais= new ByteArrayInputStream(byteArray);
int i=0;
while((i=bais.read())!=-1){
//append(Char c):字符串连接
sb.append((char) i);
}
System.out.println(sb);
}finally {
try {
bais.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节数组输出流
ByteArrayOutputStream
全局代码
package com.vis_yang.io;
import java.io.ByteArrayOutputStream;
/**
* @author Vis.Yang
* @project_name 学习字节数组输出流 ByteArrayOutputStream
* @date 2021/5/12 9:28
*/
public class ByteArrayOutputStreamTest {
public static void main(String[] args) {
ByteArrayOutputStream baos=null;
try{
baos=new ByteArrayOutputStream();
baos.write('a');
baos.write('c');
baos.write('b');
byte [] byteArray= baos.toByteArray();
for (int i = 0; i < byteArray.length; i++) {
System.out.print((char) byteArray[i]);
}
}finally {
try {
if (baos!=null){
baos.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
数据流
数据输出字节流
DataOutputStream
全局代码
package com.vis_yang.io;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
/**
* @author Vis.Yang
* @project_name 学习数据输出流 DataOutputStream
* @date 2021/5/12 12:32
*/
public class DataOutputStreamTest {
public static void main(String[] args) {
DataOutputStream dos = null;
try {
//DataOutputStream是一个处理流,这里套了个字节缓冲流,里面套了个文件字节流,用于操作文件
dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("C:\\Users\\ASUS\\Desktop\\data.txt")));
//写入单个字节数据
dos.writeByte('哈');
//写入多个字节数
dos.writeBytes("哈喽呀");
//写入单个字符数据
dos.writeChar(1);
dos.writeChar('1');
dos.writeChar('嘿');
//写入多个字符数据
dos.writeChars("你好呀");
//写入int类型的数据
dos.writeInt(1);
//写入double类型的数据
dos.writeDouble(2.0);
//写入float类型的数据
dos.writeFloat(1.9f);
//写入boolean类型的数据
dos.writeBoolean(true);
//writeUTF("hello 世界") 写入字符串类型的数据
dos.writeUTF("hello 世界");
//刷新
dos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dos != null) {
dos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
数据输入流
DataInputStream
全局代码
package com.vis_yang.io;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
/**
* @author Vis.Yang
* @project_name 学习数据输出流 DataOutputStream
* @date 2021/5/12 12:32
*/
public class DataOutputStreamTest {
public static void main(String[] args) {
DataOutputStream dos = null;
try {
//DataOutputStream是一个处理流,这里套了个字节缓冲流,里面套了个文件字节流,用于操作文件
dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("C:\\Users\\ASUS\\Desktop\\data.txt")));
//写入单个字节数据
dos.writeByte('哈');
//写入单个字符数据
dos.writeChar('1');
dos.writeChar('嘿');
//写入int类型的数据
dos.writeInt(1);
//写入double类型的数据
dos.writeDouble(2.0);
//写入float类型的数据
dos.writeFloat(1.9f);
//写入boolean类型的数据
dos.writeBoolean(true);
//writeUTF("hello 世界") 写入字符串类型的数据
dos.writeUTF("hello 世界");
//刷新
dos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dos != null) {
dos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} package com.vis_yang.io;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author Vis.Yang
* @project_name 学习数据输入流 DataInputStream
* @date 2021/5/12 12:31
*/
public class DataInputStreamTest {
public static void main(String[] args) {
DataInputStream dis=null;
try {
dis=new DataInputStream(new BufferedInputStream(new FileInputStream("C:\\Users\\ASUS\\Desktop\\data.txt")));
//注意:读取与写顺序和次数必须一致
System.out.println(dis.readByte());
System.out.println(dis.readChar());
System.out.println(dis.readChar());
System.out.println(dis.readInt());
System.out.println(dis.readDouble());
System.out.println(dis.readFloat());
System.out.println(dis.readBoolean());
System.out.println(dis.readUTF());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (dis!=null){
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
对象流
额外功能:可以对Java对象进行读写操作
对象输出流
操作数据
ObjectOutputStream
package com.vis_yang.io;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* @author Vis.Yang
* @project_name 学习对象流
* @date 2021/5/12 14:23
*/
public class ObjectOutputStreamBasicTypeTest {
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
//ObjectOutputStream处理流
oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("C:\\Users\\ASUS\\Desktop\\ObjectData.txt")));
oos.writeInt(10);
oos.writeDouble(Math.random());
oos.writeChar('a');
oos.writeBoolean(true);
oos.writeUTF("hello world");
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (oos != null) {
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
对象输入流
操作数据
ObjectInputStream
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name
* @date 2021/5/12 14:37
*/
public class ObjectInputStreamBasicTypeTest {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
//ObjectInputStream也是处理流
ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("C:\\Users\\ASUS\\Desktop\\ObjectData.txt")));
//同理写和读顺序必须一致
System.out.println(ois.readInt());
System.out.println(ois.readDouble());
System.out.println(ois.readChar());
System.out.println(ois.readBoolean());
System.out.println(ois.readUTF());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
输出效果图
操作对象
将对象序列化到文件
需要注意的地方
将文件里的对象序列化文件反序列化到内存
具体代码
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 学习反序列化
* @date 2021/5/12 15:40
*/
public class ObjectInputStreamObjectTypeAntiSerializeTest {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
//实例化一个对象输入流
ois = new ObjectInputStream(new FileInputStream("C:\\Users\\ASUS\\Desktop\\serialize"));
//ois.readObject()得到的对象类型不是User 所以这里要强制类型转换
User user = (User) ois.readObject();
System.out.println("该用户的id:"+user.getUserId()+"该用户的name:"+user.getUserName()+"该用户的Age:"+user.getUserAge());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
随机访问流
RandomAccessFile
独立于Java.io包外
掌握三个核心方法:
全局代码
package com.vis_yang.io;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* @author Vis.Yang
* @project_name 学习随机访问流 RandomAccessFile
* @date 2021/5/12 16:13
*/
public class RandomAccessFileTest {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = null;
//mode:"rw" 可读可写 "r"只可读 "w"只可写
raf = new RandomAccessFile("C:\\Users\\ASUS\\Desktop\\student.txt", "rw");
//将若干数据写入到文件 10,20,30,90每个都占4个字节
int[] intArray = new int[]{10, 20, 30, 90};
for (int i = 0; i < intArray.length; i++) {
raf.writeInt(intArray[i]);
}
//传入的是字节数 10,20,30,90每个都占4个字节 10-->0~3 20-->4~7 30-->8~11 90-->12~15
raf.seek(4);
//传入的是字节数是4,打印的是20
System.out.println(raf.readInt());
//getFilePointer() 查看指针位置
long filePointer = raf.getFilePointer();
System.out.println(filePointer);
//循环输出到控制台
for (int i = 0; i < 4; i++) {
raf.seek(i * 4);
System.out.print(raf.readInt() + "\t");
}
//利用raf.seek()替换数据 将30换成40
raf.seek(8);
raf.writeInt(40);
//更改后
System.out.println();
for (int i = 0; i < 4; i++) {
raf.seek(i * 4);
System.out.print(raf.readInt() + "\t");
}
}
}
结果:
"C:\Program Files\Java\jdk-11.0.6\bin\java.exe"
20
8
10 20 30 90
10 20 40 90
Process finished with exit code 0
File类在IO中的作用
全局代码
package com.vis_yang.io;
import java.io.*;
/**
* @author Vis.Yang
* @project_name 学习File类在IO中的作用
* @date 2021/5/12 17:18
*/
public class FileInIoTest {
public static void main(String[] args) {
//字符输入缓冲流 BufferedReader 字符输出缓冲流 BufferedWriter
BufferedReader br = null;
BufferedWriter bw = null;
//File类用于存放地址信息
try {
//字符输入流 FileReader 字符输出流 FileWriter
//从IoTest.txt里读写到Io.txt
br = new BufferedReader(new FileReader(new File("C:\\Users\\ASUS\\Desktop\\IoTest.txt")));
bw = new BufferedWriter(new FileWriter(new File("C:\\Users\\ASUS\\Desktop\\Io.txt")));
String s = "";
int i=1;
while ((s = br.readLine()) != null) {
bw.write(i+"."+s);
bw.newLine();
i++;
}
bw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Apache IO包
下载地址:
导入jar
开始使用吧
先学习一些常用方法
FileUtils的
FileUtils.readFileToString(file, "utf-8") 将文件内容作为字符串返回
FileUtils.copyDirectory() FileFilter:过滤器接口 IoUtils的
IOUtils.toString(new FileInputStream("C:\\Users\\ASUS\\Desktop\\a.txt"), "utf-8") 将输入流或数组中的内容转化为字符串 utf-8 :指定编码格式
SHEIN希音公司福利 257人发布