Java基础(IO输入输出流,读写文件操作,对象序列化)

2023-10-27

IO

输入输出流基本概念

输入流:信息从程序空间之外的地方流入程序空间里面

输出流:信息从程序空间里面流到程序空间之外的地方

输入输出流的分类

  • 从流的方法划分

    • 输入流
    • 输入流
  • 从流的分工划分

    • 节点流:访问文件进行输入输出操作的流
    • 处理流:在节点流的基础之上对信息进行加工转换处理的流
  • 从流的内容划分

    • 面向字符的流:专门处理字符数据
    • 面向字节的流:用于一般目的即输入输出

在这里插入图片描述

所有的输入输出流类都继承于以上四个类

  • 面向字符的流的超类为Reader&Writer

  • 面向字节的流的超类为InputStream&OutputStream

举一个简单的例子,复制一个文件的内容到另一个文件中

首先在该项目的文件所在位置新建一个Redirecting.txt文件

import java.io.*;

public class Redirecting {
    public static void main(String[] args) throws FileNotFoundException {
        BufferedInputStream in = new BufferedInputStream(
                new FileInputStream("Redirecting.txt")); 
        //FileInputStream就是一个面向字节的流,然后再通过BufferedInputStream来转化,
        //BufferedInputStream也是一个流,是一个缓冲流
        PrintStream out = new PrintStream(new
                BufferedOutputStream(new FileOutputStream("test.txt")));
        System.setIn(in); 
        //将输入流重定向到Redirecting文件中,相当于本来我们是从键盘输入,现在变成从文件来输入
        System.setOut(out);
        //将输出流重定向到test.txt文件中,本来应该是输出到显示器上,现在输出到test文件中
        System.setErr(out);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //BufferedReader是一个面向字符的流,因为BufferedReder只处理信息,但是不读取信息
        //因此我们需要用一个InputStreamReader来从文件中读取信息,再由BufferedReader转换
        String s;
	    while((s=br.readLine())!=null)
		    System.out.println(s);
            //因为我们已经输出流定向到test.txt文件中了,所以我们这里相当于复制的操作
	    in.close();
	    out.close();
    }
}

写文本文件

import java.io.*;

public class FileWriterTester {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        String fileName = "Hello.txt";
        FileWriter writer = new FileWriter(fileName);
        writer.write("Hello World!");
        writer.close();
    }
}

如果有大量的信息要写入文件,可以使用BufferedWriter

import java.io.*;

public class FileWriterTester {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        String fileName = "Hello.txt";
        BufferedWriter out = new BufferedWriter(new FileWriter(fileName));
        //跟前面说的一样,BufferedWriter也不直接对文件信息进行读取,它只处文件信息
        //因此我们需要用一个FileWriter来读取文件,再转换为BufferedWriter
        out.write("Hello World!");
        out.newLine(); //跨平台的换行,\n不一定在各个平台都是换行
        out.close();
    }
}

读文本文件

import java.io.*;

public class FileWriterTester {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        String fileName = "Hello.txt";
        BufferedReader in = new BufferedReader(new FileReader(fileName));
        //使用BuffereReader类可以按行读取
        String c = in.readLine();
        while(c!=null)
        {
        	System.out.println(c);
        	c=in.readLine();
        }         	
    }
}

Reader类有一个read方法,返回文件中字符的ASCLL码

import java.io.*;

public class FileWriterTester {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        String fileName = "Hello.txt";
        FileReader in = new FileReader(fileName);
        //前面的BuffereReader类也有read方法
        int c;
        while((c=in.read())!=-1)
        	System.out.print((char)c);     	
    }
}

写二进制文件

写二进制文件用到的类为DataOutputStream,继承于OutputStream,有一个派生类为FileOutputStream,这一个类只针对输入输出而DataoutPutStream可以写入各种类型的数据

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputstreamTester {

    public static void main(String[] args) throws FileNotFoundException, IOException{
            // TODO Auto-generated method stub
            String fileName = "test.dat";
            DataOutputStream out = new DataOutputStream(
                    new FileOutputStream(fileName));
            //用FileOutputStream转换为DataOutputStream
            out.writeByte(-1);
            out.writeByte(2);
            out.writeInt(5);
            out.writeBytes("Hello World");
            out.close();
        }
    }
}

同理,为了加快写入速度,我们可以使用BufferedOutputStream

