黑马程序员---IO流(一)

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、IO流概述

IO(Input,Output)流:用来处理设备之间的数据传输。

1,java对数据的操作是通过流的方式。

2,java用于操作流的对象都在IO包中。

3,流按操作的数据可以分为两种:字节流和字符流。

4,流按照流向可以分为:输入流和输出流。

字节流的抽象基类:InputStream和OutputStream

字符流的抽象基类:Reader和Writer

注意:由着四个类派生出来的子类名称都是以其父类名作为子类名的后缀的。如:InputStream的子类FileInputStream,Reader的子类FileReader。

二、字符流

1,FileWriter:字符流中Writer的子类。

package 博客8_IO流一;

import java.io.FileWriter;
import java.io.IOException;

public class IO流
{
	public static void main(String[] args)throws IOException
	{
		/*
		 * 创建FileWriter对象,该对象一初始化就必须明确被操作的文件。
		 * 而且,该文件会被创建到指定目录下,如果该目录下已经有了同名文件,则会被覆盖。
		 * */
		FileWriter fw = new FileWriter("IO.txt");
		//调用FileWriter里的write方法,将字符串写入流中。
		fw.write("lalala");
		//刷新流对象中缓冲的数据,将数据刷新到目的地。
		fw.flush();
		//关闭资源,但是关闭之前会刷新一次流对象缓冲区中的资源。
		fw.close();
	}
}
close和flush的区别:flush刷新后,流可以继续使用。close关闭后,流也将关闭,如果再操作流,则编译不能通过。
2,对IOException的处理方式:

