JAVA基础知识之NIO——Buffer.Channel,Charset,Channel文件锁
NIO机制
NIO即NEW IO的意思,是JDK1.4提供的针对旧IO体系进行改进之后的IO,新增了许多新类,放在java.nio包下,并对java.io下许多类进行了修改,以便使用与nio.
在java.io中,无论上层通过什么方式访问数据,在底层都是通过字节的方式来读取,
即使是BufferedReader也一样,虽然是先集中将OS中的数据读取到buffer中,再由上层应用从buffer中读取,或者是上层先将数据写入buffe中,再批量写入OS中去,
buffer机制只是减少了IO的切换次数,但是访问数据的方式并没有变化,在OS底层依然是一个字节一个字节地操作。
而在NIO中则出现了全新的访问数据的方式,NIO引入了Buffer和Channel的概念,可以通过Channel将OS中一块或者全部数据直接映射成Buffer,应用程序则从Buffer中读取数据,
NIO这种类似虚拟内存映射的机制不仅仅是减少了与OS的IO切换次数,而且真正减少了直接读取OS的次数,因此NIO在性能上比传统IO要高得多。
也就是说传统的IO读取的是数据流,而NIO读取的是数据块。
Buffer
Buffer的作用就是用来装载数据,然后输出数据,其内部类似于一个数组,但是又不是完全相同。
针对不同的功能/数据类型,有不同的Buffer,ByteBuffer, CharBuffer, ShortBuffer, IntBuffer等等。ByteBuffer和CharBuffer是最常用的Buffer.
Buffer是一个抽象类,要得到一个Buffer对象,需要用具体的Buffer子类的allocate(int i)方法。
Buffer的内部结构类似一个数组,因此也提供了一些类似数组的属性,
capacity表示Buffer的容量;
limit表示界限,用来表示读取数据时的最大的下标。
position则类似一个游标,随着读和写而变化。
mark是一个标志位,相当于一个绝对坐标,position可以直接定位到mark位置。
Buffer的工作过程:
- 写Buffer
初始状态的Buffer的position位置为0,limit等于capacity, 当put进数据到Buffer的时候,position会随之后移,
当所有数据装载完毕之后,调用Buffer的flip()方法,会将limit设置为position位置,position则置0,
这就做好了读的准备,此时position就充当数组下标的角色,而limit就是数组的上限,最多只能读到这里。
- 读Buffer
当Buffer输出数据结束后,此时的position应该已经读到了limit位置,调用Buffer的clear()方法,会将position再次置0,同时会将limit置为capacity,
这又恢复了Buffer写数据前的状态,相当于重置了Buffer,为下一次写进Buffer做好了准备。但注意的是,clear()这个过程并没有清空Buffer中的数据。
下面演示Buffer的使用,
package nio; import java.nio.CharBuffer; public class BufferTest {
public static void main(String[] args) {
//创建Buffer
CharBuffer buff = CharBuffer.allocate(8);
System.out.println("capacity: "+buff.capacity());
System.out.println("limit: "+buff.limit());
System.out.println("position: "+buff.position());
//放入元素
buff.put('a');
buff.put('b');
buff.put('c');
System.out.println("放入3个元素后,position: "+buff.position());
buff.flip();
System.out.println("执行flip()后,limit: "+buff.limit()+", position: "+buff.position());
//取出第一个元素
System.out.println("第一个元素(position=0): "+buff.get());
System.out.println("取出第一个元素后,position:" +buff.position());
buff.clear();
System.out.println("执行clear()后,limit: "+buff.limit()+" ,position: "+buff.position());
System.out.println("执行clear()后,buffer并没有被清除。第三个元素为: "+buff.get(2));
System.out.println("执行绝对读取后, position: "+buff.position());
}
}
注意从Buffer中读数据的时候,有两种方式,一种是读相对读取,即从当前position位置读取,读完之后,position会随之后移。另一种是绝对位置读取,直接读取具体位置的数据,position不会改变。
下面是执行结果,
capacity: 8
limit: 8
position: 0
放入3个元素后,position: 3
执行flip()后,limit: 3, position: 0
第一个元素(position=0): a
取出第一个元素后,position:1
执行clear()后,limit: 8 ,position: 0
执行clear()后,buffer并没有被清除。第三个元素为: c
执行绝对读取后, position: 0
从上面程序看出,比起普通的数组,Buffer更智能一点,读取数据的时候不需要关心Buffer中有多少数据,读取到limit位置即可,不会出现越界问题。
(PS:上面是书上说的,我本人并没有看出单纯使用Buffer能比单纯使用数组强大到哪去,倒是麻烦了不少,Buffer只有在结合Channel使用的时候才有用吧)
Channel
NIO中真正有革命性改动的应该是引入了Channel机制,Channel可以将文件的部分或全部映射成Buffer进行读取,直接减少了读取文件的次数。
不过Channel的映射文件机制需要借助Buffer,Channel需要将文件映射成Buffer,应用程序再从Buffer中读取数据,就相当于从文件中读数据,或者应用程序将数据写入Buffer,就相当于写入文件,
这不过这个过程相对底层OS来说,是一块一块进行的,而不是一个字节一个字节进行的。
Channle也不是直接创建,而是由传统io中的流对象的getChannel()返回的。
不同功能的流对象返回不同的changnel(),例如FileInputStream(),FileOutputstream()返回的是FileChannel, 而PipeInputStream返回的是PipeChannel.
下面演示Channel的用法,
package nio; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder; public class FileChannelTest {
public static void fileChannel() {
File f = new File("tmp.txt");
try (
//FileInputStream获取的channel只能读
FileChannel inChannel = new FileInputStream(f).getChannel();
//FileOutputStream获取的channel只能写
FileChannel outChannel = new FileOutputStream("a.txt").getChannel()
) {
//将整个文件映射成buffer
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, f.length());
Charset charset = Charset.forName("GBK");
//输出buffer里的全部数据,就直接写入了a.txt
outChannel.write(buffer);
//复位buffer的limit和position
buffer.clear();
//解码器
CharsetDecoder decoder = charset.newDecoder();
//用解码器将ByteBuffer解码成CharBuffer
CharBuffer charBuffer = decoder.decode(buffer);
//charBuffer的toString()方法可以获取对应的字符串
System.out.println(charBuffer);
} catch (IOException e) {
e.printStackTrace();
}
} public static void randomFileChannel() throws FileNotFoundException, IOException {
File f = new File("a.txt");
try (
RandomAccessFile raf = new RandomAccessFile(f, "rw");
//random Channel的读写模式取决于RandomAccessFile的打开模式
FileChannel randomChannel = raf.getChannel()
) {
ByteBuffer buffer = randomChannel.map(FileChannel.MapMode.READ_ONLY, 0, f.length());
//把channel的指针移动到最后,程序就可以让ByteBuffer的数据追加到文件后面
randomChannel.position(f.length());
//写入buffer,就直接写入了文件
randomChannel.write(buffer);
buffer.clear();
Charset charset = Charset.forName("GBK");
//解码器
CharsetDecoder decoder = charset.newDecoder();
//用解码器将ByteBuffer解码成CharBuffer
CharBuffer charBuffer = decoder.decode(buffer);
//charBuffer的toString()方法可以获取对应的字符串
System.out.println(charBuffer);
}
}
public static void main(String[] args) throws FileNotFoundException, IOException {
//fileChannel();
randomFileChannel();
}
}
在RandomAccessFile中也包含了一个getChannel()方法返回FileChannel,但是它的读写属性则是取决于RandomAccessFile的打开方式,如上面的randomFileChannel()所示。
字符集和Charset简介
字符集
所谓字符集,就是对每个字符进行编号,所有编号的集合就是一种字符集,例如对汉字‘刚’的十进制编码是65,但是计算机存储的是二进制,65的二进制是01000001,这样就实现了字符到二进制的映射关系,这个过程也叫编码。
目前存在很多种字符集,java默认使用Unicode字符集,使用两个字节来表示一个字符。但很多操作系统使用的其他字符集,如果直接与java读写数据,就会乱码。
因此java.nio中,提供了一个Charset类,实现字节与字符之间的互相转换。
通过Charset我们可以查看平台支持什么字符集,
public static void charsetTest() {
SortedMap<String,Charset> map = Charset.availableCharsets();
for (String key : map.keySet()) {
System.out.println(key+" : "+map.get(key));
}
}
我的电脑上会输出以下字符集,
Big5 : Big5
Big5-HKSCS : Big5-HKSCS
CESU-8 : CESU-8
EUC-JP : EUC-JP
EUC-KR : EUC-KR
GB18030 : GB18030
GB2312 : GB2312
GBK : GBK
hp-roman8 : hp-roman8
IBM-Thai : IBM-Thai
IBM00858 : IBM00858
IBM00924 : IBM00924
IBM01140 : IBM01140
IBM01141 : IBM01141
IBM01142 : IBM01142
IBM01143 : IBM01143
IBM01144 : IBM01144
IBM01145 : IBM01145
IBM01146 : IBM01146
IBM01147 : IBM01147
IBM01148 : IBM01148
IBM01149 : IBM01149
IBM037 : IBM037
IBM1026 : IBM1026
IBM1047 : IBM1047
IBM1047_LF : IBM1047_LF
IBM1141_LF : IBM1141_LF
IBM1153 : IBM1153
IBM273 : IBM273
IBM277 : IBM277
IBM278 : IBM278
IBM280 : IBM280
IBM284 : IBM284
IBM285 : IBM285
IBM290 : IBM290
IBM297 : IBM297
IBM420 : IBM420
IBM424 : IBM424
IBM437 : IBM437
IBM500 : IBM500
IBM775 : IBM775
IBM850 : IBM850
IBM852 : IBM852
IBM855 : IBM855
IBM857 : IBM857
IBM860 : IBM860
IBM861 : IBM861
IBM862 : IBM862
IBM863 : IBM863
IBM864 : IBM864
IBM865 : IBM865
IBM866 : IBM866
IBM868 : IBM868
IBM869 : IBM869
IBM870 : IBM870
IBM871 : IBM871
IBM918 : IBM918
IBM924_LF : IBM924_LF
ISO-2022-CN : ISO-2022-CN
ISO-2022-JP : ISO-2022-JP
ISO-2022-JP-2 : ISO-2022-JP-2
ISO-2022-KR : ISO-2022-KR
ISO-8859-1 : ISO-8859-1
ISO-8859-10 : ISO-8859-10
ISO-8859-13 : ISO-8859-13
ISO-8859-14 : ISO-8859-14
ISO-8859-15 : ISO-8859-15
ISO-8859-16 : ISO-8859-16
ISO-8859-2 : ISO-8859-2
ISO-8859-3 : ISO-8859-3
ISO-8859-4 : ISO-8859-4
ISO-8859-5 : ISO-8859-5
ISO-8859-6 : ISO-8859-6
ISO-8859-7 : ISO-8859-7
ISO-8859-8 : ISO-8859-8
ISO-8859-9 : ISO-8859-9
JIS_X0201 : JIS_X0201
JIS_X0212-1990 : JIS_X0212-1990
KOI8-R : KOI8-R
KOI8-U : KOI8-U
PTCP154 : PTCP154
RK1048 : RK1048
Shift_JIS : Shift_JIS
TIS-620 : TIS-620
US-ASCII : US-ASCII
UTF-16 : UTF-16
UTF-16BE : UTF-16BE
UTF-16LE : UTF-16LE
UTF-32 : UTF-32
UTF-32BE : UTF-32BE
UTF-32LE : UTF-32LE
UTF-8 : UTF-8
windows-1250 : windows-1250
windows-1251 : windows-1251
windows-1252 : windows-1252
windows-1253 : windows-1253
windows-1254 : windows-1254
windows-1255 : windows-1255
windows-1256 : windows-1256
windows-1257 : windows-1257
windows-1258 : windows-1258
windows-31j : windows-31j
x-Big5-HKSCS-2001 : x-Big5-HKSCS-2001
x-Big5-Solaris : x-Big5-Solaris
x-compound-text : x-compound-text
x-EUC-TW : x-EUC-TW
x-EUC_CN : x-EUC_CN
x-EUC_JP_LINUX : x-EUC_JP_LINUX
x-eucJP-Open : x-eucJP-Open
x-IBM-udcJP : x-IBM-udcJP
x-IBM1006 : x-IBM1006
x-IBM1025 : x-IBM1025
x-IBM1027 : x-IBM1027
x-IBM1041 : x-IBM1041
x-IBM1043 : x-IBM1043
x-IBM1046 : x-IBM1046
x-IBM1046S : x-IBM1046S
x-IBM1088 : x-IBM1088
x-IBM1097 : x-IBM1097
x-IBM1098 : x-IBM1098
x-IBM1112 : x-IBM1112
x-IBM1114 : x-IBM1114
x-IBM1115 : x-IBM1115
x-IBM1122 : x-IBM1122
x-IBM1123 : x-IBM1123
x-IBM1124 : x-IBM1124
x-IBM1130 : x-IBM1130
x-IBM1164 : x-IBM1164
x-IBM1165 : x-IBM1165
x-IBM1166 : x-IBM1166
x-IBM1351 : x-IBM1351
x-IBM1362 : x-IBM1362
x-IBM1363 : x-IBM1363
x-IBM1363C : x-IBM1363C
x-IBM1364 : x-IBM1364
x-IBM1370 : x-IBM1370
x-IBM1371 : x-IBM1371
x-IBM1377 : x-IBM1377
x-IBM1379 : x-IBM1379
x-IBM1380 : x-IBM1380
x-IBM1381 : x-IBM1381
x-IBM1382 : x-IBM1382
x-IBM1383 : x-IBM1383
x-IBM1385 : x-IBM1385
x-IBM1386 : x-IBM1386
x-IBM1388 : x-IBM1388
x-IBM1390 : x-IBM1390
x-IBM1390A : x-IBM1390A
x-IBM1399 : x-IBM1399
x-IBM1399A : x-IBM1399A
x-IBM16684 : x-IBM16684
x-IBM16684A : x-IBM16684A
x-IBM29626 : x-IBM29626
x-IBM29626C : x-IBM29626C
x-IBM300 : x-IBM300
x-IBM300A : x-IBM300A
x-IBM301 : x-IBM301
x-IBM33722 : x-IBM33722
x-IBM33722A : x-IBM33722A
x-IBM33722C : x-IBM33722C
x-IBM420S : x-IBM420S
x-IBM4933 : x-IBM4933
x-IBM720 : x-IBM720
x-IBM737 : x-IBM737
x-IBM808 : x-IBM808
x-IBM833 : x-IBM833
x-IBM834 : x-IBM834
x-IBM835 : x-IBM835
x-IBM836 : x-IBM836
x-IBM837 : x-IBM837
x-IBM856 : x-IBM856
x-IBM859 : x-IBM859
x-IBM864S : x-IBM864S
x-IBM867 : x-IBM867
x-IBM874 : x-IBM874
x-IBM875 : x-IBM875
x-IBM897 : x-IBM897
x-IBM921 : x-IBM921
x-IBM922 : x-IBM922
x-IBM927 : x-IBM927
x-IBM930 : x-IBM930
x-IBM930A : x-IBM930A
x-IBM933 : x-IBM933
x-IBM935 : x-IBM935
x-IBM937 : x-IBM937
x-IBM939 : x-IBM939
x-IBM939A : x-IBM939A
x-IBM942 : x-IBM942
x-IBM942C : x-IBM942C
x-IBM943 : x-IBM943
x-IBM943C : x-IBM943C
x-IBM947 : x-IBM947
x-IBM948 : x-IBM948
x-IBM949 : x-IBM949
x-IBM949C : x-IBM949C
x-IBM950 : x-IBM950
x-IBM951 : x-IBM951
x-IBM954 : x-IBM954
x-IBM954C : x-IBM954C
x-IBM964 : x-IBM964
x-IBM970 : x-IBM970
x-IBM971 : x-IBM971
x-ISCII91 : x-ISCII91
x-ISO-2022-CN-CNS : x-ISO-2022-CN-CNS
x-ISO-2022-CN-GB : x-ISO-2022-CN-GB
x-iso-8859-11 : x-iso-8859-11
x-ISO-8859-6S : x-ISO-8859-6S
x-JIS0208 : x-JIS0208
x-JISAutoDetect : x-JISAutoDetect
x-Johab : x-Johab
x-KOI8_RU : x-KOI8_RU
x-KSC5601 : x-KSC5601
x-MacArabic : x-MacArabic
x-MacCentralEurope : x-MacCentralEurope
x-MacCroatian : x-MacCroatian
x-MacCyrillic : x-MacCyrillic
x-MacDingbat : x-MacDingbat
x-MacGreek : x-MacGreek
x-MacHebrew : x-MacHebrew
x-MacIceland : x-MacIceland
x-MacRoman : x-MacRoman
x-MacRomania : x-MacRomania
x-MacSymbol : x-MacSymbol
x-MacThai : x-MacThai
x-MacTurkish : x-MacTurkish
x-MacUkraine : x-MacUkraine
x-MS932_0213 : x-MS932_0213
x-MS950-HKSCS : x-MS950-HKSCS
x-MS950-HKSCS-XP : x-MS950-HKSCS-XP
x-mswin-936 : x-mswin-936
x-mswin-936A : x-mswin-936A
x-PCK : x-PCK
x-SJIS_0213 : x-SJIS_0213
x-UTF-16LE-BOM : x-UTF-16LE-BOM
X-UTF-32BE-BOM : X-UTF-32BE-BOM
X-UTF-32LE-BOM : X-UTF-32LE-BOM
x-UTF_8J : x-UTF_8J
x-windows-1256S : x-windows-1256S
x-windows-50220 : x-windows-50220
x-windows-50221 : x-windows-50221
x-windows-874 : x-windows-874
x-windows-949 : x-windows-949
x-windows-950 : x-windows-950
x-windows-iso2022jp : x-windows-iso2022jp
通过Charset的forName()方法,可以指定当前以什么字符集进行编码或者解码,
Charset中的 CharsetEncoder可以将Unicode字符集以forName()指定的字符集进行编码,并转换成ByteBuffer(字节序列).
Charset中的 CharsetDecoder可以将其他字符集的ByteBuffer以Unicode字符集进行解码,并转换成CharBuffer(字符序列).
以上两行待验证。
下面演示Charset用法,
package nio; import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.SortedMap; public class CharsetTest {
public static void charsetTest() {
SortedMap<String,Charset> map = Charset.availableCharsets();
for (String key : map.keySet()) {
System.out.println(key+" : "+map.get(key));
}
} public static void charsetTransForm() throws CharacterCodingException {
//简体中文编码
Charset cn = Charset.forName("GBK");
CharsetEncoder cnEncoder = cn.newEncoder();
CharsetDecoder cnDecoder = cn.newDecoder();
CharBuffer cbuff = CharBuffer.allocate(8);
cbuff.put("A");
cbuff.put("孙");
cbuff.put("悟");
cbuff.put("空");
//调用flip(), lim设置为pos位置,pos恢复起始位置, 读就绪
cbuff.flip();
//字符转字节
ByteBuffer bbuff = cnEncoder.encode(cbuff);
for (int i = 0; i < bbuff.limit(); i++) {
//直接输出字节
System.out.print(bbuff.get(i)+" ");
}
System.out.println("\n");
//字节转字符
System.out.println(cnDecoder.decode(bbuff));
}
public static void main(String[] args) throws CharacterCodingException {
charsetTest();
//charsetTransForm();
}
}
上面的charsetTransForm()方法输出如下,
65 -53 -17 -50 -14 -65 -43 A孙悟空
在String类里,也提供了一个getBytes(String charset)的方法,可以返回byte[],可以将指定字符集的字符串转换成字节码。
文件锁
Channel中提供了lock(阻塞)和trylock(非阻塞)来在多进程并发时锁定文件,这两个方法返回一个FileLock对象。 FileLock对象的release()方法可以释放文件锁。
下面是一个简单例子,
package nio; import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock; public class FileLockTest {
public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException {
try (
FileChannel channel = new FileOutputStream("a.txt").getChannel()) {
//使用非阻塞方式加锁
FileLock lock = channel.lock();
Thread.sleep(10000);
lock.release();
}
}
}
Channel提供的文件锁并不常用,部分原因原因如下,
- 并发控制性能不高,还是推荐用数据库
- 某些平台上文件锁无效
- 如果两个java程序同时使用一个Java虚拟机运行,则不能同时对一个文件加锁。
- 某些平台上,关闭FlieLock时会释放锁,因此同一个文件被锁定应该避免打开多个FileLock
JAVA基础知识之NIO——Buffer.Channel,Charset,Channel文件锁的更多相关文章
- JAVA基础知识之NIO.2——Path,Paths,Files
NIO.2 JDK7对NIO进行了重大改进,主要包含以下两方面 新增Path接口,Paths工具类,Files工具类. 这些接口和工具类对NIO中的功能进行了高度封装,大大简化了文件系统的IO编程. ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- JAVA基础知识|Socket
一.什么是Socket? Socket本身并不是协议,是一套完成TCP.UDP协议的调用接口(API),通过socket我们才能使用TCP/IP协议(JAVA基础知识|TCP/IP协议).Socket ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- java基础知识-笔记整理
1.查看已安装jdk文件路径 CMD输入java -verbose. 2.java学习提升路线 java学习视屏地址: http://www.icoolxue.com/album/show/38 ...
- java基础知识精华
转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...
- 【Java面试题系列】:Java基础知识常见面试题汇总 第一篇
文中面试题从茫茫网海中精心筛选,如有错误,欢迎指正! 1.前言 参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后,一般都会让先做一份笔试题,然后公司会根据笔试题的回答结果,确定 ...
随机推荐
- 使用Fiddler截断更改Request数据
0x01 Fiddler介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据.(百度百科) 0x ...
- js的extend和fn.extend使用
$.fn.extend扩展的是一个jQuery对象函数,$.extend扩展的是一个jQuery全局函数 <!DOCTYPE html> <html> <head> ...
- SQL异常:ORA-00936: missing expression
select * from t_user where id in()当条件in的内容为空时抛 java.sql.SQLException: ORA-00936: missing expression ...
- 搭建vpn
之前买的vpn,对linux支持很不友好,家里装的又是ubuntu.突然一想自己买个vps搭个vpn. 先买了host1plus的vps,一个月30块,配了两天,pptp,l2tp,shadow so ...
- Mysql忽略文件名的安全编码
author:skatetime:2014/09/28 mysql如何删除以"#sql-"开头的临时表 现象:在重建索引后,发现Mysql服务器的磁盘空间快满了 在用如下命令重建索 ...
- Web前端开发基础 第四课(CSS一些性质)
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签 ...
- Emgu 决策树
MCvDTreeParams cvFolds //If this parameter is >1, the tree is pruned using cv_folds-fold cross va ...
- mongod 命令执行发现已经有进程在运行mongod数据库--errno:48 Address already in use for socket: 0.0.0.0:27017
错误信息: listen(): bind() failed errno:48 Address already in use for socket: 0.0.0.0:27017 27017端口已经被占用 ...
- EntityFramework SQLiteCodeFirst 自动创建数据库 关闭级联删除
外键的级联删除: 如A表中有主键idA, B表中设置外键(ForeignKey)为A表中的主键idA, 当A表中的记录被删除时, B表中所有引用此条记录的记录(即所有外键为idA的记录)将自动被删除 ...
- C++程序设计(三)
1. 运算符重载 目的:对抽象数据类型也能够直接使用C++提供的运算符.使得程序更简洁,代码更容易理解. 运算符重载的实质是函数重载 返回值类型 operator 运算符(形参表) { -- } 运算 ...