java8--IO(java疯狂讲义3复习笔记)

 产生文件

        File file = new File("abc.txt");if(!file.exists()){System.out.println(file.exists());file.createNewFile();}System.out.println(file.getAbsolutePath());

 

关于临时文件

1).放在指定目录,此时已项目为默认目录

    File file = File.createTempFile("defaultTmp","tmpp",new File("./"));System.out.println(file.getAbsolutePath());
--------------------------------------------------

/Users/liuxin/work/workspace2/learnJava/./defaultTmp5487876755372558069tmpp

2).放在默认目录

File file = File.createTempFile("defaultTmp",".tmpp");System.out.println(file.getAbsolutePath());------------------------------------------------------------------------
/var/folders/f9/x95426d95ng7wgy7f7yccj3w0000gn/T/defaultTmp1175907986750188229tmpp

3).虚拟机退出时删除临时文件

File file = File.createTempFile("defaultTmp",".tmpp");file.deleteOnExit();System.out.println(file.getAbsolutePath());

4).关于后缀

File testFile = new File("testFile");if(!testFile.exists()){testFile.mkdirs();}testFile.deleteOnExit();File file = File.createTempFile("defaultTmp","tmpp");System.out.println(file.getAbsolutePath());File file2 = File.createTempFile("defaultTmp2",".tmpp",testFile);System.out.println(file2.getAbsolutePath());File file3 = File.createTempFile("defaultTmp3",null,testFile);System.out.println(file3.getAbsolutePath());=======================================
/var/folders/f9/x95426d95ng7wgy7f7yccj3w0000gn/T/defaultTmp5296324826431648502tmpp
/Users/liuxin/work/workspace2/learnJava/testFile/defaultTmp21551336802243345058.tmpp
/Users/liuxin/work/workspace2/learnJava/testFile/defaultTmp33930717872920538957.tmp

 

操作目录

1.查看目录下的所有文件

File currentFile = new File(".");System.out.println(currentFile.getAbsolutePath());for(File file : currentFile.listFiles()){System.out.println(file.getName());}

 

getParent()的使用方法

 

File file = new File(".");
System.out.println(file.getAbsolutePath());
System.out.println(new File(file.getAbsolutePath()).getParent());-----------------------
/Users/liuxin/work/workspace2/learnJava/.
/Users/liuxin/work/workspace2/learnJavagetParent()只有在定义文件时有路径时才起作用.

 

15.2 流

字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类.

字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符

节点流和处理流,节点流是低级流,直接跟数据源相接.处理流(也叫包装流)把节点流包装了一层,属于修饰器设计模式.

处理流的功能主要体现在以下两个方面:

1.性能的提高:主要以增加缓冲的方式来提高输入输出的效率

2.操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的内容,而不是输入/输出一个或多个水滴

处理流可以嫁接在任何已存在的流的基础上.

15.3.1 InputStream和Reader

InputStream和Reader是所有输入流的抽象基类,本身并不能创建实例来执行.

读取文件的demo

public static void testFile() throws IOException{// 创建字节输入流FileInputStream fis = new FileInputStream("a.txt");// 创建一个长度为1024的“竹筒”byte[] bbuf = new byte[1024];// 用于保存实际读取的字节数int hasRead = 0;// 使用循环来重复“取水”过程while ((hasRead = fis.read(bbuf)) > 0 ){// 取出“竹筒”中水滴(字节),将字节数组转换成字符串输入!System.out.print(new String(bbuf , 0 , hasRead ));}// 关闭文件输入流,放在finally块里更安全
                    fis.close();}

 

关于fileFilter

 

File file = new File(".");String[] nameList = file.list((dir, name) -> name.endsWith(".java")|| new File(name).isDirectory());for(String name : nameList){System.out.println(name);}================================
.settings
a
bin
lib
result
sqlModify
src
testFile

 

15.2 理解java的IO流

用字节流读取文件并打印