public class IOException处理 {
	public static void main(String[] args) {
		FileWriter fw = null;//try外建立引用,try里建对象。
		try {
			fw = new FileWriter("IOException.txt");
			fw.write("hahahaha");
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally
		{
			try {
				if(fw!=null)//否则会出现空指针异常。
					fw.close();//必须要关闭资源,所以close应放在finally里。
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
3,文件的续写:传递一个true参数,代表不覆盖已有的文件,并在已有文件的末尾处续写。
package 博客8_IO流一;
import java.io.FileWriter;
import java.io.IOException;
public class 文件的续写Demo
{
	public static void main(String[] args)throws IOException
	{
		FileWriter fw = new FileWriter("IO.txt",true);
		fw.write("hiehiehie");。
		fw.close();
	}
}
注意:window里的换行是用\r\n共同完成的。

4,文件的读取:

a:当FileReader里的read方法读取到文件的最后一个字符时,会return-1,所以可以依此作为循环结束的条件来达到循环读取的目的。

package 博客8_IO流一;

import java.io.FileReader;
import java.io.IOException;

public class 文件读取 {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws IOException {
		// TODO Auto-generated method stub
		FileReader fr = new FileReader("IO.txt");
		int ch = 0;
		while((ch=fr.read())!=-1)
			System.out.println((char)ch);
		fr.close();
	}
}
b:通过字符数组的方式读取数据。

package 博客8_IO流一;
import java.io.FileReader;
import java.io.IOException;
public class 文件读取方式2 {
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		FileReader fr = new FileReader("IO.txt");
		char [] buf = new char[1024];
		int num = 0;
		while((num=fr.read(buf))!=-1)
		<span style="white-space:pre">	</span>System.out.println(num+"...."+new String(buf,0,num));
		fr.close();
	}
}
5,文件拷贝。

package 博客8_IO流一;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class 文件拷贝Text {
	/**
	 * 需求,文件的拷贝。
	 */
	public static void main(String[] args)//throws IOException
	{
		// TODO Auto-generated method stub
		
		//copy_1();
		copy_2();
	}	
	public static void copy_2() {
		//通过数组形式进行文件的拷贝。
		FileWriter fw=null;//在外面建立引用,在里面获取对象
		try {
			fw = new FileWriter("IO_copy.txt");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		FileReader fr=null;
		try {
			fr = new FileReader("IO.txt");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		char [] buf=new char[1024];//定义1024或其整数倍的数组
		int num = 0;
		try {
			while((num=fr.read(buf))!=-1)
			{
				fw.write(buf, 0, num);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally
		{
			if(fw!=null)
				try {
					fw.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		
			if(fr!=null)
				try {
					fr.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}
	public static void copy_1()throws IOException {
		// TODO Auto-generated method stub
		FileWriter fw = new FileWriter("IO_copy.txt");
		FileReader fr = new FileReader("IO.txt");
		int ch = 0;
		while((ch=fr.read())!=-1)
		{
			fw.write(ch);
		}
		fr.close();
		fw.close();
	}
}
三、字符流缓冲区
 缓冲区的意义:缓冲区的出现提高了对数据的读写效率。

字符流缓冲区对应的类:BufferedWriter,BufferedReader。

注意:缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强。

package 博客8_IO流一;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class 字符流缓冲区Demo {
	public static void main(String[] args)throws IOException {
		// TODO Auto-generated method stub
		FileWriter fw = new FileWriter("缓冲区练习.txt");
		BufferedWriter bufw = new BufferedWriter(fw);
		for(int x = 0 ;x<5;x++)
		{
			bufw.write("abcdse");
			bufw.flush();
			bufw.newLine();
		}
		bufw.close();
	}
}
readLine方法的原理:无论是读一行还是读取多个字符,最终都是在硬盘上一个一个的读取。所以使用的还是read中一次读一个的方法。
自定义缓冲区代码示例:

package 博客8_IO流一;
import java.io.*;
class MyBufferedReader
{
	private FileReader r;
	MyBufferedReader(FileReader r)
	{
		this.r=r;
	}
	public String MyReadLine()throws IOException
	{
		StringBuilder sb = new StringBuilder();//定义一个容器作为存放数据的缓冲区
		int ch = 0 ;
		while((ch=r.read())!=-1)
		{
			if(ch=='\r')//如果读到\r,那么不确定是否是这一行的结尾,所以要继续往下读
				continue;
			if(ch=='\n')//读到\n,证明这一行已经结束,所以直接返回读取到的字符串
				return sb.toString();
			else
				sb.append((char)ch);//否则就往容器里添加数据
		}
		if(sb.length()!=0)//如果最后一行没有换行,那么就手动的再打印出最后一行数据即可
			return sb.toString();
		return null;//读取结束,返回 标志
	}
	public void myClose()throws IOException
	{
		r.close();
	}
}

public class 自定义缓冲区_MyBufferedReader
{
	public static void main(String[] args) throws IOException
	{
		FileReader fr = new FileReader("缓冲区练习.txt");
		MyBufferedReader bufr = new MyBufferedReader(fr);
		String line =null;
		while((line=bufr.MyReadLine())!=null)
			System.out.println(line);
		bufr.myClose();
	}
}
四、装饰设计模式及LineNumberReader
装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类就称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰对象的功能,提供更强的功能。
装饰设计模式比继承要灵活,避免了继承体系臃肿,且降低了类与类之间的耦合性。

自定义MyLineNumbeReader代码如下:

package 博客8_IO流一;
import java.io.*;
class MyLineNumberReaderMethod//定义自己的装饰类,可以在读取的时候添加行号。
{
	private Reader r;
	private int lineNumber;
	MyLineNumberReaderMethod(Reader r)
	{
		this.r=r;
	}
	public String MyReadLine() throws IOException//自定义ReadLine方法
	{
		lineNumber++;//当方法被调用的时候,就让行号计数器+1
		StringBuilder sb = new StringBuilder();
		int ch = 0;
		while((ch=r.read())!=-1)
		{
			if(ch=='\r')
				continue;
			if(ch=='\n')
				return sb.toString();
			else
				sb.append((char)ch);
		}
		if(sb.length()!=0)
			return sb.toString();
		return null;
	}
	public void setLineNumber(int lineNumber)
	{
		this.lineNumber=lineNumber;
	}
	public int getLineNumber()
	{
		return lineNumber;
	}
	public void MyClose() throws IOException
	{
		r.close();
	}
}

public class MyLineNumberReader 
{
	public static void main(String[] args) throws IOException 
	{
		FileReader fr = new FileReader("HashSetDemo.java");
		MyLineNumberReaderMethod mlrm = new MyLineNumberReaderMethod(fr);
		String line = null;
		mlrm.setLineNumber(100);
		while((line=mlrm.MyReadLine())!=null)
		{
			System.out.println(mlrm.getLineNumber()+"::"+line);
		}
		mlrm.MyClose();
	}
}
由于之前已经做过了MyBufferedReader修饰类,所以可以让MyLineNumberReaderMethod继承 MyBufferedReaderr即可,代码优化后如下:

class MyLineNumberReaderMethod extends MyBufferedReader
{
	private int lineNumber;
	MyLineNumberReaderMethod(Reader r)
	{
		super(r);
	}
	public String MyReadLine() throws IOException//自定义ReadLine方法
	{
		lineNumber++;//当方法被调用的时候,就让行号计数器+1
		return super.MyReadLine();
	}
	public void setLineNumber(int lineNumber)
	{
		this.lineNumber=lineNumber;
	}
	public int getLineNumber()
	{
		return lineNumber;
	}
}
public class MyLineNumberReader 
{
	public static void main(String[] args) throws IOException 
	{
		FileReader fr = new FileReader("HashSetDemo.java");
		MyLineNumberReaderMethod mlrm = new MyLineNumberReaderMethod(fr);
		String line = null;
		mlrm.setLineNumber(100);
		while((line=mlrm.MyReadLine())!=null)
		{
			System.out.println(mlrm.getLineNumber()+"::"+line);
		}
		mlrm.myClose();
	}
}














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字乡村和智慧农业的数字化转型是当前农业发展的新趋势,旨在通过应用数字技术,实现农业全流程的再造和全生命周期的管理服务。中国政府高度重视这一领域的发展,提出“数字中国”和“乡村振兴”战略,以提升国家治理能力,推动城乡融合发展。 数字乡村的建设面临乡村治理、基础设施、产业链条和公共服务等方面的问题,需要分阶段实施《数字乡村发展战略纲要》来解决。农业数字化转型的需求包括满足市民对优质农产品的需求、解决产销对接问题、形成优质优价机制、提高农业劳动力素质、打破信息孤岛、提高农业政策服务的精准度和有效性,以及解决农业融资难的问题。 数字乡村建设的关键在于构建“1+3+4+1”工程,即以新技术、新要素、新商业、新农民、新文化、新农村为核心,推进数据融合,强化农业大数据的汇集功能。数字农业大数据解决方案以农业数字底图和数据资源为基础,通过可视化监管,实现区域农业的全面数字化管理。 数字农业大数据架构基于大数据、区块链、GIS和物联网技术,构建农业大数据中心、农业物联网平台和农村综合服务指挥决策平台三大基础平台。农业大数据中心汇聚各类涉农信息资源和业务数据,支持大数据应用。信息采集系统覆盖市、县、乡、村多级,形成高效的农业大数据信息采集体系。 农业物联网平台包括环境监测系统、视频监控系统、预警预报系统和智能控制系统,通过收集和监测数据,实现对农业环境和生产过程的智能化管理。综合服务指挥决策平台利用数据分析和GIS技术,为农业决策提供支持。 数字乡村建设包括三大服务平台:治理服务平台、民生服务平台和产业服务平台。治理服务平台通过大数据和AI技术,实现乡村治理的数字化;民生服务平台利用互联网技术,提供各类民生服务;产业服务平台融合政企关系,支持农业产业发展。 数字乡村的应用场景广泛,包括农业生产过程、农产品流通、农业管理和农村社会服务。农业生产管理系统利用AIoT技术,实现农业生产的标准化和智能化。农产品智慧流通管理系统和溯源管理系统提高流通效率和产品追溯能力。智慧农业管理通过互联网+农业,提升农业管理的科学性和效率。农村社会服务则通过数字化手段,提高农村地区的公共服务水平。 总体而言,数字乡村和智慧农业的建设,不仅能够提升农业生产效率和管理水平,还能够促进农村地区的社会经济发展,实现城乡融合发展,是推动中国农业现代化的重要途径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值