`

java io流编程

阅读更多
一、java.io.File
1、绝对路径和相对路径
   File类:用来构造文件或文件夹的类,在其构造函数中要求传入一个String类型的参数,用于指示文件所在的路径.这里可以使用绝对路径作为参数,也可以使用相对路径. 使用绝对路径指明了文件的具体路径(如:E:\images\login.gif),java虚拟机(JVM)很容易就能定位到该文件,那么使用的是相对路径jvm又是如何定位文件的呢?
  绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。System.getProperty("user.dir")
2、创建文件对象
   创建File对象时必须给出文件或文件夹名(可以是相对路径也可以是绝对路径):
File file1 = new File("C:\\java\\aaa.bmp");
File file2 = new File("C:\\Temp");
File file3 = new File("./data.txt");//相对路径:"./"当前目录,
3、检查文件对象是否存在
boolean exists();                               
4、检查是否为文件
boolean isFile();如果File对象所指的是一个文件,则返回true      
5、 操作文件中的相关方法:
  5.1、查询文件长度
      long length();返回文件长度,文件夹的长度为0
  5.2、查询文件修改日期
      long lastModified();返回文件上次修改的日期时间,返回的是从1970年午夜至今文件最后修改时刻的毫秒数,但可以通过Calendar类表示成相对时间。
  5.3、获得文件名和相对路径的函数:
      String getName();   // getName函数获得文件名,不包含路径
      String getPath();    // getPath函数获得文件所在路径和文件名称
      String getAbsolutePath();   //获得文件的绝对路径
   5.4、重命名/移动文件(本地文件的移动,如果是网络上那么还得通过流的读写)
     boolean renameTo(File dest);
      作用:给文件或文件夹改名,如果dest所指的路径与文件原来的路径不同的话,就会将文件或文件夹移动到目标位置。
   5.5、删除文件/目录
      boolean delete();删除File对象所指向的文件或文件夹。如果是文件夹:文件夹必须是空的,否则无法删除
   5.6、创建文件
      file1.createNewFile();如果文件不存在,则创建一个新文件;如果文件存在, 则不进行任何操作,返回false。
   5.7、同样:检查是否是(文件夹)目录、操作目录相关方法、创建目录、删除目录
      boolean mkdir();创建一个子目录//保证要创建的子目录上级目录已经存在
      boolean mkdirs();创建多个(多层)子目录//如果要创建的子目录的上级目录不存在,则先创建上级目录,再创建子目录  

      列举出文件夹下的所有文件
      file.list();// 当前文件夹下:文件名和文件夹名称
      file.listFiles();// 当前文件夹下文件对象
二、文件过滤器
1、FileFilter:
File[] files = file.listFiles(new FileFilter() {
  @Override
     public boolean accept(File pathname) {
if (pathname.getName().endsWith("jpg")) {// 区分大小写,如何不区分? FileNameExtensionFilter 文件扩展名过滤器(文件扩展名的比较不区分大小写)
return true;
}
return false;
}
});
2、FilenameFilter
    FilenameFilter filenameFilter = new FilenameFilter() {
      public boolean accept(File dir, String name) {
if (name.endsWith("JPG")) { return true;
}
return false;
}
};
   //文件名过滤和文件对象过滤
String[] filenames = file.list(filenameFilter);
File[] files=file.listFiles(filenameFilter);
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;

public class TestFileFilter {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		File file = new File(
				"E:\\软件");
		File[] files = file.listFiles();
		for (int i = 0; i < files.length; i++) {
			System.out.println("筛选前:" + files[i].getName());
		}
		fileFilter(file);
		filenameFilter(file);
	}

	private static void fileFilter(File file) {
		File[] files = file.listFiles(new FileFilter() {

			@Override
			public boolean accept(File pathname) {

				if (pathname.getName().toLowerCase().endsWith(".txt")) {
					return true;
				} else {
					return false;
				}
			}
		});
		for (int i = 0; i < files.length; i++) {
			System.out.println("fileFilter:" + files[i].getName());
		}
	}

	private static void filenameFilter(File file) {
		File[] files = file.listFiles(new FilenameFilter() {

			@Override
			public boolean accept(File dir, String name) {
				if (name.toLowerCase().endsWith(".ppt")) {
					return true;
				} else {

					return false;
				}
			}
		});
		for (int i = 0; i < files.length; i++) {
			System.out.println("filenameFilter:" + files[i].getName());
		}
	}
}



三、字节流                  
   字节流只能读取字节数据。
   字节流读取中文时,会出乱码。因为一个中文字符占两个字节。
   字节流:用于读取二进制的数据文件,(如声音,图片,视频等)
1、字节输入流(InputStream,FileInputStream,BufferedInputStream,DataInputStream)
(1)InputStream 此抽象类是表示字节输入流的所有类的超类,以字节为单位
    常用方法:
      int read()下一个数据字节(0 到 255 范围内的 int 字节值),如果到达流的末尾,则返回 -1
     int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
      int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
      void close() 关闭此输入流并释放与该流关联的所有系统资源
(2)直接子类:
                   
  FileInputStream :把文件对象转化成输入流。用于读取诸如图像数据之类的原始字节流。
     构造方法:
FileInputStream(File file)通过File对象创建一个 FileInputStream 
FileInputStream(String name) 通过文件路径创建一个 FileInputStream

  (3)FilterInputStream:过滤流,是一种扩展输入流功能的类(装饰器),它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能

(4)BufferedInputStream:在创建 BufferedInputStream 时,会创建一个内部缓冲区数组,利用缓冲区来提高读数据的效率
   先把一批数据读入到缓冲区,接下来read()方法只需要到缓冲区内获取数据,就能减少物理性读取数据的次数。
   构造方法:
   BufferedInputStream(InputStream in) 通过底层流,创建一个 BufferedInputStream
   BufferedInputStream(InputStream in, int size) 通过底层流,创建具有指定缓冲区大小的 BufferedInputStream

(5)DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型(类型转换请查看源代码)
   构造方法:
    DataInputStream(InputStream in) 使用指定的底层 InputStream 创建一个 DataInputStream

2、字节输出流
(OutputStream,FileOutputStream,BufferedOutputStream,DataOutputStream)
(1)OutputStream:此抽象类是表示输出字节流的所有类的超类
    void close()关闭此输出流并释放与此流有关的所有系统资源
    void flush() 刷新此输出流并强制写出所有缓冲的输出字节
    void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流
    void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流

(2)FileOutputStream:文件输出流是用于将数据写入 File 的输出流
   构造方法摘要
FileOutputStream(File file)创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
//append表示是否追加到文件末尾,还是覆盖源文件内容
  FilterOutputStream
  直接子类:
         BufferedOutputStream,
         DataOutputStream,
         PrintStream: 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式(自动刷新)
         构造方法:
PrintStream(File file)创建具有指定文件且不带自动行刷新的新打印流。 
PrintStream(OutputStream out) 创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush)创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush, String encoding)创建新的打印流。
PrintStream(String fileName) 创建具有指定文件名称且不带自动行刷新的新打印流。
常用方法:
                  public PrintStream append(char c);将指定字符添加到此输出流
                  public void println(char x)//换行,插入
                  public void write(int b)   //要写入将根据平台的默认字符编码转换的字符,请使用 print(char) 或 println(char) 方法
         
                  按照平台的默认字节编码将 String.valueOf(int) 生成的字符串转换为字节,并完全以 write(int) 方法的方式写入这些字节

3、文件读写步骤
(1)创建文件对象
File file1 = new File("data.txt");
File file2 = new File("dest.txt");
(2)创建读出/写入操作的对象
文件对象仅仅表示文件本身,对文件进行读/写操作还需要读/写操作对象来完成。
读出文件中的内容采用FileInputStream对象,在文件中写入内容采用FileOutputStream对象。
InputStream inputStream = new FileInputStream(file1);
OutputStream outputStream = new FileOutputStream(file1);
说明:写入和读出操作对象必须和具体的文件对象关联起来,而文件对象又是和具体的文件关联的。
(3)数据文件的读/写操作
inputStream.read();
outputStream.write();
(4)关闭资源
inputStream.close();
outputStream.close();

四、字符流

1、Reader:用于读取字符流的抽象类
         方法:  
         int read() 读取单个字符
         int read(char[] cbuf) 将字符读入数组
         int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分
         void close() 关闭该流并释放与之关联的所有资源
        
(1) FileReader:
       extends InputStreamReader extends Reader用于读取字符流
        构造方法:
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader
(2)BufferedReader:
      extends Reader
   从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取,可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大
   通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求
    因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)
    构造方法:
BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流
readLine() 读取一个文本行
2 Writer:
        写入字符流的抽象类
        Writer append(char c) 将指定字符添加到此 writer。
        void close() 关闭此流,但要先刷新它。
void flush() 刷新该流的缓冲。
        void write(char[] cbuf) 写入字符数组。
        void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
        void write(int c) 写入单个字符。
        void write(String str) 写入字符串。
        void write(String str, int off, int len) 写入字符串的某一部分。
       
(1)FileWriter:
构造方法:

FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。

FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。 
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

append 表示追加到文件末尾,否则覆盖源文件中的数据
      
(2) BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
        构造方法:
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。 BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流
        方法摘要
void close() 关闭此流,但要先刷新它。
void flush()刷新该流的缓冲。
void newLine() 写入一个行分隔符。
void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
          void write(String s, int off, int len) 写入字符串的某一部分。

五、字节流与字符流
字节流:以Stream结尾的都是字节流,字节流用于读取二进制数据(图片、视频、音乐)
  字符流:结尾都是以Reader/Writer结尾的,字符流用于读取文本数据(txt、jsp、java...)
字节流和字符流转换

InputStreamReader  把字节输入流转换成字符流
OutputStreamWriter 把字符流写到字节流

例子:
  用字节流打开文件,然后转成字符流
FileInputStream fis = new FileInputStream("e:/student.c");
InputStreamReader isr = new InputStreamReader(fis);

六、对象的序列化和反序列化
   序列化:把一个对象的状态写入一个字节流的过程。如果一个对象引用到其它对象,而这些对象又引用另外的对象,那么所有这些对象都会被序列化。
  Serializable接口:
   只有实现Serializable接口的对象才能被序列化工具存储或者恢复。
   声明为transient的变量不被序列化工具存储。
   static变量同样不被存储

七、对象流
ObjectOutputStream:
  构造方法:
public ObjectOutputStream(OutputSteam os) 负责向流写入对象:
public void writeObject(Object obj)//obj 序列化的对象
ObjectInputStream:
  构造方法:
public ObjectInputStream(InputSteam is)负责从流读出对象(反序列化):
public Object readObject()
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化

八、配置文件管理
后缀一般为ini或者properties的文件
格式:键 = 值
说明:ini或者properties,多个重复键时,ini只处理第一个,properties处理最后一个。其他差别不明显
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串
  方法及步骤:
     1)加载文件流:
void load(InputStream inStream) 从输入流中读取属性列表(键和元素对)
void load(Reader reader) 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)
     2)读取文件信息或者修改文件信息:
String getProperty(String key) 通过键获取值
String getProperty(String key,String defaultValue)通过键获取值。如果未找到键,则此方法返回默认值变量
Object setProperty(String key, String value)调用 Hashtable 的方法 put,通过键修改相应的值 ,如果该键不存在则新增
     3)保存到文件流:    
  void store(OutputStream out, String comments) 以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
   void store(Writer writer, String comments) 以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;

public class TestProperty {
	// 1 创建文件对象
	static File file = new File("./config/config.ini");
	static FileInputStream fileInputStream = null;
	static Properties properties = null;
	static FileOutputStream fileOutputStream = null;

	static {
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		try {
			// 2 创建输入流
			fileInputStream = new FileInputStream(file);
			// 3 创建Properties
			properties = new Properties();
			// 4 加载输入流
			try {
				properties.load(fileInputStream);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	// 写入到配置文件
	public static void setValue(String key, String value) {
		properties.setProperty(key, value);
		try {
			fileOutputStream = new FileOutputStream(file);
			properties.store(fileOutputStream, "qq config information!");
			fileOutputStream.flush();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				fileOutputStream.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	public static String getValue(String key) {
		String value = properties.getProperty(key, "8099");
		try {
			fileInputStream.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return value;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORACLE";
		String user = "oracle1105";
		String password = "oracle1105";
		String driver = "oracle.jdbc.driver.OracleDriver";
		String port = "8099";

		//保存配置信息
		TestProperty.setValue("url", url);
		TestProperty.setValue("user", user);
		TestProperty.setValue("password", password);
		TestProperty.setValue("driver", driver);
		TestProperty.setValue("port", port);
		
		//读取配置信息
		System.out.println(TestProperty.getValue("url"));
		System.out.println(TestProperty.getValue("user"));
		System.out.println(TestProperty.getValue("password"));
		System.out.println(TestProperty.getValue("driver"));
		System.out.println(TestProperty.getValue("port"));
		
		
		
	}

}

分享到:
评论

相关推荐

    基于springboot教育资源共享平台源码数据库文档.zip

    基于springboot教育资源共享平台源码数据库文档.zip

    视频笔记linux开发篇

    linux开发篇,配套视频:https://www.bilibili.com/list/474327672?sid=4493702&spm_id_from=333.999.0.0&desc=1

    readera-24-09-08plus2020.apk

    ReadEra 这个阅读应用能够打开下列任何格式的文档: EPUB, PDF, DOC, RTF, TXT, DJVU, FB2, MOBI, 和 CHM. 基本上来说,你可以用它阅读你的设备内存中的任何书籍或者文本文档。 这个应用与划分成章节的文档兼。,有一个书签功能,可以在你阅读的时候,自动保存你的进度。另外,它让你更改页面模式,从几种不同的主题中进行挑选(夜间,白天,棕黑色调,还有控制台)。

    STM32单片机控制舵机旋转

    软件环境:KEIL4 硬件环境:STM32单片机+舵机 控制原理:通过控制输出信号的占空比调节舵机旋转的角度

    基于springboot仓库管理系统源码数据库文档.zip

    基于springboot仓库管理系统源码数据库文档.zip

    酒店管理系统源码C++实现的毕业设计项目源码.zip

    酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 酒店管理系统源码C++实现的毕业设计项目源码.zip,酒店管理系统源码C++实现的毕业设计项目源码.zip个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。酒店管理系统源码C++实现的毕业设计项目源码.zip酒店管理系统源码C++实现的毕业设计项目源码.zip酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕

    58商铺全新UI试客试用平台网站源码

    58商铺全新UI试客试用平台网站源码

    基于SpringBoot+Vue的轻量级定时任务管理系统.zip

    springboot vue3前后端分离 基于SpringBoot+Vue的轻量级定时任务管理系统.zip

    毕业设计&课设_微博情感分析,用 flask 构建 restful api,含相关算法及数据文件.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    4D毫米波雷达点云数据处理方法研究.caj

    4D毫米波雷达点云数据处理方法研究.caj

    S M 2 2 5 8 X T量产工具

    S M 2 2 5 8 X T 量产工具供大家下载使用

    基于springboot的文物管理系统源码数据库文档.zip

    基于springboot的文物管理系统源码数据库文档.zip

    基于springboot的电影院售票管理系统源码数据库文档.zip

    基于springboot的电影院售票管理系统源码数据库文档.zip

    Javaweb仓库管理系统项目源码.zip

    基于Java web 实现的仓库管理系统源码,适用于初学者了解Java web的开发过程以及仓库管理系统的实现。

    美容美发项目,使用django框架,前后端一体化项目

    美容美发项目,使用django框架,前后端一体化项目

    2023年中国在线票务行业市场规模约为24.99亿元,挖掘市场新机遇

    在线票务:2023年中国在线票务行业市场规模约为24.99亿元,挖掘市场蓝海新机遇 在数字浪潮的席卷下,传统的票务销售模式正经历着前所未有的变革。纸质门票逐渐淡出人们的视野,取而代之的是便捷、高效的数字和移动票务。这一转变不仅为消费者带来了前所未有的购票体验,更为在线票务平台开辟了广阔的发展空间和市场机遇。随着国民经济的持续增长和文体娱乐行业的蓬勃发展,中国在线票务行业正站在时代的风口浪尖,等待着每一位有志之士的加入。那么,这片蓝海市场究竟蕴藏着怎样的潜力?又该如何把握机遇,实现突破?让我们一同探索。 市场概况: 近年来,中国在线票务行业市场规模持续扩大,展现出强劲的增长势头。据QYResearch数据显示,2023年中国在线票务行业市场规模约为24.99亿元,尽管受到宏观经济的影响,市场规模增速放缓,但整体趋势依然向好。这一增长主要得益于国民人均收入的不断提高、电影及演出行业的快速发展以及政府政策的支持。例如,2023年财政部、国家电影局发布的《关于阶段性免征国家电影事业发展专项资金政策的公告》,为电影行业注入了强劲动力,进而推动了在线票务市场规模的扩大。 技术创新与趋势: 技术进步

    基于SpringBoot的养老院管理系统源码数据库文档.zip

    基于SpringBoot的养老院管理系统源码数据库文档.zip

    毕业设计&课设_含构建设置及相关操作,基于特定技术,具体功能未详细说明.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    Go语言入门指南:基础语法、并发编程详解

    内容概要:本文档是一份详细的Go语言教程,从基础概念介绍到高级主题均有覆盖。主要内容包括Go语言的基础语法、数据类型、控制结构、函数、结构体、接口和并发编程等方面。通过具体示例介绍了如何使用Go语言进行开发。 适合人群:初学者和有一定经验的程序员都可以从这篇教程中受益,特别是那些想要快速掌握Go语言并应用于实际项目的开发者。 使用场景及目标:适用于初学者系统学习Go语言的基础知识和常用功能;也可以作为已有开发经验者的参考资料,帮助他们解决具体的编程问题,提高开发效率。 其他说明:本教程不仅包含了Go语言的基本知识点,还重点讲解了其独特的并发编程模型。读者在学习过程中应该注重理论与实践相结合,通过实际编写代码来加深理解和记忆。

    基于springboot计算机基础网上考试系统源码数据库文档.zip

    基于springboot计算机基础网上考试系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics