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 :指定编码格式