DataOutputStream out = new DataOutputStream(
			new BufferedOutputStream(
					new FileOutputStream(fileName)));

读二进制文件

import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputstreamTester {

    public static void main(String[] args) throws FileNotFoundException, IOException{
        // TODO Auto-generated method stub
        String fileName = "test.dat";
        DataOutputStream out = new DataOutputStream(
                new BufferedOutputStream(
                        new FileOutputStream(fileName)));
        out.writeByte(-1);
        out.writeByte(2);
        out.close();
        int sum=0;
        try
        {
            DataInputStream in = new DataInputStream(
                new BufferedInputStream(new FileInputStream("test.dat")));
            //读二进制文件用的是DataInputStream,同时使用BufferedInputStream提高读取速度
            try
            {
                while(true)
                {
                    sum+=in.readUnsignedByte();
                }
                    
            }
            catch(EOFException eof)  //如果读到文件尾,就会抛出异常
            {
                System.out.println("The sum is:"+sum);
                in.close();
            }
        }
        catch(IOException iox) //文件读取的异常
        {
            System.out.println("IO Problems with"+fileName);
        }
    }
}

输出结果为257,因为我们读取的是无符号数in.readUnsignedByte(),如果改成in.readByte(),那么结果就是1

注意: 写二进制文件时,我们一般只在一个文件写入一种类型的数据,而且得用文档记录起来

一个拷贝文件的例子

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyBytes {
    public static void main(String[] args) throws IOException{
        if(args.length!=2)
            return;
        DataInputStream instr;
        DataOutputStream outstr;
        instr = new DataInputStream(new BufferedInputStream
                (new FileInputStream(args[0]))); //源文件
        outstr = new DataOutputStream(new BufferedOutputStream
                (new FileOutputStream(args[1])));//目标文件
        int c;
        try 
        {
            while(true)
            {
                c = instr.readUnsignedByte(); //读取源文件的字符
                outstr.writeByte(c); //写入目标文件中
            }          
        } 
        catch (EOFException eof) //读到文件为抛出异常,关闭文件
        {
            // TODO Auto-generated catch block
            outstr.close();
            instr.close();
            return;
        }
    }
}

这里我们用的是args来传递参数的,顺便说一个args的值从哪里来

  1. 在空白区点击右键(鼠标光标所在的地方),然后找到Run As

在这里插入图片描述

  1. 在Arugments里边写入args的参数,由空格分隔

在这里插入图片描述

运行之后就能发现文件被复制成功了

File类

File类用于创建文件,比较常用的方法由File.exits(),File.delete()

import java.io.*;
public class FileTester {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        File f = new File("hello.txt");
        if(f.exists())
            f.delete();
        else
            try {
                f.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}

如果hello.txt文件存在,就会被删除,否则就建立一个新的文件

压缩和解压缩Gzip文件

跟前面的类似,我们使用GZIPInputStreamGZIPOutputStream这两个类来实现

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class GZIPTester {

    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("Hello.txt");
        GZIPOutputStream out = new GZIPOutputStream(
                new FileOutputStream("test.gz"));
        //使用GZIPOutputStream作为输出流
        System.out.println("Writing compressing file from Hello.txt to test.gz");
        int c;
        while((c=in.read())!=-1)
            out.write(c);
        //一个一个字符的写入
        in.close();
        out.close();
    }
}

解压缩test.gz文件

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class GZIPTester {

    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("Hello.txt");
        GZIPOutputStream out = new GZIPOutputStream(
                new FileOutputStream("test.gz"));
        System.out.println("Writing compressing file from Hello.txt to test.gz");
        int c;
        while((c=in.read())!=-1)
            out.write(c);
        in.close();
        out.close();
        System.out.println("Reading file from test.gz to monitor");
        BufferedReader in2 = new BufferedReader(new InputStreamReader(
                new GZIPInputStream(new FileInputStream("test.gz"))));
        //使用GZIPInputStream来作为输入流,再使用InputSteamReader来作为面向字节到面向字符的桥梁
        String s;
        while((s=in2.readLine())!=null)
            System.out.println(s);
        //输出解压缩后的文件内容
        in2.close();

也可以通过将压缩文件的内容直接写入文件实现解压缩

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class GZIPTester {

    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("Hello.txt");
        GZIPOutputStream out = new GZIPOutputStream(
                new FileOutputStream("test.gz"));
        System.out.println("Writing compressing file from Hello.txt to test.gz");
        int c;
        while((c=in.read())!=-1)
            out.write(c);
        in.close();
        out.close();
        System.out.println("Reading file from test.gz to monitor");
        BufferedReader in2 = new BufferedReader(new InputStreamReader(
                new GZIPInputStream(new FileInputStream("test.gz"))));
        String s;
        while((s=in2.readLine())!=null)
            System.out.println(s);
        in2.close();
        System.out.println("Writing decompression to newHello.txt");
        GZIPInputStream in3 = new GZIPInputStream(
                new FileInputStream("test.gz"));
        FileOutputStream out2 = new FileOutputStream("newHello.txt");
        while((c=in3.read())!=-1)
            out2.write(c);
        //一个一个字节的写
        in3.close();
        out2.close(); 
    }
}

