黑马程序员_java基础_IO流

------- android培训java培训、期待与您交流!---------
IO流

一、概述

       1IO流:即InputOutput的缩写。

       2、特点:

             1IO流用来处理设备间的数据传输。

             2Java对数据的操作是通过流的方式。

             3Java用于操作流的对象都在IO包中。

             4)流按操作数据分为两种:字节流和字符流。

             5)流按流向分为:输入流和输出流。

     注意:流只能操作数据,而不能操作文件。

       3IO流的常用基类:

            1)字节流的抽象基流:InputStreamOutputStream

            2)字符流的抽象基流:ReaderWriter

二、字符流
      1、简述
          

 a、字符流中的对象融合了编码表。使用的是默认的编码,即当前系统的编码。

              b、字符流只用于处理文字数据,而字节流可以处理媒体数据。

        

2、字符流的读写

             a、创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件。且该目录下如果已有同名文件,则同名文件将被覆盖。其         实该步就是在明确数据要存放的目的地。

            b、调用write(String s)方法,将字符串写入到流中。

           c、调用flush()方法,刷新该流的缓冲,将数据刷新到目的地中。

           d、调用close()方法,关闭流资源。但是关闭前会刷新一次内部的缓冲数据,并将数据刷新到目的地中。

     3、字符流的缓冲区——BufferedReader和BufferedWriter

            a、缓冲区的出现:提高了流的读写效率,所以在缓冲区创建前,要先创建流对象。即先将流对象初始化到构造函数中。 

            b、缓冲技术原理:此对象中封装了数组,将数据存入,再一次性取出。

            c、写入流缓冲区BufferedWriter的步骤:

             1)创建一个字符写入流对象。

                 2)为了提高字符写入流效率。加入缓冲技术。只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。

                3)调用write方法写入数据到指定文件

            4)其实关闭缓冲区,就是在关闭缓冲区中的流对象。

三、字节流

      1、概述

           a、字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。

           b、由于媒体文件数据中都是以字节存储的,所以,字节流对象可直接对媒体文件的数据写入到文件中,而可以不用再进行刷流                  动作。

           c、读写字节流:InputStream   输入流(读)

                             OutputStream  输出流(写)

           d、为何不用进行刷流动作:

                 因为字节流操作的是字节,即数据的最小单位,不需要像字符流一样要进行转换为字节。所以可直接将字节数据写入到指定           文件中。

          e、InputStream特有方法:

                 int available();//返回文件中的字节个数


      2、

字节流缓冲区

            同样是提高了字节流的读写效率。

            a、读写特点:

                   read():会将字节byte型值提升为int型值

                   write():会将int型强转为byte型,即保留二进制数的最后八位。

          b、原理:将数据拷贝一部分,读取一部分,循环,直到数据全部读取完毕。


四、键盘输入

       1、标准输入输出流

            System.in:对应的标准输入设备,键盘。

            Ssytem.out:对应的是标准的输出设备,控制台。

            System.in的类型是InputStream.

           System.out的类型是PrintStream是OutputStream的子类FilterOutputStream的子类。

      2、整行录入

                 当使用输入流进行键盘录入时,只能一个字节一个字节进行录入。为了提高效率,可以自定义一个数组将一行字节进行存               储。当一行录入          完毕,再将一行数据进行显示。这种正行录入的方式,和字符流读一行数据的原理是一样的。也就                       是readLine方法。

      3、转换流

        3.1 转换流的由来:

             a、字符流与字节流之间的桥梁

            b、方便了字符流与字节流之间的操作

          转换流的应用:

             字节流中的数据都是字符时,转成字符流操作更高效。

         3.2   InputStreamReader将字节流通向字符流

               a、获取键盘录入对象。

                         InputStream in=System.in;

               b、将字节流对象转成字符流对象,使用转换流。

                       InputStreamReaderisr=new InputStreamReader(in);

              c、为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader

                    BufferedReaderbr=new BufferedReader(isr);

             键盘录入最常见写法

                  BufferedReaderin=new BufferedReader(new InputStreamReader(System.in));

         3.3   OutputStreamWriter字符流通向字节流

             字符通向字节:录入的是字符,存到硬盘上的是字节。步骤和InputStreamReader转换流一样。

IO流代码如下:

