IO流
创建文件
package com.hniu.file;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
public class FileCreate {
@Test
//方式1 new File(String pathname)
public void create01(){
File file=new File("G:\news1.txt");
try {
file.createNewFile();
System.out.println("文件创建成功");
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
//方式2 new File(File parent,String child) //根据父目录文件+子路径构建
public void create02(){
File parentfile=new File("G:\\");
String fileName="news2.txt";
File file = new File(parentfile, fileName);
try {
file.createNewFile();//创建文件
System.out.println("创建成功");
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
//方式3 new File(String parent,String child)//根据父目录加子路径构建
public void create03(){
File file=new File("G:/","news3.txt");
try {
file.createNewFile();
System.out.println("创建成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
获取文件信息
package com.hniu.file;
import org.junit.jupiter.api.Test;
import java.io.File;
public class FileInformation {
@Test
//获取文件信息
public void info(){
//先创建文件对象
File file =new File("G:\\news1.txt");
//调用相应的方法,得到对应的值
System.out.println("文件名字="+file.getName());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("父级目录:"+file.getParent());
System.out.println("文件大小(字节):"+file.length());
System.out.println("文件是否存在:"+file.exists());//T
System.out.println("是不是一个文件:"+file.isFile());//T
System.out.println("是不是一个目录:"+file.isDirectory());//F
}
}
常用的文件操作
package com.hniu.file;
import org.junit.jupiter.api.Test;
import java.io.File;
public class Directory {
//判断 G://news1.txt是否存在如果存在就删除
@Test
public void m1(){
String filePath="G:/news1.txt";
File file=new File(filePath);
if (file.exists()){
if (file.delete()){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}else {
System.out.println("该文件不存在");
}
}
//判断 G://news1 目录是否存在如果存在就删除
@Test
public void m2(){
String filePath="G:\\demo\\a\\b\\c";
File file=new File(filePath);
if (file.exists()){
if (file.delete()){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}else {
System.out.println("该目录不存在");
}
}
//判断: G:\\demo\\a\\b\\c 目录是否存在,如果存在提示存在,否则创建
@Test
public void m3(){
String filePath="G:\\demo1\\a\\b\\c";
File file=new File(filePath);
if (file.exists()){
System.out.println("存在");
}else {
if (file.mkdirs()){//创建多级目录用mkdirs 创建一级目录用mkdir
System.out.println(filePath+"创建成功");
}else {
System.out.println(filePath+"创建失败");
}
}
}
}
流的概念
内存与存储设备之间传输数据的通道
流的分类
按方向【重点】
- 输入流:将<存储设备>中的内容读到<内存>中
- 输出流:将<内存>中的内容写到<存储设备>中
按单位
- 字节流:以字节为单位,可以读写所有数据
- 字符流:以字符为单位,只能读写文本数据
按功能
- 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流的基础之上增强功能
字节流
InputStream
-
InputStream抽象类是使用类字节输入流的超类
-
inputStream 常用子类
-
FileInputStream:文件读取
package com.hniu.InputStream_; import org.junit.jupiter.api.Test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class FileInputStream_ { @Test public void readFile01(){ int read=0; String filePath="G:\\demo1\\hello.txt"; FileInputStream fileInputStream=null; try { //创建FinleInputStream 对象用于读取文件 fileInputStream = new FileInputStream(filePath); //从该输入流读取一个字节的数据。如果没有输入可用,此方法将阻止 //如果放回-1表示读取完毕 while((read=fileInputStream.read())!=-1){ System.out.print((char)read); } } catch (IOException e) { e.printStackTrace(); }finally { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } // 使用read(byte[] b) 读取文件,提高效率 @Test public void readFile02(){ int readLen=0; //字节数组 byte[] buf=new byte[8];//一次读8个字节 String filePath="G:\\demo1\\hello.txt"; FileInputStream fileInputStream=null; try { //创建FinleInputStream 对象用于读取文件 fileInputStream = new FileInputStream(filePath); //如果返回-1表示读取完毕 //如果读取正常,返回实际读取的字节数 while((readLen=fileInputStream.read(buf))!=-1){ //这里读取字节数长度不要用buf.length,会读取错误 System.out.print(new String(buf,0, readLen)); } } catch (IOException e) { e.printStackTrace(); }finally { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-
outpitstream :文件写入
package com.hniu.outputstream_; import org.junit.jupiter.api.Test; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStream01 { //FileOutputStream 将数据写到文件中,不存在则创建 @Test public void weite(){ FileOutputStream fileOutputStream=null; try { //得到一个对象 fileOutputStream=new FileOutputStream("G:\\demo1\\a.txt"); //写入一个字节 fileOutputStream.write('H'); } catch (IOException e) { e.printStackTrace(); }finally { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-
-
BufferedInputStream:缓冲字节输入流
-
ObjectInputStream: 对象字节输入流
-
字节流和字符流的区别
- 主要区别在于两者之间处理信息的基本单位不同,
- 字节流也称二进制流,它将数据以一个字节(Byte)为单位进行分组
- 字符流是针对字符数据的特点进行过优化的,每次可以读写一个字符。
字节流
InputStream 类 和OutputStream类是处理字节流的输入/输出 顶级抽象类
InputStream类常用方法
方法名 | 说明 |
---|---|
OutputStream类常用方法
方法名 | 说明 |
---|---|
FileInputStream 类的使用
1.通过fileInputStream类读取文本文件中的数据,并将read()方法的返回值显示到控制台窗格
准备一个要读取的文本文件
ABC abc
测试
package FileInPutStreamTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @author zwf
* @Package: FileInPutStreamTest
* @ClassName: demo01
* @Description:
* @date 2022/5/10 19:57
*/
public class demo01 {
public static void main(String[] args) throws Exception {
String FilePath = "F:\\java进阶\\IO\\src\\FileInPutStreamTest\\text"; //文件路径
FileInputStream fileInputStream = new FileInputStream(FilePath);
while (fileInputStream.available() != 0) { //available()方法用于返回还有多小可读字节
//read()方法从数据源中读取一个字节的二进制,并在高位补8个0再转换成一个十进制整数后放回给调用语句
System.out.print("\t"+fileInputStream.read());
}
fileInputStream.close();
}
}
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-go3JDtvf-1652608169571)(F:\2021年12月4号开始笔记\java-SE\img\Snipaste_2022-05-10_20-17-22.png)]
FileOutPutStream类的使用
1.使用FileInoutStream和FileOutStream类实现JPG格式图片文件的复制。
图片文件实际就是一种二进制格式的文件,可以通过FileInputStream类提供的read()依次读取,并通过FileOutputStream类提供的write()方法依次写入目标文件
package FileInPutStreamTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* @author zwf
* @Package: FileInPutStreamTest
* @ClassName: demo02
* @Description:
* @date 2022/5/10 20:32
* 图片文件实际就是一种二进制格式的文件,可以通过FileInputStream类提供的read()依次读取,并通过FileOutputStream类提供的write()方法依次写入目标文件
*/
public class demo02 {
public static void main(String[] args) throws Exception {
//原图片路径
String ImgPath="F:\\java进阶\\IO\\src\\FileInPutStreamTest\\1.jpg" ;
//复制后的图片的路径
String newImgPath="F:\\java进阶\\IO\\src\\FileInPutStreamTest\\new.jpg";
FileInputStream fileInputStream = new FileInputStream(ImgPath); //读取图片的字节
FileOutputStream fileOutputStream = new FileOutputStream(newImgPath); //输出图片的字节
byte[] b=new byte[1024];//创建byte类型的数组,设置每次读取或输出的字节为1024 ,1M
int len=0;
//判断 读取图片如果结果为-1 表示读取完了
while ((len=fileInputStream.read(b))!=-1){
fileOutputStream.write(b,0,len);//将byte类型的数组的下标为0个元素开始的len个元素依次写入输出流
}
fileInputStream.close();
fileOutputStream.close();
}
}
过滤输入输出流
- FilterInputStream和FilterOutStream抽象类分别实现了在二进制数据进行读写操作的同时,对所传输的数据,按指定的类型或格式进行转换
- FilterInputStream和FilterOutStream拥有DataInputStream和DataOutputStream等子类
DataInputStream类
方法名 | 说明 |
---|---|
DataOutputStream类
方法名 | 说明 |
---|---|
DataInputStream和DataOutputStream使用
- 使用DataOutputStream类设计一个filterOut(int x ,double y,String z)方法,该方法能将一组不同类型的数据(int,double,String)写入二进制文件test.dat中,方法放回值为“数据写入成功”
- 使用DataInputStream类设计一个无参数,无返回值的filterIn()方法,该方法能将上述二进制文件中test.dat中的数据读取显示到控制台中
- 编写测试代码检验上述两个方法设计的正确性
package FileInPutStreamTest;
import java.io.*;
/**
* @author zwf
* @Package: FileInPutStreamTest
* @ClassName: demo03
* @Description:
* @date 2022/5/11 21:10
* 1. 使用DataOutputStream类设计一个filterOut(int x ,double y,String z)方法,该方法能将一组不同类型的数据(int,double,String)写入二进制文件test.dat中,方法放回值为“数据写入成功”
* 2. 使用DataInputStream类设计一个无参数,无返回值的filterIn()方法,该方法能将上述二进制文件中test.dat中的数据读取显示到控制台中
* 3. 编写测试代码检验上述两个方法设计的正确性
*/
public class demo03 {
public static void main(String[] args) {
//调用filterOut方法,将3个不同类型数据写入文件中
try {
System.out.println(filterOut("我的",10.1));
filterIn();
} catch (Exception e) {
e.printStackTrace();
}
}
static String filterOut(String z,double y) throws Exception {
//指定要操作的目标文件
FileOutputStream fout = new FileOutputStream("F:\\java进阶\\IO\\src\\FileInPutStreamTest\\text.dat");
//以fout对象为基础基础dout对象
DataOutputStream dout = new DataOutputStream(fout);
// dout.write(x); //写入一个int类型的数据
dout.writeDouble(y);//写入一个double类型的数据
dout.writeUTF(z);//写入一个字符串(UTF_8)
fout.close();
dout.close();
return "数据写入成功";
}
static void filterIn() throws Exception {
FileInputStream fin = new FileInputStream("F:\\java进阶\\IO\\src\\FileInPutStreamTest\\text.dat");
DataInputStream din=new DataInputStream(fin);
// System.out.println(fin);
// System.out.println(din.readInt());
System.out.println(din.readDouble());
System.out.println(din.readUTF());
fin.close();
din.close();
}
}
.close();
return “数据写入成功”;
}
static void filterIn() throws Exception {
FileInputStream fin = new FileInputStream(“F:\java进阶\IO\src\FileInPutStreamTest\text.dat”);
DataInputStream din=new DataInputStream(fin);
// System.out.println(fin);
// System.out.println(din.readInt());
System.out.println(din.readDouble());
System.out.println(din.readUTF());
fin.close();
din.close();
}
}