也可以把多个文件压缩到一个文件中去,也就是Zip文件

我们使用ZipOutputStream类来实现

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipOutputStreamTester {

    public static void main(String[] args) throws IOException {
        ZipOutputStream out = new ZipOutputStream(
                new BufferedOutputStream(
                        new FileOutputStream("test.zip")));
        //使用ZipOutputStream作为输出流
        for(int i=0; i<args.length; i++) //多个文件
        {
            System.out.println("Writing file"+args[i]);
            BufferedInputStream in = new BufferedInputStream(
                    new FileInputStream(args[i]));
            out.putNextEntry(new ZipEntry(args[i]));
            //把文件的开始标记写到压缩文件里边去
            int c;
            while((c=in.read())!=-1)
                out.write(c);
            in.close();
        }
        out.close();
    }
}

解压缩Zip文件使用ZipInputStream类来实现

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipOutputStreamTester {

    public static void main(String[] args) throws IOException {
        System.out.println("Reading file!");
        ZipInputStream in2 = new ZipInputStream(
                new BufferedInputStream(
                        new FileInputStream("test.zip")));
        //使用ZipInputStream来定义输入流
        ZipEntry ze;
        while((ze=in2.getNextEntry())!=null) //获取文件入口
        {
            System.out.println("Reading file"+ze.getName());
            int x;
            while((x=in2.read())!=-1)
                System.out.write(x);
            //将文件内容输出
            System.out.println();
        }
        in2.close();
    }
}

上面我们只是将压缩文件输出而已,我们更希望将压缩文件解压为一个一个的文件,下面我们来实现这一功能

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class Unzip {
	byte doc[] = null;
	String Filename = null;
	String UnZipPath = null;
	public Unzip(String filename, String unZipPath) //构造函数初始化文件名和压缩路径
	{
		this.Filename = filename;
		this.UnZipPath = unZipPath;
		this.setUnZipPath(this.UnZipPath);
	}
	public Unzip(String filename)
	{
		this.Filename = new String(filename);
		this.UnZipPath = null;
		this.setUnZipPath(this.UnZipPath);
	}
	private void setUnZipPath(String unZipPath)//统一在路径名后面加上\\
	 { 
		if(unZipPath.endsWith("\\"))
			this.UnZipPath=new String(unZipPath);
		else
			this.UnZipPath=new String(unZipPath+"\\");
	}
	public void doUnzip()
	{
		try
		{
			ZipInputStream zipis = new ZipInputStream(
					new FileInputStream(Filename));
			//用ZipInputStream定义输入流
			ZipEntry fEntry = null;
			//文件入口,可以参考前面的压缩文件操作
			while((fEntry=zipis.getNextEntry())!=null)//压缩包中的文件是否解压缩完
			{
				if(fEntry.isDirectory()) //如果文件是一个路径,检查该文件是否存在,不存在就新建
					checkFilePath(UnZipPath+fEntry.getName());
				else
				{
					String fname = new String(UnZipPath+fEntry.getName()); //拼接路径名
					try
					{
						FileOutputStream out = new FileOutputStream(fname);
						doc=new byte[512]; //一次性读取512个字节,加快读取效率
						int n;
						while(((n=zipis.read(doc,0,512))!=-1)) //如果文件没有512字节,那么n就是字节个数
							out.write(doc, 0, n);
						out.close();
						out=null;
						doc=null;
					}
					catch(Exception ex)
					{}
				}
			}
			zipis.close();		
		}
		catch(IOException ioe)
		{
				System.out.println(ioe);
		}
	}
	private void checkFilePath(String dirName) { //检查文件是否存在,不存在就新建
		// TODO Auto-generated method stub
		File dir = new File(dirName);
		if(!dir.exists())
			dir.mkdir();	
	}
	public static void main(String[] args) {
		String zipFile=args[0];
		String unZipPath = args[1]+"\\";
		Unzip myZip=new Unzip(zipFile,unZipPath);
		myZip.doUnzip();
	}
}