package arrDamo;
/*
用键盘输入五个学生的信息,信息包括学生的姓名和三门课程的成绩
学生格式如:zhangsan,40,56,67并计算出总分
再把学生信息并按总分的高低来排序,写入到一个文本文件中
*/
import java.io.*;
import java.util.*;
//实现Comparable,好让Student按自定义来排序
class Student implements Comparable<Student>
{
	String name;
	int ma;
	int en;
	int ch;
	int sum;
	//初始化
	Student(String name,int ma,int en,int ch)
	{
		this.name=name;
		this.ma=ma;
		this.en=en;
		this.ch=ch;
		sum=ma+en+ch;
	}
	//复写compareTo类,自定义排序
	public int compareTo(Student st)
	{
		int num = new Integer(this.sum).compareTo(new Integer(st.sum));
		if(num==0)
		{
			return this.name.compareTo(st.name);
		}
		return num;
	}
	public String getName()
	{
		return name;
	}
	public int getSum()
	{
		return sum;
	}
	//复写hashCode()方法
	public int hashCode()
	{
		return name.hashCode()+sum*45;
	}
	//复写equals(Object obj)方法
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Student))
			throw new ClassCastException("obj不属于学生");
		Student stu = (Student)obj;
		return this.name.equals(stu.name)&&this.sum==stu.sum;
	}
	//返回学生信息
	public String StudentToString()
	{
		return "student("+name+","+ma+","+en+","+ch+")";
	}
}
class StudentWrite
{
	public static Set<Student> method_1()
	{
		System.out.println("请输入学生信息:");
		//将从键盘输入的数据存到缓冲区长
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//创建一个TreeSet集合
		Set<Student> set = new TreeSet<Student>();
		//把学生信息存到集合中
		String line=null;
		try {
			while((line=br.readLine())!=null)
			{
				//假如输入的是over,就结束
				if("over".equals(line))
					break;
				//将键盘输入的数据按逗号来切割,组成一个字符串数组
				String[] str=line.split(",");
				//创建学生对象,并初始化
				Student stus = new Student(str[0],Integer.parseInt(str[1])
					           ,Integer.parseInt(str[2])
								,Integer.parseInt(str[3]));
				//将学生存到TreeSet集合中
				set.add(stus);
			}
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} 
			try {
				//关闭流
				if(br!=null)
				br.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			//返回Set集合
			return set;
	}
	public static void method_2(Set<Student> sets)
	{
		//创建一个目的文件
		File file=new File("D:\\student.txt");
		//把TreeSet集合中的数据写到目的文件中
		BufferedWriter bw = null;
		try {
			bw = new BufferedWriter(new FileWriter(file));
			for(Student s:sets)
		       {
					bw.write(s.StudentToString()+"\t");
					bw.write(s.getSum()+"");
					bw.newLine();
					bw.flush();
		       }
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
		try {
			//关闭流
			if(bw!=null)
			bw.close();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

}
public class StudentInfoDemo 
{
	public static void main(String[] args) throws Exception 
	{
		//获取一个Set集合
		Set<Student> se = StudentWrite.method_1();
		//调用method_2(se)方法
		StudentWrite.method_2(se);
	}
}







------- android培训java培训、期待与您交流!---------
源码链接: https://pan.quark.cn/s/a4b39357ea24 斐讯K2是一款广受用户青睐的无线路由器,其运行表现稳定且具备较高的可操作性,在DIY爱好者群体中拥有极高的声誉。本资料将系统性地阐述斐讯K2的固件刷机方法及其关联的技术要点。固件升级是路由器爱好者改善设备性能、扩展功能的一种普遍手段,经由替换出厂固件,能够达成更加个性化的网络配置、增强安全防护等目标。斐讯K2固件资源库涵盖了多种知名的非官方固件,诸如Tomato Pheonix 不死鸟、高恪、PandoraBox 潘多拉等,这些固件均具备独特的优势,能够适配不同用户的需求。 1. Tomato Pheonix 不死鸟:Tomato是一款立足于Linux的开源固件,以其精巧、高效而备受推崇。不死鸟版本是专门为华硕及斐讯路由器优化的分支,提供了卓越的QoS(服务质量)配置、详尽的图表监控以及便捷的固件升级途径。对于那些需要精准调控带宽和监测网络状态的用户而言,这是一个理想的选项。 2. 高恪:高恪固件是OpenWrt的定制化版本,着重于操作的便捷性和运行的可靠性,特别适合对路由器操作不甚熟悉的用户群体。它提供了一些实用的功能,例如内置的广告屏蔽、快速测速工具等,同时保留了OpenWrt的适应性。 3. PandoraBox 潘多拉:潘多拉盒是另一款基于OpenWrt的固件,它以丰富的插件库和强大的自定义潜力而闻名。用户能够依据个人需求安装各类插件,实现更多功能,如远程接入、DDNS(动态域名解析服务)等。 4. 官方固件的纯净版本与定制版本:官方固件通常更侧重于稳定性,纯净版意味着未预置额外的应用或服务,适合注重稳定性的用户。定制版则可能包含了制造商的特色功能或优...
源码下载地址: https://pan.quark.cn/s/926926948560 AS3.0与XML结合的通用图片滚动功能,是一种基于ActionScript 3.0和XML技术的动态图像展示方案,非常适合初学者进行学习和实践应用。此项目的关键在于借助XML文件作为数据媒介,用来保存图像的相关参数,例如图像的链接地址、展示的次序等,接着在AS3.0环境中对XML进行解析,并动态地载入和展示这些图像,达成图像的滚动或是循环播放的目的。 我们需要明确ActionScript 3.0(AS3.0)是Adobe Flash Professional以及Flex Builder等开发工具中采用的编程语言,用于构建交互式内容以及丰富的互联网应用。相较于先前的版本,AS3.0在性能上有了大幅度的提升,并且引入了更为规范的面向对象编程模式,涵盖了类、接口以及包等概念。 XML(可扩展标记语言)是一种简明且高效的数据传输格式,既便于人类阅读和编写,也易于机器进行解析和生成。在该项目中,XML文件用于存储图像数据,例如图像的URL、延时的时长、动画的样式等,通过这种方式可以将数据与程序代码分离,从而增强代码的可维护性与可扩展程度。 实施这一图片滚动功能,主要涉及到以下AS3.0的核心知识点: 1. **XML解析**:运用`XML`类来载入并解析XML文件,从而获取图像的清单。AS3.0提供了简便的API来操作XML节点,例如`children()`、`attributes()`等,用以获取子节点和属性值。 2. **事件监听**:借助`EventDispatcher`类来监控载入和解析过程中的事件,比如`Event.OPEN`、`Event.PROGRESS`、`Event...
内容概要:本文介绍了软件许可管理的技术实现方式及相关工具资源,重点阐述了加密外壳(EMS)和API加密两种保护机制。加密外壳通过将程序(如.exe、.dll、.apk)封装在加密壳中,实现运行时内存解密,防止静态反编译和代码篡改,同时支持对数据文件、系统参数及部分代码的加密,并依赖硬件锁(HL)或软件锁(SL)进行授权控制。API加密则通过在代码中嵌入安全验证调用,确保授权合法后才执行核心逻辑。文章还说明了锁的类型(HL/SL)、模式(有驱/AdminMode与无驱/UserMode)、升级路径以及虚拟时钟功能,并描述了产品授权程从功能定义到产品创建、授权生成的全过程,支持通过C2V文件或锁ID复制已有授权状态。文中附带多个开源平台链接和技术博客参考资源。; 适合人群:从事软件版权保护、授权系统开发或安全技术研究的研发人员,尤其是具备一定逆向工程、软件安全基础的1-3年经验开发者。; 使用场景及目标:①构建安全的软件授权体系,防止盗版和非法使用;②实现灵活的功能授权管理(如时效、并发、硬件绑定);③选择合适的加密方案(硬件锁/软锁、有驱/无驱)并集成到现有产品中;④学习加密外壳与API验证的实际应用方法; 阅读建议:此资源侧重于软件许可的技术架构与实施细节,建议结合提供的GitHub、Gitee项目链接及CSDN技术文章深入理解实现原理,并通过实际调试加密壳和模拟授权程加强实践能力。
内容概要:本文聚焦于“风光制氢合成氨系统优化研究”,系统阐述了基于Cplex求解器对该耦合系统进行数学建模与优化求解的全过程,并提供了完整的Matlab代码实现。研究整合风能、光伏等可再生能源发电与电解水制氢、合成氨化工工艺,构建涵盖系统容量配置与运行调度的联合优化模型,旨在提升绿电就地消纳水平、降低碳排放强度并实现综合能源利用效率的最大化。文中详细解析了优化模型的核心构成,包括以综合成本最小化或能源效率最大化为目标的目标函数设计,以及涵盖设备出力能力、系统能量动态平衡、设备启停特性等关键环节的约束条件建模方法,利用Cplex求解器进行高效精确求解,模型适用于并网与离网等多种运行场景。; 适合人群:具备一定能源系统建模与优化理论基础,熟练掌握Matlab编程语言及常用优化工具箱(如YALMIP)应用的科研人员与工程技术从业者,特别适用于从事综合能源系统规划、绿色氢能与绿氨生产、可再生能源高效集成等前沿领域的硕士、博士研究生及高校科研人员。; 使用场景及目标:①复现高水平学术论文中关于风光制氢合成氨系统的复杂优化模型;②深入掌握Cplex求解器在大规模、多约束能源系统优化问题中的高级建模与调用技巧;③开展面向“双碳”战略的绿氢、绿氨生产项目的可行性分析、规划设计与运行策略研究,为清洁能源项目的科学决策与工程落地提供量化依据和技术支撑。; 阅读建议:建议读者结合文中提供的Matlab代码与相关领域的权威文献进行对照学习,重点剖析模型构建的物理逻辑与数学推导过程,熟练掌握Cplex与Matlab的接口调用方法;鼓励读者通过调整系统参数、修改目标函数或扩展模型结构(如引入更多不确定性因素)等方式进行二次开发,以适应不同的实际应用场景,进一步深化对综合能源系统优化的理解与实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值