我们使用 $stdin.gets 来让用户进行输入操作。实例:a = $stdin.gets p a # 键盘输入1#---- 输出结果 ----1"1\n"当然我们也可以省略 $stdin,只使用 gets。
TextView 的功能只是作为信息输出展示给用户,而 EditText 除了可以展示信息之外,还需要从用户那里得到输入的内容,我们可以通过getText().toString()获取到 EditText 的输入信息。修改一下布局文件,添加一个 button 来触发获取的时机:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="20dp"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="确定" /> <EditText android:id="@+id/input_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:layout_toLeftOf="@id/button" android:hint="请输入密码" android:imeOptions="actionDone" android:inputType="textPassword" android:maxLines="5" android:textSize="20sp" /></RelativeLayout>我们在第一个示例代码基础之上,加了一个 Button,并放在了一个 RelativeLayout 中(大家可以思考一下这里为什么要用 RelativeLayout,如果用 LinearLayout 能实现吗?),我们希望用 Button 作为获取 EditText 内容的触发事件,当点击 Button 的时候,我们获取用户在 EditText 中输入的内容,并打印到屏幕上验证结果。相关 Java 代码如下:final EditText editText = findViewById(R.id.input_password); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, editText.getText(), Toast.LENGTH_SHORT).show(); } });首先我们根据 ID 拿到 EditText 和 Button 的实例,接着对 Button 设置一个监听器(关于 Button 监听器的使用,如果不清楚可以参考后续 Button 章节,不是本节重点),在监听器中我们获取 EditText 的内容,并通过 Toast 打印到屏幕,效果如下:扩展:其实getText()不是 EditText 特有的,TextView 也可以通过getText()拿到显示的内容,只不过 TextView 的内容是由我们设置上去的,所以需要去获取的场景比较少,用的也相对少。
输入方向为数据从那流入程序,输入重定向即改变默认的系统键盘输入,改变其从其他对方流入程序。2.2.1 <command <file,将 file 文件中的内容作为 command 的输入。格式: [n]< word 注意 [n] 与 < 之间没有空格,其中将文件描述符 n 重定向到 word 指代的文件(以只读方式打开), 如果不显示指明 n,默认就为 0,标准输入,例如:[root@xuel-terraform-cvm-0 ~]# cat testfile.txttest content[root@xuel-terraform-cvm-0 ~]# cat 0< testfile.txttest content[root@xuel-terraform-cvm-0 ~]# cat < testfile.txttest content我们可以看到 testfile.txt 文件内容为 test content,在输入重定向时,我们将文件描述符 0 重定向到 testfile.txt,所以利用命令 cat 查看,结果就为文件的内容,默认就是标准输入,所以可以不写 0。[root@xuel-terraform-cvm-0 ~]# 0< testfile.txt cattest content[root@xuel-terraform-cvm-0 ~]# < testfile.txt cattest content解析器解析到 “<” 以后会先处理重定向,将标准输入重定向到 file,之后 cat 再从标准输入读取指令的时候,由于标准输入已经重定向到了 file ,于是 cat 就从 file 中读取指令了。2.2.2 <<EOFcommand <<END,从标准输入(键盘)中读取数据,直到遇见分界符 END 才停止,分界符可以是自定义的任意字符,在此建议使用 EOF。该输入重定向可以很方便用于批量文件的输入,可以用此来创建文件,例如:[root@xuel-terraform-cvm-0 ~]# cat > file1.txt <<EOF> hello shell> hello go> test file> EOF[root@xuel-terraform-cvm-0 ~]# cat file1.txthello shellhello gotest file在此利用了将 cat 的输出重定向到文件 file1.txt 中,之后利用 <<EOF 来从标准输入中读取数据,直到遇到结束标示 EOF 停止。例如我们在学习流程控制中的 while 循环读取文件就利用了输入重定向,例如:[root@xuel-terraform-cvm-0 ~]# cat while.sh#!/bin/bashFILE=file1.txtwhile read str; do echo $strdone <$FILE[root@xuel-terraform-cvm-0 ~]# bash while.shhello shellhello gotest file在此将文件绑定到输入重定向上,利用 while 来逐行读取文件中的内容。
在 HTML 中, input 标签表示输入框,而输入框有很多类型,比如普通文本输入框、密码框、邮箱框(只能输入邮箱格式的内容)、网址框(只能输入框网址格式的内容)、数字框(只能输入数字)、单选框、多选框等。我们可以改变 input 标签的 type 属性来显示不同的输入框类型。
本小节将会介绍基本输入输出的 Java 标准类,通过本小节的学习,你将了解到什么是输入和输入,什么是流;输入输出流的应用场景,File类的使用,什么是文件,Java 提供的输入输出流相关 API 等内容。
java.util包下的Scanner类可用于获取用户从键盘输入的内容,我们在Java Scanner 类这一小节已经介绍过具体使用,实例如下:import java.util.Scanner;/** * @author colorful@TaleLin */public class ScannerDemo { public static void main(String[] args) { // 创建扫描器对象 Scanner scanner = new Scanner(System.in); System.out.println("请输入您的姓名:"); // 可以将用户输入的内容扫描为字符串 String name = scanner.nextLine(); // 打印输出 System.out.println("你好 ".concat(name).concat(" ,欢迎来到慕课网!")); // 关闭扫描器 scanner.close(); }}运行结果:请输入您的姓名:Colorful你好 Colorful ,欢迎来到慕课网!
Python 提供了 input 语句用于读取键盘输入,input 语句读取用户输入的一行文本。>>> line = input()hello world>>> line'hello world'在第 1 行,使用 input 语句读取用户输入的一行文本,将该文本保存到变量 line 中。在第 2 行,用户输入一行文本 ‘hello world’。在第 3 行,查看变量 line。在第 4 行,显示结果为文本 ‘hello world’可以在 input 语句中加入参数,该参数作为用户输入的提示符,例如:>>> number = input('Please input a number: ')Please input a number: 123>>> number'123'在第 1 行,使用 input 语句读取用户输入的一行文本,将该文本保存到变量 number 中。input 语句带有一个参数 'Please input a number: '。在第 2 行,input 语句首先输出 input 语句的参数 'Please input a number: ',这样用户就根据该提示输入数字,然后 input 语句再读取用户输入的一行文本 123。
上面我们已经了解了输入输出流的基本概念,那么它具体是做什么用的呢?在web产品的开发中,最常开发的功能就是上传文件到服务器了,这个文件的读写过程就要用到输入输出流。对于计算机中文件的读写、复制和删除等操作也都要用到输入输出流。输入输出流可以说是无处不在,下面我们将会介绍 Java 中输入输出流相关的 API。
C 语言中的标准输入输出包含 3 部分。标准输入,标准输出,标准错误输出。表中列举了标准输入输出和与之关联的物理设备。输入输出设备标准输入键盘标准输出显示器屏幕标准错误输出显示器屏幕标准错误输出就是当你程序出错的时候在屏幕上看到的信息。
新建的私人仓库,是只有你一个人有权限看到并提交代码的,现在,我们要邀请别人加入,让他们也有权限提交代码等。进入到设置页面中的权限管理模块,然后点击 “Invite a collaborator” 按钮,输入对方的邮箱或者用户名:注意,在你发送邀请后,对方会收到你的邀请邮件,对方需要登录邮箱并点击同意加入的链接,这样才会成功加入:当然,后续你想删除该合作者的时候,也可以通过列表上面的删除按钮来删除。
核心功能非常强大,也是编辑器的一大亮点,熟悉了之后将会事半功倍一些核心功能:GoTo Anything:顾名思义就是去任何一个文件,还可以跳转到指定行数,单词等,只要你想就可以做到;GoTo Definition:同理就是定位到事先定义的某个函数,类,方法,谁用谁知道;Multiple Selections:意思是多重选择,在你需要一次性修改多处一样的变量的时候,你就知道这个功能的强大;Command Palette:这个就是命令面板,里面是一些使用频率不高的操作或者快速搜索某个操作;Powerful Api And Package Ecosystem:Sublime 编辑器的火爆离不开强大的生态圈和 api,比如代码高亮,代码补全,编辑 markdown 等等;……由于篇幅限制,我们仅演示 Goto Anything 功能,GoTo > Goto Anything,或者快捷键 Ctrl + P,然后模糊搜索即可,如下图:
输入框是我们网页中常见的元素,登录、注册、个人资料、收货地址等都需要用到输入框。而在 HTML 中,输入框的类型和属性都有很多,我们可以根据实际需求来决定使用哪一类输入框。
刚刚通过三个注解都可以完成了 bean 的实例化注入,通过测试代码也获取到了容器中的三个对象实例,那么这里不知道大家是否发现一个问题:我们知道,Spring 这个容器本质是个 map 集合来存储实例化后的对象。既然是个 map 集合,就应该对应的有 key 和 value。我们都知道 value 肯定是实例化后的 bean ,那么 key 是什么呢?注入规则:1. 四种注解都支持 value 的属性作为自定义的 bean id ;2. 如果 value 属性没有指定,那么默认以类的简单名称(类名首字母小写)作为 bean 对象的 id。所以我们可以看到:当我们只使用注解没有自定义 id 的时候可以通过,每个类的首字母小写来获取对象实例,那么如果有了自定义的 id,上述代码是否继续可用呢?自定义 id 获取实例:改造类上面的注解,设置自定的 id,更改的注解如下:@Controll("uc")@Service("us")@Repository("ud")测试结果:测试结果:为了区分测试结果,我在测试代码中,只修改了 controller 的获取方式,将 id 改成了 uc 。service 和 dao 并没有修改。从控制台打印可以看到,只有 controller 对象可以成功获取,service 和 dao 都失败了,因为我们已经使用了自定义的 id,所以容器中没有默认的以类名作为 id 的 bean 对象实例。
Iframe 是什么?Iframe 的学名叫内联框架,在之前的章节中提到过这个,但是没有说太多。今天我们就稍微仔细地看看这个东西。你可以想象网页中有的时候需要嵌套小的网页,或者内部模块。这个时候,现有的 HTML 标签似乎仅仅能够构建一个依赖于当前文档的元素结构。这个时候,我们可怜的小伙伴就不得不向新的标签来求助了。那么 IFrame 正是解决了这个问题。在 Iframe 标签中,你可以嵌套多种多样的其他的我们之前学习过的网页元素。 在这里要提醒大家 Iframe 标签同样是一个成对出现的标签。下面就请大家跟随老师的步骤一起看一看如何利用 Dreamweaver CC2018 在网页中插入 Iframe 标签吧。首先,我们还是新建一个空白的 HTML 页面。第二步我们还是找到我们熟悉的插入面板,在里面寻找我们今天的主角,Iframe。然后我们就可以看到像下图所示的过程一样,你的空白网页里插入了一个 Iframe 元素。同时,在下方的代码视图里你也看到了成对出现的 IFrame 标签。到此,我们利用 Dreamweaver CC 2018 设置网页中的 Iframe 就算成功的实施了。
链表的优点是大小可变,插入和删除的效率很高,缺点是只能通过顺序指针访问,查询的效率较低。无图无真相,我们结合图片看一下他们分别是如何获取指定元素的。先来看下基于数组的 ArrayList:再来看下基于链表的 LinkedList:对比基于数组的 ArrayList 和基于链表的 LinkedList 的 get (index i) 方法的实现就会发现,链表需要遍历才能返回想要的元素,所以效率才比较低下。知道了链表的这些特性,我们今后在使用这一数据结构的时候就知道如何让它在合适的时候发挥它的最大优势咯。
命名管道(Named Pipe)实际上就是先进先出队列(First In First Out,简称 FIFO),候选人需要区分命名管道和管道,两者最大的区别在于管道只能在具有亲缘关系的两个进程之间通信,例如父子进程之间或者兄弟进程之间,命名管道则可以在任何两个进程之间通信,更加零活。命名管道的读写操作如图所示,用户进程 A 是写入进程,写入的消息是 1 2 3 4 5,因为遵循先进先出的原则,用户进程 B 读出的消息顺序也是 1 2 3 4 5。
输入就是将程序外部的数据输入到程序内部,输出就是将程序内部运行的结果等内容从程序内部输出到显示器,打印机或者存放到文件中。编程语言中的输入输出担负着程序与用户的交互工作。
密码框可谓表单填写中一个不可缺少的输入框。它和普通文本输入框最大的区别就是用它输入的键盘文字在屏幕上会隐藏显示,正如它的名字一样,密码,隐秘的编码。是不能让人看到的。因此,密码框的使用在 web 网页中是十分常见并且普遍的。首先,我们先打开 DW,创建一个空白的 HTML 文档,然后新建一个表单。建立好空白表单后,我们再点击右侧面板的密码,可以看到图中出现了一个 password 和一个带有输入功能的输入框,我们在输入框中尝试输入文字,可以看到输入的文字都被加密成为了*这种星形符号。以上就是表单中密码框的设置方法。有木有很简单?其实 Dreamweaver CC 2018 中的很多操作都可以抽象为一个操作模式,重点在于理解各种元素在网页设计和交互中的作用。然后才是学习工具的使用。而 Adobe Dreamweaver CC 2018 只是给我们网页设计便利化搭建了一个充分的平台,要想利用好,还得理论和实践相结合的去操作。
Http 的整个报文信息,从客户端到服务端到都是明文传输到。信息从我们的电脑发出去,中间需要经历哪些设备才能被另一台电脑接收,我们是不好确定也很难评估的。有可能跨越多个运营商机房,有可能通过海底光缆横跨大洋,有可能穿过 某某学校 / 某某厂房 / 某某集团 的内部 路由器/ 交换机 / 集线器 等。中间这么多节点我们都是控制不到的,所以只要别人有心,我们就很难保证我们的信息不被泄漏。
循环语句解决的就是大量重复的工作,如果没有循环语句,当你想计算从 1 加到 1000 的时候,要么使用高斯公式,也就是 (1+1000)∗1000/2(1+1000)*1000/2(1+1000)∗1000/2,要么就是逐个数字的相加。逐个数字相加是我们想到的解决问题的最原始的方式,也是最自然的方式。但是要是逐个相加那么这里面的工作量与相应算错的风险是我们要考虑的。但是有了循环语句,那么,我们可以很方便的通过循环语句来解决上面的问题。如果要是上面的问题换位了相乘是不是会更让人棘手。如果不是数值的计算,在你需要显示一千遍别人姓名的时候,你怎么办?你是在电脑中手写一千遍输出语句吗?或者采用更高级一点的复制粘贴吗?其实这时候,循环语句就可以解决这个问题。只要在让这个输出语句重复执行一千遍就可以了。实现这一功能的代码,可能只需要两三行,而不是之前需要复制一千行出来。这也极大的提高你的生产效率。当然循环还可以循环的调用一段特定的程序来处理相关的事件。我们常用的操作系统,其实可以理解为是一个处于无休止循环语句中程序。操作系统会无休止的循环,检查我们的鼠标是不是在移动,我们的键盘是不是有输入,我们的显示器是不是需要输出,我们的音响是不是要发声等等事件。然后调用相应的程序来处理。
我们都知道静态函数内部是不包含状态的,也就是所谓的纯函数,它的输入仅仅来自于它的参数列表,而它的输出也仅仅依赖于它参数列表。设想一下这样开发情景,有时候我们并不想利用实例对象来调用函数,所以我们一般会往静态函数容器类中添加静态函数,如此反复,这样无疑是让这个类容器膨胀。而在 Kotlin 中则认为一个函数或方法有时候并不是属于任何一个类,它可以独立存在。所以在 Kotlin中类似静态函数和静态属性会去掉外层类的容器,一个函数或者属性可以直接定义在一个 Kotlin 文件的顶层中,在使用的地方只需要 import 这个函数或属性即可。
INSERT INTO `course`(`id`, `name`, `teacher`, `start_time`, `end_time`) VALUES (00000000001, 'vue源码', '陈小小', '2020-03-15', '2020-03-31');这条数据是初始化数据,主要是让我们能够一开始就在页面的表格上看到数据而已。不插入也可以。只是查询结果就是空。如果你使用了可视化数据库管理工具,比如 Navicat,那么此时,你会看到这样一个表格:
第二天,小王又在访问数据库了,他查看了 imooc_user 表中 id 为 1 的用户,如下:SELECT * FROM imooc_user WHERE id = 1;小王看到的结果是这样的:+----+----------+-----+| id | username | age |+----+----------+-----+| 1 | peter | 18 |+----+----------+-----+此时,小李也来访问数据库,他开启了一个事务,并且修改了 id 为 1 的用户,如下:BEGIN;UPDATE imooc_user SET age = 100 WHERE id = 1;这个时候,小王又查看了一次 id 为 1 的用户。SELECT * FROM imooc_user WHERE id = 1;但是他看到的结果却是这样的:+----+----------+-----+| id | username | age |+----+----------+-----+| 1 | peter | 100 |+----+----------+-----+小王发现自己两次查询的数据不一样,可是小李的事务还未提交。像小王这样,两次查询结果不同的情况,我们称之为不可重复读。流程图如下:
对于某一条记录(某一行),SQL 提交如下方式来加读锁:SELECT * FROM [table_name] WHERE [condition] LOCK IN SHARE MODE;其中table_name表示数据表名称,condition表示过滤条件。如果你要独占这一行的数据,可以这样加上写锁:SELECT * FROM [table_name] WHERE [condition] FOR UPDATE;注意: 在测试时,你必须在一个事务里面进行行锁,否则查询直接退回,锁的时间极短。请书写 SQL 语句,锁住 imooc_user 表中用户pedro,只允许别人读,不允许别人写。分析:pedro 用户是表中的一条记录,因此通过 SELECT … LOCK … 的方式加上行读锁,为了方便测试我们以一个事务的方式来操作锁。语句:整理可得语句如下:BEGIN;SELECT * FROM imooc_user WHERE id = 1 LOCK IN SHARE MODE;锁住该行后,其他用户可以读取它却不能修改它,直到释放锁才能修改,如下:COMMIT;有时候,我们也需要更加霸道地锁住 pedro,即不让人写,也不让人读,这个时候就可以使用写锁。BEGIN;SELECT * FROM imooc_user WHERE id = 1 FOR UPDATE;操作完毕后,我们一定记得提交事务以释放锁。COMMIT;
Linux Shell 重定向分为两种,顾名思义,输入重定向即改变标准的默认系统键盘输入,输出重定向即改变默认的系统显示器输出。
接下来我们讲解一下 HTML 中超链接的引入方式,在 W3C 定义的 Web 标准中,超链接是以 anchor 锚标签也就是<a href="...."></a>引入到 HTML 网页中的。首先,我们打开 Dreamweaver 主界面,在菜单栏中选择文件,新建 HTML 页面。在新建的 HTML 中,点击屏幕上方的代码,切换到代码模式下,我们可以看到目前空白 HTML 模版中所有的 HTML 的代码。如下图所示。从上面的图片我们可以看到,左侧红框框出的部分就是网页的“正文”部分,也叫网页的内容部分。从HTML 这中标记语言的语法角度讲,就是一对 body 标签<body> </body>之间。接下来,我们在 body 标签内输入一个 <,可以看到,Dreamweaver CC 2018 会弹出一个提示框,如下图所示:在这个弹出框中,我们可以看到下面有一个 HTMLAnchorElement,这是 Dreamweaver CC 2018 的智能化编辑器在猜想我们可能是要输入一个 HTML 锚元素(HTMLAnchorElement),我们敲下回车,一个完成的元素标签 a 标签就被输入在 body 标签中了,可以说是非常的智能了。时至今日,程序开发界备受喜爱的几款主流代码编辑器,均已经良好支持代码提示,语法深色等智能化功能,旨在提升程序员的开发效率。也让代码维护起来更加容易。同学们要考虑到一种情况,你设计的网页今后可能是由他人来维护的,毕竟从严格逻辑意义上讲,我们设计代码并不是一个人与代码绑定的过程,网页源文件作为知识经济的产物,它可能在不同人之间来回传递。因此,选择一款好的代码编辑器也是同学们今后要面临的诸多选择的一种。不过现阶段,由于 Dreamweaver CC 2018 已经足够完美,大家只需要用这一款软件就可以享受到最前沿的软件开发体验。
在学习自然数学的时候,所有的加法减法等操作都是针对数字的,数字加上操作符让他们有了意义。在学习语文课的时候,不同的词语可以组合成句子,主谓宾语法与词语相互结合赋予了句子意义。在 JavaScript 中也是如此,配合数据类型才能知道怎么对数据进行操作。上一小节有提到的字符串与数字就是如此。如 3 + 4,JavaScript碰到两边都是数字,就会做对应的加法操作。程序需要不同类型的数据表示不同的内容,分别做对应的处理。
通过openFileInput()可以读取我们刚刚创建的文件,和FileOutputStream方法类似,该方法返回一个输入流,接着我们可以从输入流里读取数据,代码示例如下:FileInputStream in = openFileInput(file);int c;String temp="";// 挨个读取字符while( (c = in.read()) != -1){ temp = temp + Character.toString((char)c);}// temp就是从文件中读取的内容in.close();
越来越多的用于科学计算与分析的包以 Numpy 作为底层数据结构基础,并且支持 Python 序列(如 list)作为输入。例如上面提到的 Scikit-learn、Pandas,他们在进行数据处理之前会默认将输入转化为 Numpy 数组。但是为了更有效地使用这些工具,只知道如何使用是不够的,还需要知道 Numpy 数组是如何工作的。因此对于每一位从事科学计算、分析、数据处理相关工作的人,都需要学习并了解Numpy。
Rest(Representational State Transfer),从词面上来解析是 表述性状态转移。我们知道 URI 是一种标识,这个标识不管是地址还是昵称,他都只是一个名词(URL 上面最好不要用动词),API 接口是有 增删改查 一系列动作,将 URL 与行为状态的结合就是 Restful 的核心思想。一个 API 请求我们既要知道它要操作的是哪个资源,也要知道它要对这个资源进行什么操作。