ps:如果报错文件夹拒绝访问,可以去属性那里添加用户权限,百度找一下方法

对象序列化

对象序列化就是将对象的值保存到文件中,因为一个对象在程序的存活时间不长

使用的类为ObjectInputStreamObjectOutputStream

  • 不保存对象的transientstatic类型的变量
  • 对象要实现序列化,其所属的类必须实现Serializable接口(Serializable接口只是一个标记,里边没有声明任何方法原型)

下面一个程序实现将一个对象的值存入文件,再读取出来

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SerializableTester {

    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
        // TODO Auto-generated method stub
        Book book = new Book(10032,"ComupterNetworking"); 
        //实例化一个对象,Book可以直接定义,在其他文件或同一文件下
        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("book.dat"));
        //使用ObjectOutputStream作为输出流
        oos.writeObject(book);
        oos.close();
        book = null;
        ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("book.dat"));
        //同上
        book = (Book)ois.readObject(); 
        //readObject可以得到对象的值,注意文件中保存对象的类型必须直接记录
        ois.close();
        System.out.println(book.id);
        System.out.println(book.name);
    }

}
ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("book.dat"));
        //使用ObjectOutputStream作为输出流
        oos.writeObject(book);
        oos.close();
        book = null;
        ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("book.dat"));
        //同上
        book = (Book)ois.readObject(); 
        //readObject可以得到对象的值,注意文件中保存对象的类型必须直接记录
        ois.close();
        System.out.println(book.id);
        System.out.println(book.name);
    }

}

参考

清华大学Java教程p67-p77

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础(IO输入输出流,读写文件操作,对象序列化) 的相关文章

  • 唯一索引或主键违规:“PRIMARY KEY ON PUBLIC.xxx”; SQL语句

    每当我的应用程序启动时 我都会收到以下错误消息 Caused by org h2 jdbc JdbcSQLException Unique index or primary key violation PRIMARY KEY ON PUBL
  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它

