首页 > 编程语言 >Java_IO流

Java_IO流

时间:2023-09-15 10:38:58浏览次数:35  
标签:Java 读取 System IO close println new out

基础知识

文件在java程序中是以流的形式来操作的。

文件

获取文件信息

file.getName()//文件名
    .getAbsolutePath()//绝对目录
    .getParent()//父目录
    .length()//大小(字节)
    .exists()//存在
    .isFile()//是不是一个文件
    .isDirectory();//是不是一个目录

目录操作

在java中,目录也被当做文件

file.delete()//删除
    .mkdirs()//创建多级目录
    .mkdir()//创建磁盘下一级目录

IO流原理

java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据。

输入:读取外部(很多种形式)数据

输出:输出数据到外部

流的分类

按操作数据单位不同分为:字节流(8bit)——二进制文件(无损),字符流——文本文件

都是抽象类,使用时需要创建实现子类。

节点流处理流

节点流:直接针对某个数据源(文件或数组、字符串等)读写数据。如FileInputStream、FileReader

处理流(包装流):封装了一个任意的节点流,拓宽了操作对象。如BufferedInputStream、BufferedReader

处理流使用了装饰模式

//抽象类
public abstract class Reader_: {
    public void readFile() {
    }
    public void readString() {
    }
}
//节点流
public class FileReader_ extends Reader_ {
    public void readFile() {
    	system.out.println("对文件进行读取...");
    }
}
//节点流
public class StringReader_ extends Reader_ {
    public void readString() {
    	system.out.println("读取字符串..");
    }
}

//包装流
public class BufferedReader_ extends Reader_{
    private Reader_ reader_;//属性是Reader_类型
    
    public BufferedReader_(Reader_ reader_) {
    	this.reader_ = reader_;
    }
    
    //让方法更加灵活,多次读取文件
    public void readFiles(int num) {
        for(int i = 0; i < num; i++) {
            reader_.readFile();
        }
    }
    //扩展readString,批量处理字符串数据
    public void readStrings(int num) {
        for(int i = 0; i < num; i++) {
        	reader_.readString();
        }
    }
}

main() {
    BufferedReader_ bufferReader_ = new BufferedReader_(new FileReader_);
    bufferReader_.readFiles(10);
}

输入流

字符流Reader

BufferedReader

BufferedReader bufferedReader = new BufferedReader
    (new FileReader(filePath));
//读取
string line;//按行读取,效率高
//1.bufferedReader.readLine()是按行读取文件
//2.当返回null时,表示文件读取完毕
while ((line = bufferedReader.readLine()) != null) {
	system.out.println(line);
}
//关闭流,这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭节点流
//FileReader.close
bufferedReader.close();

字节流InputStream

FileInputStream:

//int readData = 0;
byte[] buf = new byte[8];//一次读取8个字节
int readLen = 0;
FileInputstream fileInputStream = null;
try {
    //创建FileInputstream对象,用于读取文件
    fileInputStream = new FileInputStream(filepath);
    //从该输入流读取一个字节的数据。如果没有输入可用,此方法将阻止。
    //如果返回-1,表示读取完毕
    //如果读取正常,返回实际读取的字节数
    //while ((readData = fileInputStream.read()) != -1) {
    while ((readLen = fileInputStream.read(buf)) != -1) {
    	//System.out.print((char)readData);//转成char显示
        System.out.print(new String(buf , 0, readLen));//根据字节构建字符串
    }
}catch (IOException e) {
	e.printStackTrace();
}finally {
    try {
    	fileInputstream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

BufferedInputStream:

ObjectInputStream:

读取数据时同时读取值和数据类型,即将数据反序列化。

读取(反序列化)的顺序需要和保存数据(序列化)的顺序一致,否则类型不匹配

System.out.println(ois.readInt());
System.out.println(ois.readBoolean();
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
system.out.println(ois.readUTF());
Dog dog = (Dog)ois.read0bject();//编译类型为Object,运行类型为Dog
System.out.println("运行类型=" + dog.getclass());
system.out.println("dog名=" + dog.getName());
//关闭流,关闭外层流即可,底层会关闭 FileInputstream流
ois.close();

输出流

字符流Writer

BufferedWriter

//创建BufferedWriter
BufferedWriter bufferedWriter = new BufferedWriter
    (new FileWriter(filePath, true));//true表示追加,而不是覆盖
bufferedWriter.write("hello!");
bufferedWriter.newLine();//插入一个和系统相关的换行
bufferedWriter.write("hello2!");
bufferedWriter.newLine();
bufferedWriter.write("hello3!");
bufferedWriter.newLine();
//说明:关闭外层流即可,传入的 new FileWriter(filePath),会在底层关闭
bufferedWriter.close();

字节流OutputStream

FileOutputStream

文件不存在会创建文件(前提是目录已经存在)

FileOutputStream fileOutputStream = null;
try {
    //得到FileOutputStream对象
    file0utputStream = new File0utputStream(filePath);
    //file0utputStream = new File0utputStream(filePath, true);//追加方式写入
    //写入一个字节
    file0utputStream.write('H');
    //写入字符串
    String str = "hello";
    file0utputStream.write(str.getBytes(), 0 ,str.length);//从索引0开始,写入长度
} catch (IOException e) {
	e.printStackTrace();
} finally {
    try {
		fileOutputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

BufferedOutputStream

ObjectOutputStream

保存数据时将数据类型也保存起来,即能够将数据序列化。需要将对象实现标记接口Serializable

//序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
String filePath = "e:\\data.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
//序列化数据到e:\data.dat
oos.writeInt(100);//int -> Integer(实现了 Serializable)
oos.writeBoolean(true);// boolean -> Boolean(实现了Serializable)
oos.writeChar('a');// char -> Character(实现了Serializable)
oos.writeDouble(9.5);// double -> Double(实现了Serializable)
oos.writeUTF("韩顺平教育");//String
oos.writeObject(new Dog());//需要序列化

oos.close();

综合实践

拷贝文件——文本

String srcFilePath = "e:\\a.java";
String destFilePath = "e:\\a2.java" ;
BufferedReader br = null;
BufferedWriter bw = null;
String line = "";
try {
    br = new BufferedReader(new FileReader(srcFilePath));
    bw = new BufferedWriter(new FileWriter(destFilePath));
    while((line = br.readLine()) != null) {
        //每读取一行,就写入
		bw.write(line);//插入一个换行
        bw.newLine();
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    br.close();
    bw.close();
}

拷贝文件——视频

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
    //因为 FileInputStream是 InputStream子类
	bis = new BufferedInputStream(new FileInputStream(srcFilePath));
    bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
	//循环的读取文件,并写入到destFilePath
	byte[] buff = new byte[1024];
	int readLen = 0;
	while ((readLen = bis.read(buff)) != -1) {//读取不到数据
        bos.write(buff, 0, readLen);
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (bis != null) {
        	bis.close();
        }
        if (bos != null) {
            bos.close();
        }
    } catch (IOException e) {
    	e.printStackTrace();
	}
}

细节

static和transient属性不能被序列化。

类的属性都需要实现序列化。

标准输入输出流

// System.in编译类型 InputStream
// system.in运行类型 BufferedInputStream
// 表示的是标准输入流——键盘
System.out.println(System.in.getClass());

//编译类型 PrintStream
//运行类型 PrintStream
//表示标准输出流——显示器
System.out.println(System.out.getClass());

Properties类

读文件:

//使用Properties类来读取mysql.properties文件
//1.创建Properties对象
Properties properties = new Properties();
//2. 加载指定配置文件
properties.load(new FileReader("src\\mysql.properties"));
//3.把k-v显示控制台
properties.list(System.out);
//4.根据key获取对应的值
String user = properties.getProperty("user");
String pwd = properties.getProperty("pwd");
System.out.println("用户名=" + user);
System.out.println("密码是=" + pwd);

标签:Java,读取,System,IO,close,println,new,out
From: https://www.cnblogs.com/fallorange/p/17704266.html

相关文章

  • JavaWeb综合案例(黑马程序员2023年JavaWeb课程总结,所有功能均实现,包含数据库sql文件)
    JavaWeb综合案例(黑马程序员2023年JavaWeb课程总结,所有功能均实现,包含数据库sql文件)1.案例介绍:1.前端:Vue.js+element-ui+ajax(axios)+html2.后端:maven+mybatis+servlet 2.项目结构: 3.BrandMapper接口类 packagecom.itheima.mapper;   impor......
  • JavaWeb专栏之(三):Eclipse创建JavaWeb项目
    JavaWeb专栏之(三):Eclipse创建JavaWeb项目前言:关注:《遇见小Du说》微信公众号,分享更多Java知识,不负每一次相遇。更多内容请访问:www.dushunchang.top在上一篇文章中,小Du猿带大家使用Idea创建JavaWeb项目,相比之下Idea作为当前非常主流的开发IDE,深受Java后端程序员使用。市面上约......
  • 手把手搭建一个完整的javaweb项目(适合新手)
    手把手搭建一个完整的javaweb项目本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点。 下载地址:http://download.csdn.net/detail/qq_23994787/9904842  点击下载主要功能有:1.用户注册2.用户登录3.用户列表展示4.用户信息修改......
  • JAVA中的高并发,解决高并发的方案
    java高并发,如何解决,什么方式解决一、什么是高并发二、高并发的解决方法有两种三、追加一、什么是高并发1.1高并发(HighConcurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。1.2高并发相关常用的一些指标有响应时间......
  • Java高并发策略 java架构设计高并发策略和设计
    Java高并发策略java架构设计高并发策略和设计最近在面试被问到这个问题,整理下按照不同的层级说明展示层cdn静态文件加速例如HTML、CSS、JS、图片这些静态资源非常适合放到CDN上进行缓存。CDN服务商的节点是全国各地的,你的一份静态文件会被缓存到各个节点,用户访问时,会......
  • Android studio 修改APK打包生成名称
    在app的build.gradle的android{}添加一下代码android.applicationVariants.all{variant->variant.outputs.all{defcreateTime=newDate().format("YYYYMMdd",TimeZone.getTimeZone("GMT+08:00"))//在这里修改apk文件名......
  • 「Java开发指南」在MyEclipse中的Spring开发(二)
    在上文中(点击这里回顾>>),我们主要介绍了一些Spring的基本概念、Spring项目配置及向导,本章节将继续介绍如何管理多个项目,Spring配置编辑器等,欢迎持续关注~MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论4.管理多个Beans和项目除了使用bean配置文......
  • 25届实习秋招-Java面试-JVM虚拟机面试题整理-牛客网
    JVMJVM概述:是什么-规范,有什么作用(多态,越界)Java为什么可以跨平台移植Java怎么做编译?与C语言的编译有什么区别?比较:jvmjrejdk整体的架构:内存结构内存结构/内存模型--即为运行时数据区:JVM了解过哪些版本,1.8和1.7内存结构不同的地方堆中方法区(永久代实现)改为了......
  • 25届实习秋招-Java面试-JUC多线程面试题整理-牛客网
    JUC介绍一下JUC下的锁(如何使用及应用场景)线程什么是进程:特征什么是线程:资源为什么多线程,什么使用用单线程,什么时候多线程,什么条件下多线程快。进程和线程的对比:进程如何通信,每种通信存放的介质。||线程的通信,几种方式。join进程和线程的区别,在JVM层面的体现一......
  • 25届实习/秋招-java面试-JavaSe面试题整理-牛客网
    JavaSe变量和运算符:基本数据类型介绍java中浮点数精度怎么解决,有了解过实现吗,为什么有精度问题BigDecimal,如何判断BigDecimal是否相等。如何进行计算、怎么四舍五入基本类型几种,分别占用空间int和Integer区别--包装类,int有几个字节。包装类常量池怎么判断相等的......