public static void testFile2() throws IOException{// 创建字节输入流FileInputStream fis = new FileInputStream("a.txt");//读取一个字节,返回的是int,所以要用char强转System.out.println((char)fis.read());// 创建一个长度为1024的“竹筒”byte[] bbuf = new byte[1024];//读取5个字节,放在bbuf的index为10的位置fis.read(bbuf,10,10);
//                    从bbuf中index为10的位置读取5个字节构成字符串System.out.println(new String(bbuf , 10, 5));//转换成String后,byte[]不变System.out.println(new String(bbuf , 10, 5));// 用于保存实际读取的字节数int hasRead = 0;// 使用循环来重复“取水”过程while ((hasRead = fis.read(bbuf)) > 0 ){//重新赋值后,byte[]会改变System.out.println(new String(bbuf , 10, 5));// 取出“竹筒”中水滴(字节),将字节数组转换成字符串输入!System.out.println("==============================================");String test = new String(bbuf , 0 , hasRead );System.out.println(test);System.out.println("=================="+new String(bbuf , 0 , hasRead ).length()+"============================");}// 关闭文件输入流,放在finally块里更安全
                    fis.close();}
打印结果如下
< ?xml ?xml ncodi ============================================== on="1.0" encoding="UTF-8"?> <projectDescription><name>learnJava</name><comment></comment><projects></projects><buildSpec><buildCommand><name>org.eclipse.jdt.core.javabuilder</name><arguments></arguments></buildCommand></buildSpec><natures><nature>org.eclipse.jdt.core.javanature</nature></natures> </projectDescription>我很好啊,看看需不要utf-8 ==================373============================
public static void testFile3() {try(// 创建字符输入流FileReader fr = new FileReader("a.txt")){// 创建一个长度为32的“竹筒”char[] cbuf = new char[32];System.out.println(fr.read(cbuf,0,32));System.out.println(new String(cbuf));// 用于保存实际读取的字符数int hasRead = 0;// 使用循环来重复“取水”过程while ((hasRead = fr.read(cbuf)) > 0 ){// 取出“竹筒”中水滴(字符),将字符数组转换成字符串输入!
//                    System.out.print(new String(cbuf , 0 , hasRead));System.out.print(new String(cbuf));}}catch (IOException ex){ex.printStackTrace();}}

 

outPutStream 和 Writer

public static void testFileWriter() {
    //这里a.txt可以不存在,如果不存在回自动生成,但是没搞明白怎么设置编码格式
try(FileWriter fw = new FileWriter("a.txt")){fw.write("锦瑟 - 李商隐\r\n");fw.write("锦瑟无端五十弦,一弦一柱思华年。\r\n");fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\r\n");fw.write("沧海月明珠有泪,蓝田日暖玉生烟。\r\n");fw.write("此情可待成追忆,只是当时已惘然。\r\n");}catch (IOException ioe){ioe.printStackTrace();}}

 

15.4 输入输出流体系

处理流:构造参数是已经存在的流.

节点流:构造参数是物理IO节点

处理流的用法

public static void PrintStream() {try(FileOutputStream fos = new FileOutputStream("a.txt");PrintStream ps = new PrintStream(fos)){// 使用PrintStream执行输出ps.println("普通字符串");// 直接使用PrintStream输出对象ps.println(new LearnIO());}catch (IOException ioe){ioe.printStackTrace();}}

输出结果

普通字符串
learnIO.LearnIO@677327b6

在使用了处理流包装了底层节点之后,关闭输入/输出流资源时,只要关闭最上层的处理流即可。关闭最上层的处理流时,系统会自动关闭被该处理流包装的节点流。

字符串流的用法,似乎没什么用,等发现用处再补充

public static void stringNodeTest() {String src = "从明天起,做一个幸福的人\n"+ "喂马,劈柴,周游世界\n"+ "从明天起,关心粮食和蔬菜\n"+ "我有一所房子,面朝大海,春暖花开\n"+ "从明天起,和每一个亲人通信\n"+ "告诉他们我的幸福\n";char[] buffer = new char[32];int hasRead = 0;try(StringReader sr = new StringReader(src)){// 采用循环读取的访问读取字符串while((hasRead = sr.read(buffer)) > 0){System.out.print(new String(buffer ,0 , hasRead));}}catch (IOException ioe){ioe.printStackTrace();}try(// 创建StringWriter时,实际上以一个StringBuffer作为输出节点// 下面指定的20就是StringBuffer的初始长度StringWriter sw = new StringWriter()){// 调用StringWriter的方法执行输出sw.write("有一个美丽的新世界,\n");sw.write("她在远方等我,\n");sw.write("哪里有天真的孩子,\n");sw.write("还有姑娘的酒窝\n");System.out.println("----下面是sw的字符串节点里的内容----");// 使用toString()方法返回StringWriter的字符串节点的内容System.out.println(sw.toString());}catch (IOException ex){ex.printStackTrace();}}

 

15.4.3 转换流

InputStreamReader :将字节输入流转换成字符输入流

OutputStreamWriter:将字节输出流转换成字符输出流

经过测试,下面这个程序是有一定问题的,用输入法的时候,会重复输出好多遍

public static void KeyinTest() {try(// 将Sytem.in对象转换成Reader对象InputStreamReader reader = new InputStreamReader(System.in);// 将普通Reader包装成BufferedReaderBufferedReader br = new BufferedReader(reader)){String line = null;// 采用循环方式来一行一行的读取while ((line = br.readLine()) != null){// 如果读取的字符串为"exit",程序退出if (line.equals("exit")){System.exit(1);}// 打印读取的内容System.out.println("输入内容为:" + line);}}catch (IOException ioe){ioe.printStackTrace();}}

15.4.4 推回输入流

PushbackInputStream和PushbackReader

用unread方法将内容推回到缓冲区,从而允许重复读取刚刚读取的内容.

使用推回流,输出某分割符号之前的内容。但其实完全不必这么做,读出来判断就好了。

public static void pushbackTest() {try(// 创建一个PushbackReader对象,指定推回缓冲区的长度为64PushbackReader pr = new PushbackReader(new FileReader("a.txt") , 64)){char[] buf = new char[32];// 用以保存上次读取的字符串内容String lastContent = "";int hasRead = 0;// 循环读取文件内容while ((hasRead = pr.read(buf)) > 0){// 将读取的内容转换成字符串String content = new String(buf , 0 , hasRead);int targetIndex = 0;// 将上次读取的字符串和本次读取的字符串拼起来,// 查看是否包含目标字符串, 如果包含目标字符串if ((targetIndex = (lastContent + content).indexOf("测试")) > 0){// 将本次内容和上次内容一起推回缓冲区pr.unread((lastContent + content).toCharArray());// 重新定义一个长度为targetIndex的char数组if(targetIndex > 32){buf = new char[targetIndex];}// 再次读取指定长度的内容(就是目标字符串之前的内容)pr.read(buf , 0 , targetIndex);// 打印读取的内容System.out.print(new String(buf , 0 ,targetIndex));System.exit(0);}else{// 打印上次读取的内容System.out.print(lastContent);// 将本次内容设为上次读取的内容lastContent = content;}}}catch (IOException ioe){ioe.printStackTrace();}}

system类里提供了三个重定向标准输入输出的方法。

setErr(PrintStream err)

setIn(InputStream in)

setOut(PrintStream out)

程序可通过重定向标准输出流,将System.out的输出重定向到文件输出.

15.6 Java虚拟机读写其他进程的数据

使用Runtime对象的exec()方法可以运行平台上的其他程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程.Process类提供了如下三个方法,用于让程序和其子进程进行通信.

InputStream getErrorStream():获取子进程的错误流,

InputStream getInputStream(): 获取子进程的输入流.

OutputStream getOutputStream(): 获取子进程的输出流.

这里的输入流和输出流是相对于该java程序(注意,不是子程序)而言的.这里的子进程相当于物理节点

注意,这里用的是getErrorStream(),因为这不是子进程向本进程传递的数据,所以属于其他,要用ErrorStream

public static void readFromProcess() throws IOException {// 运行javac命令,返回运行该命令的子进程Process p = Runtime.getRuntime().exec("java -version");try(// 以p进程的错误流创建BufferedReader对象// 这个错误流对本程序是输入流,对p进程则是输出流BufferedReader br = new BufferedReader(newInputStreamReader(p.getErrorStream()))){String buff = null;// 采取循环方式来读取p进程的错误输出while((buff = br.readLine()) != null){System.out.println(buff);}}}
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

 

java两个程序之间传递信息:这端代码我没跑起来,待研究

public class WriteToProcess
{public static void main(String[] args)throws IOException{// 运行java ReadStandard命令,返回运行该命令的子进程Process p = Runtime.getRuntime().exec("java ReadStandard");try(// 以p进程的输出流创建PrintStream对象// 这个输出流对本程序是输出流,对p进程则是输入流PrintStream ps = new PrintStream(p.getOutputStream())){// 向ReadStandard程序写入内容,这些内容将被ReadStandard读取ps.println("普通字符串");ps.println(new WriteToProcess());}}
}
// 定义一个ReadStandard类,该类可以接受标准输入,
// 并将标准输入写入out.txt文件。
class ReadStandard
{public static void main(String[] args){try(// 使用System.in创建Scanner对象,用于获取标准输入Scanner sc = new Scanner(System.in);PrintStream ps = new PrintStream(new FileOutputStream("out.txt"))){// 增加下面一行将只把回车作为分隔符sc.useDelimiter("\n");// 判断是否还有下一个输入项while(sc.hasNext()){// 输出输入项ps.println("键盘输入的内容是:" + sc.next());}}catch(IOException ioe){ioe.printStackTrace();}}
}

 

15.7 RandomAccessFile

RandomAccessFile可以自由访问文件的任意位置,所以如果只需要访问文件部分内容,而不是把文件从头读到尾,使用RamdomAccessFile将是更好的选择.但是局限是,它只能读写文件,不能读写其他IO节点.

getFilePointer():返回文件记录指针的当前位置

seek(long pos):将文件记录指针定位到pos位置

 

public static void randomAccessFileTest(){try(RandomAccessFile raf =  new RandomAccessFile("newFile.txt" , "r")){// 获取RandomAccessFile对象文件指针的位置,初始位置是0System.out.println("RandomAccessFile的文件指针的初始位置:"+ raf.getFilePointer());// 移动raf的文件记录指针的位置raf.seek(30);byte[] bbuf = new byte[1024];// 用于保存实际读取的字节数int hasRead = 0;// 使用循环来重复“取水”过程while ((hasRead = raf.read(bbuf)) > 0 ){// 取出“竹筒”中水滴(字节),将字节数组转换成字符串输入!System.out.print(new String(bbuf , 0 , hasRead ));}}catch (IOException ex){ex.printStackTrace();}}

RandomAccessFile 依然不能向文件的指定位置插入内容,如果直接将文件记录指针移动到中间某位置后开始输出,则新输出的内容会覆盖文件中原有的内容,如果需要向指定位置插入内容,程序需要先把插入点后面的内容读入缓冲区,等把需要插入的数据写入文件后,再将缓冲区的内容追加到文件的后面.

 

public static void insert(String fileName , long pos, String insertContent) throws IOException{File tmp = File.createTempFile("tmp" , null);tmp.deleteOnExit();try(RandomAccessFile raf = new RandomAccessFile(fileName , "rw");// 使用临时文件来保存插入点后的数据FileOutputStream tmpOut = new FileOutputStream(tmp);FileInputStream tmpIn = new FileInputStream(tmp)){raf.seek(pos);// ------下面代码将插入点后的内容读入临时文件中保存------byte[] bbuf = new byte[64];// 用于保存实际读取的字节数int hasRead = 0;// 使用循环方式读取插入点后的数据while ((hasRead = raf.read(bbuf)) > 0 ){// 将读取的数据写入临时文件tmpOut.write(bbuf , 0 , hasRead);}// ----------下面代码插入内容----------// 把文件记录指针重新定位到pos位置
                raf.seek(pos);// 追加需要插入的内容
                raf.write(insertContent.getBytes());// 追加临时文件中的内容while ((hasRead = tmpIn.read(bbuf)) > 0 ){raf.write(bbuf , 0 , hasRead);}}}

如果仅仅是追加内容,就简单多了

public static void main(String[] args){try(//以读、写方式打开一个RandomAccessFile对象RandomAccessFile raf = new RandomAccessFile("out.txt" , "rw")){//将记录指针移动到out.txt文件的最后
            raf.seek(raf.length());raf.write("追加的内容!\r\n".getBytes());}catch (IOException ex){ex.printStackTrace();}}

 

15.8 对象序列化(serialize)

对象的序列化指将一个java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该java对象.

如果需要让某个对象支持序列化机制,那么必须让它的类是可序列化的,必须实现如下两个接口之一

Serializable

Externalizable

程序创建的每个JavaBean类都要实现Serializable

public static void writeObject() {try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));) {LearnIO learnIO = new LearnIO("12334444444");oos.writeObject(learnIO);} catch (IOException ex) {// TODO: handle exception
            ex.printStackTrace();}}


//但是,如果如下

LearnIO learnIO = new LearnIO("12334444444");

 

oos.writeObject(learnIO);

learnIO.test="abcdetc";

//不会写入abcdetc,因为不会序列化号码相同的东西
oos.writeObject(learnIO);

反序列化

public static void readObject(){try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));){LearnIO learnIO = (LearnIO)ois.readObject();System.out.println(learnIO.test);}catch (Exception e) {// TODO: handle exception
            e.printStackTrace();}}

反序列化机制无须通过构造器来初始化java对象.

如果使用序列化机制向文件中写入多个Java对象,使用反序列化机制恢复对象时必须按实际写入的顺序读取.

当一个可序列化类有多个父类时(包括直接父类和间接父类),这些父类要么有无参数的构造器,要么也是可序列化的--否则反序列化时将抛出InvalidClassException异常.如果父类是不可序列化的,只是带有无参数的构造器,则该父类中定义的成员变量值不会序列化到二进制流中.

 

15.8.3 对象引用的序列化

如果成员变量是引用类型,那么这个引用类型的类必须是可序列化的.

属于递归序列化

有static修饰和transient修饰的变量不会被序列化

15.8.4 自定义序列化

在实例变量前面使用transient关键字修饰,可以指定java序列化时无须理会该实例变量.

更详细的自定义序列化方法是重写writeObject和readObject方法.

 

15.8.5 另一种自定义序列化机制

实现Externalizable

 

转载于:https://www.cnblogs.com/lakeslove/p/6143568.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python网络平台_python学习(九) 网络编程学习--简易网站服务器

python 网络编程和其他语言都是一样的&#xff0c;服务器这块步骤为&#xff1a;1. 创建套接字2. 绑定地址3. 监听该描述符的所有请求4. 有新的请求到了调用accept处理请求Python Web服务器网关接口(Python Web Server Gateway Interface&#xff0c;简称“WSGI”)&#xff0c;…

rabbit和mysql事务_分布式事务原理及SpringBoot整合RabbitMQ实现可靠事件,TCC事务模型及接口幂等性...

分布式事务我们知道在单数据库系统中&#xff0c;实现数据的一致性&#xff0c;通过数据库的事务来处理比较简单。在微服务或分布式系统中&#xff0c;各个独立的服务都会有自己的数据库&#xff0c;而不是在同一个数据库中&#xff0c;所以当一组事务(如商品交易中&#xff0c…

python pandas 数据库_Python中pandas函数操作数据库

一&#xff1a;创建链接数据库引擎Pythonfrom sqlalchemy import create_engineengine create_engine(postgresql://user58.251.157.179:port/database,echo True)echo True &#xff0c;会显示在加载数据库所执行的SQL语句。12345fromsqlalchemyimportcreate_engineenginecr…

mysql引擎模式_mysql引擎,完整的见表语句,数据库模式, 常用数据类型,约束条件...

引擎show engines : 查看引擎innodb(默认引擎)&#xff1a;支持事务&#xff0c;行级锁&#xff0c;外键myisam:查询效率由于innodb,不需要支持事务&#xff0c;行级锁&#xff0c;外键&#xff0c;可以选用myisam来优化数据库mysql> create table t1(id int)engineinnodb;m…

testng连接MySQL_Selenium+TestNG实战-8-连接数据库方法去验证文章是否发布

原标题&#xff1a;SeleniumTestNG实战-8-连接数据库方法去验证文章是否发布记得之前群里&#xff0c;有人说举例一下连接数据库在Selenium自动化测试中的应用。本篇刚好来举例一个&#xff0c;前面我们都是通过发布后文章的详情页的标题来判断文章是否已经发布成功&#xff0c…

武汉mysql ocp考点_MySQL OCP考试复习系列–开篇:了解MySQL考试

MySQL OCP考试复习系列–开篇&#xff1a;了解MySQL考试嗯&#xff0c;那个决定去考MySQL OCP了&#xff0c;事实上最近工作一直围绕着DB2&#xff0c;MySQL要去考的话需要好好的复习的啊。150分钟&#xff0c;100道多选&#xff0c;答对60道题可以通过&#xff0c;费用1077。L…

java文件服务器_JavaWeb项目架构之NFS文件服务器

NFS简介NFS(Network File System)即网络文件系统。主要功能&#xff1a;通过网络(局域网)让不同的主机系统之间可以共享文件或目录。主要用途&#xff1a;NFS网络文件系统一般被用来存储共享视频&#xff0c;图片&#xff0c;附件等静态资源文件。NFS存储服务无NFS文件共享存储…

table 样式详解

1.table 中css样式控制border 只能控制外边框&#xff0c;内边框需要写<table border"1"> 2.table 会自动撑大&#xff0c;即使td 设置了 width和height这与div 是不同的 3.只有一个table的时候 &#xff0c;高度自适应全屏 <style type"text/css"…

spring整合

spring整合hibernate&#xff0c;整合什么&#xff1f; 1. Spring 整合 Hibernate 整合什么 ?1). 有 IOC 容器来管理 Hibernate 的 SessionFactory 2). 让 Hibernate 使用上 Spring 的声明式事务2. 整合步骤:1). 加入 hibernate ①. jar 包 ②. 添加 hibernate 的配置文件: hi…

看看大货车到底有多少盲区,肯定用得到!救命的!

上路的司机都知道&#xff0c;一旦看到大货车就要离它远远的&#xff0c;因为大货车的盲区大。可是又有多少轿车司机懂得盲区在哪里呢?不仅是轿车司机&#xff0c;许多行人和非机动车辆对于大货车的盲区也是一知半解&#xff0c;常常有人因此丧命。 行人篇 先给大家看一张最直…

msgpack java lua_使用lua-cmsgpack序列化和反序列化lua对象

原文在简书首发&#xff1a;http://www.jianshu.com/p/badf412db4e7lua-cmsgpack是一个开源的MessagePack实现方式、纯C的库&#xff0c;没有任何其它依赖&#xff0c;编译后可以直接被lua调用&#xff0c;目前主要支持Lua5.1/5.2/5.3 版本。1、什么是MessagePack&#xff1f;-…

全国250米DEM数据

全国250米DEM数据 DEM是数字高程模型的英文简称(Digital Elevation Model)&#xff0c;是研究分析地形、流域、地物识别的重要原始资料。由于DEM 数据能够反映一定分辨率的局部地形特征&#xff0c;因此通过DEM 可提取大量的地表形态信息&#xff0c;可用于绘制等高线、坡度图、…

redis集群连接 java_Redis分布式集群和直连的Java客户端调用方式详解

jedis是一个著名的key-value存储系统&#xff0c;而作为其官方推荐的java版客户端jedis也非常强大和稳定&#xff0c;支持事务、管道及有jedis自身实现的分布式。在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比&#xff1a;一、普通同步方式最简单和基础…

java爬虫新浪微博_java爬虫(爬新浪新闻) 如何从零开始

爬虫通常搜索引擎处理的对象是互联网网页。首先面临的问题是&#xff1a;如何能够设计出高效的下载系统&#xff0c;以将如此海量的网页数据传送到本地&#xff0c;在本地形成互联网网页的镜像备份。网络爬虫即起此作用&#xff0c;它是搜索引擎系统中很关键也很基础的构件。爬…

CodeVS 1068-乌龟棋

原题 题目描述 Description 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。棋盘第1格是唯一 的起点&#xff0c;第N格是终点&#xff0c;游戏要求玩家控制一个乌龟棋…

乔布斯传

资料参考 http://www.ruanyifeng.com/blog/2013/03/apple_inc_and_division_of_labor.html 苹果公司与分工原理 1.乔布斯 "乔布斯买了一间不错的房子&#xff0c;但家里只有一幅帕黎思&#xff08;Maxfield Parrish&#xff09;的画作、一部百灵牌咖啡机和几把双人牌的刀子…

ie11浏览器可以下载java吗_解析:WindowsXP系统能否安装IE11浏览器

现在&#xff0c;IE浏览器可以称得上是市场占有率最高的一款网页浏览器。因为windowsxp是一款比较久的操作系统&#xff0c;所以很多用户都会疑惑在xp上是否能够安装最新版的ie11浏览器。下面&#xff0c;小编就给大家详细解答下该问题。很遗憾的告诉大家&#xff0c;Windows X…

java ajax传输图片_Java使用Ajax实现跨域上传图片功能

说明 &#xff1a;图片服务器是用Nginx搭建的&#xff0c;用的是PHP语言这个功能 需要 用到两个js文件&#xff1a;jquery.js和jQuery.form.jsfunction submitImgSize1Upload() {var postData function( form , callback){var form document.getElementById("upload-for…

Java并发——线程中断学习

1. 使用interrupt()中断线程当一个线程运行时&#xff0c;另一个线程可以调用对应的Thread对象的interrupt()方法来中断它&#xff0c;该方法只是在目标线程中设置一个标志&#xff0c;表示它已经被中断&#xff0c;并立即返回。这里需要注意的是&#xff0c;如果只是单纯的调用…

分布式服务框架原理(一)设计和实现

分布式服务框架设计 分布式服务框架一般可以分为以下几个部分&#xff0c; &#xff08;1&#xff09;RPC基础层&#xff1a; 包括底层通信框架&#xff0c;如NIO框架、通信协议&#xff0c;序列化和反序列化协议&#xff0c;以及在这几部分上的封装&#xff0c;屏蔽底层通信细…