随机推荐

  • python requests cookies怎么转为_如何将requests.RequestsCookieJar转换为字符串

    新答案 好吧 所以我还是不知道你到底想达到什么目的 如果您想从requests RequestCookieJar对象中提取原始url 这样您就可以检查是否与给定的子域匹配 这是 据我所知 不可能的 不过 你也可以做些类似的事情 usr bi
  • Linux-线程的同步与互斥

    线程的同步与互斥 进程 线程间的互斥相关背景概念 互斥量 互斥量接口 互斥量的初始化 互斥量的销毁 加锁和解锁 改善抢票系统 互斥量原理 可重入与线程安全 重入和线程安全的概念 常见线程不安全情况 常见线程安全的情况 常见不可重入情况 常见
  • 【软件工程】-可行性研究报告

    GB8567 88 可行性研究报告 1引言 1 1编写目的 为了提高机房收费管理的灵活性和效率 减轻机房工作人员的工作负担 节约时间 对机房收费业务做到快速准确管理的目的 从而降低人力 经济的更各方面的消耗 本次编写主要是为了分析廊坊师范学
  • 电机速度曲线规划1:梯形速度曲线设计与实现

    电机驱动是很常见的应用 在很多系统中我们都会碰到需要改变电机的速度以实现相应的控制功能 这就涉及到电机速度曲线规划的问题 在这篇中我们就来简单讨论一下电机的梯形曲线规划的问题 1 基本原理 梯形速度曲线控制算法是工业控制领域应用最为广泛的加
  • 在vc下环境变量的设置

    Error spawning cl exe 编译出错 有人说是没有设置 include环境变量 下面介绍在vc下如何设置环境变量 1 Microsoft Visual Studio下面3个子文件夹 Common VC98 My Projec
  • 1.嵌入式控制器EC学习,编译环境搭建

    工欲善其事 必先利其器 在学习EC相关知识之前 首先需要完成EC代码编译环境的搭建 需要如下内容 Keil C51 用于EC中C代码的编译器环境 EC源代码 我们使用从网上可以下载到的 ITE V12 4 Update 版的代码为例进行学习
  • JavaBean,List,Map转成json格式

    普通JavaBean 以User为例 转成json格式 1 转成JSONArray类型 User user new User user setUsername cxl user setPassword 1234 JSONArray json
  • GORM 基础 -- Gen

    https gorm io gen github 1 GEN Guides GEN 友好和更安全的代码生成 1 1 概述 来自动态原始SQL的惯用和可重用API 100 类型安全的DAO API 不使用 interface Database
  • printf(“%d,%d\n“,i--,i++)

    sample cpp include
  • Windows 下创建定时任务执行Python脚本

    文章目录 一 环境 二 脚本 三 创建定时任务 1 打开 任务计划程序 2 打开 创建任务 窗口 3 创建任务一一常规 4 创建任务一一触发器 5 创建任务一一操作 6 创建任务一一条件 7 创建任务一一设置 8 完成任务创建 四 验证定时
  • 记录自己在结构光三维重建领域的学习过程(一)

    仿真数据集与真是数据集之间差异较大 二者的网络均不可完美预测另一种数据 寻找解决办法 首先确定是不是数据的问题 阅读论文 Light field structured light projection data generation wit
  • 关于存储过程中SQL语句IN条件传参注意说

    背景说明 在数据库操作中我们经常会用到查询语句 在一些情况下 需要使用到IN条件 正常的查询中IN需要注意的是最好in中的参数不能超过1000个 超过1000的时候oracle会抛出异常 这个如何处理先不提 这次要说的是 如果在存储过程中使
  • 某单位分配到一个地址块 136.23.12.64/26。现在需要进一步划分为4个一样大的子网。试问:

    1 每个子网的网络前缀有多长 2 每个子网中有多少个地址 3 每个子网的地址块是什么 4 每一个子网可分配给主机使用的最小地址和最大地址是什么 姐
  • JS中的邮箱验证

    通过js在前端对用户输入进行校验 即可以产生较好的交互体验 也可以减轻后台的压力 邮箱的基本格式要求 1 只能以单词字符开头 即a z A Z 0 9 2 只能有一个 3 后面有一个到多个点 并且点不能在最后 4 特殊字符不能开头和结尾 使
  • 数据存储,详细讲解

    数据存储 详细讲解 数据类型的介绍 整形的内存存储 大小端介绍 浮点数的存储 数据类型的介绍 1 内置类型 char 字符数据类型 1 short 短整型 2 int 整形 4 long 长整型 4 8 long long 更长的整形 8
  • matlab之数组反序输出

    a 1 2 3 4 5 a end 1 1 5 4 3 2 1 转载于 https www cnblogs com yibeimingyue p 11201805 html
  • 高阶数据结构之并查集

    文章目录 并查集 并查集的常规实现 并查集的简化实现 算法题 模板 朴素的并查集 维护size的并查集 维护到祖宗节点的并查集 并查集 在某些应用问题中 需要将n个不同的元素划分成一些不想交的集合 开始时 每个元素自成一个单元集合 然后按照
  • 一文搞懂状态模式

    原理 状态机有三个组成部分 状态 事件 动作 遇到不同的事件会触发状态的转移和动作的执行 不过动作不是必须的 可能只有状态的转移 没有动作的执行 状态模式的目的就是实现状态机 案例带入 比如 超级马里奥 在游戏中 马里奥可以变身为多种形态
  • 抖音究竟对线下生意有没有价值?

    戳上方增长黑盒Growthbox点亮星标 深度研究不错过 主笔 邹小困 研究员 彬超 Emma 出品 增长黑盒研究组 01 防火防盗防抖音 互联网世界的后起之秀字节跳动 如同进击的巨人 在短短几年内就已将业务的触角伸向各个领域 图为chat
  • Java基础(IO输入输出流,读写文件操作,对象序列化)

    IO 输入输出流基本概念 输入流 信息从程序空间之外的地方流入程序空间里面 输出流 信息从程序空间里面流到程序空间之外的地方 输入输出流的分类 从流的方法划分 输入流 输入流 从流的分工划分 节点流 访问文件进行输入输出操作的流 处理流 在