java

初学Java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂。而且没有结合到java8 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见。

首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!)

这是Javaio 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializable接口等等一些高级用法极其原理。

一、java io的开始:文件

1. 我们主要讲的是流,流的本质也是对文件的处理,我们循序渐进一步一步从文件将到流去。

2. java 处理文件的类 File,java提供了十分详细的文件处理方法,举了其中几个例子,其余的可以去

Java代码

packagecom.hxw.io;

importjava.io.*;

publicclassFileExample{

publicstaticvoidmain(String[] args) {

createFile();

}

/**

* 文件处理示例

*/

publicstaticvoidcreateFile() {

File f=newFile("E:/电脑桌面/jar/files/create.txt");

try{

f.createNewFile();//当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。

System.out.println("该分区大小"+f.getTotalSpace()/(1024*1024*1024)+"G");//返回由此抽象路径名表示的文件或目录的名称。

f.mkdirs();//创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

//            f.delete(); //  删除此抽象路径名表示的文件或目录

System.out.println("文件名  "+f.getName());//  返回由此抽象路径名表示的文件或目录的名称。

System.out.println("文件父目录字符串 "+f.getParent());// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。

}catch(Exception e) {

e.printStackTrace();

}

}

}

二、字节流:

1.字节流有输入和输出流,我们首先看输入流InputStream,我们首先解析一个例子(FileInputStream)。

Java代码

packagecom.hxw.io;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.IOException;

importjava.io.InputStream;

publicclassFileCount {

/**

* 我们写一个检测文件长度的小程序,别看这个程序挺长的,你忽略try catch块后发现也就那么几行而已。

*/

publicstaticvoidmain(String[] args) {

//TODO 自动生成的方法存根

intcount=0;//统计文件字节长度

InputStreamstreamReader =null;//文件输入流

try{

streamReader=newFileInputStream(newFile("D:/David/Java/java 高级进阶/files/tiger.jpg"));

/*1.new File()里面的文件地址也可以写成D:\\David\\Java\\java 高级进阶\\files\\tiger.jpg,前一个\是用来对后一个

* 进行转换的,FileInputStream是有缓冲区的,所以用完之后必须关闭,否则可能导致内存占满,数据丢失。

*/

while(streamReader.read()!=-1) {//读取文件字节,并递增指针到下一个字节

count++;

}

System.out.println("---长度是: "+count+" 字节");

}catch(finalIOException e) {

//TODO 自动生成的 catch 块

e.printStackTrace();

}finally{

try{

streamReader.close();

}catch(IOException e) {

//TODO 自动生成的 catch 块

e.printStackTrace();

}

}

}

}

我们一步一步来,首先,上面的程序存在问题是,每读取一个自己我都要去用到FileInputStream,我输出的结果是“---长度是: 64982 字节”,那么进行了64982次操作!可能想象如果文件十分庞大,这样的操作肯定会出大问题,所以引出了缓冲区的概念。可以将streamReader.read()改成streamReader.read(byte[]b)此方法读取的字节数目等于字节数组的长度,读取的数据被存储在字节数组中,返回读取的字节数,InputStream还有其他方法mark,reset,markSupported方法,例如:

markSupported 判断该输入流能支持mark和reset方法。

mark用于标记当前位置;在读取一定数量的数据(小于readlimit的数据)后使用reset可以回到mark标记的位置。

FileInputStream不支持mark/reset操作;BufferedInputStream支持此操作;

mark(readlimit)的含义是在当前位置作一个标记,制定可以重新读取的最大字节数,也就是说你如果标记后读取的字节数大于readlimit,你就再也回不到回来的位置了。

通常InputStream的read()返回-1后,说明到达文件尾,不能再读取。除非使用了mark/reset。

2.FileOutputStream 循序渐进版, InputStream是所有字节输出流的父类,子类有ByteArrayOutputStream,FileOutputStream,ObjectOutputStreanm,这些我们在后面都会一一说到。先说FileOutputStream

我以一个文件复制程序来说,顺便演示一下缓存区的使用。(Java I/O默认是不缓冲流的,所谓“缓冲”就是先把从流中得到的一块字节序列暂存在一个被称为buffer的内部字节数组里,然后你可以一下子取到这一整块的字节数据,没有缓冲的流只能一个字节一个字节读,效率孰高孰低一目了然。有两个特殊的输入流实现了缓冲功能,一个是我们常用的BufferedInputStream.)

Java代码

packagecom.hxw.io;

importjava.io.*;

publicclassFileCopy {

publicstaticvoidmain(String[] args) {

// TODO自动生成的方法存根

byte[] buffer=newbyte[512];//一次取出的字节数大小,缓冲区大小

intnumberRead=0;

FileInputStream input=null;

FileOutputStream out =null;

try{

input=newFileInputStream("D:/David/Java/java 高级进阶/files/tiger.jpg");

out=newFileOutputStream("D:/David/Java/java 高级进阶/files/tiger2.jpg");//如果文件不存在会自动创建

while((numberRead=input.read(buffer))!=-1) {//numberRead的目的在于防止最后一次读取的字节小于buffer长度,

out.write(buffer,0, numberRead);//否则会自动被填充0

}

}catch(finalIOException e) {

// TODO自动生成的 catch 块

e.printStackTrace();

}finally{

try{

input.close();

out.close();

}catch(IOException e) {

// TODO自动生成的 catch 块

e.printStackTrace();

}

}

}

}

3.读写对象:ObjectInputStream 和ObjectOutputStream ,该流允许读取或写入用户自定义的类,但是要实现这种功能,被读取和写入的类必须实现Serializable接口,其实该接口并没有什么方法,可能相当于一个标记而已,但是确实不合缺少的。实例代码如下:

Java代码

packagecom.hxw.io;

importjava.io.*;

publicclassObjetStream {

/**

* @param args

*/

publicstaticvoidmain(String[] args) {

// TODO自动生成的方法存根

ObjectOutputStream objectwriter=null;

ObjectInputStream objectreader=null;

try{

objectwriter=newObjectOutputStream(newFileOutputStream("D:/David/Java/java 高级进阶/files/student.txt"));

objectwriter.writeObject(newStudent("gg",22));

objectwriter.writeObject(newStudent("tt",18));

objectwriter.writeObject(newStudent("rr",17));

objectreader=newObjectInputStream(newFileInputStream("D:/David/Java/java 高级进阶/files/student.txt"));

for(inti =0; i <3; i++) {

System.out.println(objectreader.readObject());

}

}catch(IOException | ClassNotFoundException e) {

// TODO自动生成的 catch 块

e.printStackTrace();

}finally{

try{

objectreader.close();

objectwriter.close();

}catch(IOException e) {

// TODO自动生成的 catch 块

e.printStackTrace();

}

}

}

}

classStudentimplementsSerializable{

privateString name;

privateintage;

publicStudent(String name,intage) {

super();

this.name = name;

this.age = age;

}

@Override

publicString toString() {

return"Student [name="+ name +", age="+ age +"]";

}

}

运行后系统输出:

Student [name=gg, age=22]

Student [name=tt, age=18]

Student [name=rr, age=17]

4.有时没有必要存储整个对象的信息,而只是要存储一个对象的成员数据,成员数据的类型假设都是Java的基本数据类型,这样的需求不必使用到与Object输入、输出相关的流对象,可以使用DataInputStream、DataOutputStream来写入或读出数据。下面是一个例子:(DataInputStream的好处在于在从文件读出数据时,不用费心地自行判断读入字符串时或读入int类型时何时将停止,使用对应的readUTF()和readInt()方法就可以正确地读入完整的类型数据。)

Java代码

packagecom.hxw;

publicclassMember {

privateString name;

privateintage;

publicMember() {

}

publicMember(String name,intage) {

this.name = name;

this.age = age;

}

publicvoidsetName(String name){

this.name = name;

}

publicvoidsetAge(intage) {

this.age = age;

}

publicString getName() {

returnname;

}

publicintgetAge() {

returnage;

}

}

打算将Member类实例的成员数据写入文件中,并打算在读入文件数据后,将这些数据还原为Member对象。下面的代码简单示范了如何实现这个需求。

Java代码

packagecom.hxw;

importjava.io.*;

publicclassDataStreamDemo

{

publicstaticvoidmain(String[]args)

{

Member[] members = {newMember("Justin",90),

newMember("momor",95),

newMember("Bush",88)};

try

{

DataOutputStreamdataOutputStream =newDataOutputStream(newFileOutputStream(args[0]));

for(Member member:members)

{

//写入UTF字符串

dataOutputStream.writeUTF(member.getName());

//写入int数据

dataOutputStream.writeInt(member.getAge());

}

//所有数据至目的地

dataOutputStream.flush();

//关闭流

dataOutputStream.close();

DataInputStreamdataInputStream =newDataInputStream(newFileInputStream(args[0]));

//读出数据并还原为对象

for(inti=0;i

{

//读出UTF字符串

String name =dataInputStream.readUTF();

//读出int数据

intscore =dataInputStream.readInt();

members[i] = newMember(name,score);

}

//关闭流

dataInputStream.close();

//显示还原后的数据

for(Member member : members)

{

System.out.printf("%s\t%d%n",member.getName(),member.getAge());

}

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

5.PushbackInputStream类继承了FilterInputStream类是iputStream类的修饰者。提供可以将数据插入到输入流前端的能力(当然也可以做其他操作)。简而言之PushbackInputStream类的作用就是能够在读取缓冲区的时候提前知道下一个字节是什么,其实质是读取到下一个字符后回退的做法,这之间可以进行很多操作,这有点向你把读取缓冲区的过程当成一个数组的遍历,遍历到某个字符的时候可以进行的操作,当然,如果要插入,能够插入的最大字节数是与推回缓冲区的大小相关的,插入字符肯定不能大于缓冲区吧!下面是一个示例。

Java代码

packagecom.hxw.io;

importjava.io.ByteArrayInputStream;//导入ByteArrayInputStream的包

importjava.io.IOException;

importjava.io.PushbackInputStream;

/**

* 回退流操作

* */

publicclassPushBackInputStreamDemo {

publicstaticvoidmain(String[] args)throwsIOException {

String str ="hello,rollenholt";

PushbackInputStream push =null;// 声明回退流对象

ByteArrayInputStream bat =null;// 声明字节数组流对象

bat =newByteArrayInputStream(str.getBytes());

push =newPushbackInputStream(bat);// 创建回退流对象,将拆解的字节数组流传入

inttemp =0;

while((temp = push.read()) != -1) {// push.read()逐字节读取存放在temp中,如果读取完成返回-1

if(temp ==',') {// 判断读取的是否是逗号

push.unread(temp);//回到temp的位置

temp = push.read();//接着读取字节

System.out.print("(回退"+ (char) temp +") ");// 输出回退的字符

}else{

System.out.print((char) temp);// 否则输出字符

}

}

}

}

6.SequenceInputStream:有些情况下,当我们需要从多个输入流中向程序读入数据。此时,可以使用合并流,将多个输入流合并成一个SequenceInputStream流对象。SequenceInputStream会将与之相连接的流集组合成一个输入流并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 合并流的作用是将多个源合并合一个源。其可接收枚举类所封闭的多个字节流对象。

Java代码

packagecom.hxw.io;

importjava.io.*;

importjava.util.Enumeration;

importjava.util.Vector;

publicclassSequenceInputStreamTest {

/**

* @param args

*            SequenceInputStream合并流,将与之相连接的流集组合成一个输入流并从第一个输入流开始读取,

*            直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

*            合并流的作用是将多个源合并合一个源。可接收枚举类所封闭的多个字节流对象。

*/

publicstaticvoidmain(String[] args) {

doSequence();

}

privatestaticvoiddoSequence() {

// 创建一个合并流的对象

SequenceInputStream sis =null;

// 创建输出流。

BufferedOutputStream bos =null;

try{

// 构建流集合。

Vector vector =newVector();

vector.addElement(newFileInputStream("D:\text1.txt"));

vector.addElement(newFileInputStream("D:\text2.txt"));

vector.addElement(newFileInputStream("D:\text3.txt"));

Enumeration e = vector.elements();

sis =newSequenceInputStream(e);

bos =newBufferedOutputStream(newFileOutputStream("D:\text4.txt"));

// 读写数据

byte[] buf =newbyte[1024];

intlen =0;

while((len = sis.read(buf)) != -1) {

bos.write(buf,0, len);

bos.flush();

}

}catch(FileNotFoundException e1) {

e1.printStackTrace();

}catch(IOException e1) {

e1.printStackTrace();

}finally{

try{

if(sis !=null)

sis.close();

}catch(IOException e) {

e.printStackTrace();

}

try{

if(bos !=null)

bos.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

7.PrintStream 说这个名字可能初学者不熟悉,如果说System.out.print()你肯定熟悉,System.out这个对象就是PrintStream,这个我们不做过多示例

三、字符流(顾名思义,就是操作字符文件的流)

1.java 使用Unicode存储字符串,在写入字符流时我们都可以指定写入的字符串的编码。前面介绍了不用抛异常的处理字节型数据的流ByteArrayOutputStream,与之对应的操作字符类的类就是CharArrayReader,CharArrayWriter类,这里也会用到缓冲区,不过是字符缓冲区,一般讲字符串放入到操作字符的io流一般方法是

CharArrayReaderreader=mew CharArrayReader(str.toCharArray()); 一旦会去到CharArrayReader实例就可以使用CharArrayReader访问字符串的各个元素以执行进一步读取操作。不做例子

2.我们用FileReader,PrintWriter来做示范

Java代码

packagecom.hxw.io;

importjava.io.FileNotFoundException;

importjava.io.FileReader;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.nio.CharBuffer;

publicclassPrint {

/**

* @param args

*/

publicstaticvoidmain(String[] args) {

// TODO自动生成的方法存根

char[] buffer=newchar[512];//一次取出的字节数大小,缓冲区大小

intnumberRead=0;

FileReader reader=null;//读取字符文件的流

PrintWriter writer=null;//写字符到控制台的流

try{

reader=newFileReader("D:/David/Java/java 高级进阶/files/copy1.txt");

writer=newPrintWriter(System.out);//PrintWriter可以输出字符到文件,也可以输出到控制台

while((numberRead=reader.read(buffer))!=-1) {

writer.write(buffer,0, numberRead);

}

}catch(IOException e) {

// TODO自动生成的 catch 块

e.printStackTrace();

}finally{

try{

reader.close();

}catch(IOException e) {

// TODO自动生成的 catch 块

e.printStackTrace();

}

writer.close();//这个不用抛异常

}

}

}

3.相对我们前面的例子是直接用FileReader打开的文件,我们这次使用链接流,一般比较常用的都用链接流,所谓链接流就是就多次对流的封装,这样能更好的操作个管理数据,(比如我们利用DataInputStream(BufferedInputStream(FileInputStream))将字节流层层包装后,我们可以读取readByte(),readChar()这样更加具体的操作,注意,该流属于字节流对字符进行操作,)字符流用CharArrayReader就可以了。下面的示例我们将用到j2se 5中的一个可变参数进行一个小度扩展。使用BufferedWriter 和BufferedReader用文件级联的方式进行写入,即将多个文件写入到同一文件中(自带缓冲区的输出输出流BufferedReader和BufferedWriter,该流最常用的属readLine()方法了,读取一行数据,并返回String)。

Java代码

packagecom.hxw.io;

importjava.io.BufferedReader;

importjava.io.BufferedWriter;

importjava.io.FileReader;

importjava.io.FileWriter;

importjava.io.IOException;

importjava.util.Iterator;

publicclassFileConcatenate {

/**

* 包装类进行文件级联操作

*/

publicstaticvoidmain(String[] args) {

// TODO自动生成的方法存根

try{

concennateFile(args);

}catch(IOException e) {

// TODO自动生成的 catch 块

e.printStackTrace();

}

}

publicstaticvoidconcennateFile(String...fileName)throwsIOException{

String str;

//构建对该文件您的输入流

BufferedWriter writer=newBufferedWriter(newFileWriter("D:/David/Java/java 高级进阶/files/copy2.txt"));

for(String name: fileName){

BufferedReader reader=newBufferedReader(newFileReader(name));

while((str=reader.readLine())!=null) {

writer.write(str);

writer.newLine();

}

}

}

}

4.Console类,该类提供了用于读取密码的方法,可以禁止控制台回显并返回char数组,对两个特性对保证安全有作用,平时用的不多,了解就行。

5.StreamTokenizer 类,这个类非常有用,它可以把输入流解析为标记(token), StreamTokenizer 并非派生自InputStream或者OutputStream,而是归类于io库中,因为StreamTokenizer只处理InputStream对象。

首先给出我的文本文件内容:

'水上漂'

青青草

"i love wyhss"

{3211}

23223 3523

i love wyh ,。

. ,

下面是代码:

Java代码

packagecom.hxw.io;

importjava.io.BufferedReader;

importjava.io.FileReader;

importjava.io.IOException;

importjava.io.StreamTokenizer;

/**

* 使用StreamTokenizer来统计文件中的字符数

* StreamTokenizer 类获取输入流并将其分析为“标记”,允许一次读取一个标记。

* 分析过程由一个表和许多可以设置为各种状态的标志控制。

* 该流的标记生成器可以识别标识符、数字、引用的字符串和各种注释样式。

*

*  默认情况下,StreamTokenizer认为下列内容是Token: 字母、数字、除C和C++注释符号以外的其他符号。

*  如符号"/"不是Token,注释后的内容也不是,而"\"是Token。单引号和双引号以及其中的内容,只能算是一个Token。

*  统计文章字符数的程序,不是简单的统计Token数就万事大吉,因为字符数不等于Token。按照Token的规定,

*  引号中的内容就算是10页也算一个Token。如果希望引号和引号中的内容都算作Token,应该调用下面的代码:

*    st.ordinaryChar('\'');

* st.ordinaryChar('\"');

*/

publicclassStreamTokenizerExample {

/**

* 统计字符数

* @param fileName 文件名

* @return    字符数

*/

publicstaticvoidmain(String[] args) {

String fileName ="D:/David/Java/java 高级进阶/files/copy1.txt";

StreamTokenizerExample.statis(fileName);

}

publicstaticlongstatis(String fileName) {

FileReader fileReader =null;

try{

fileReader =newFileReader(fileName);

//创建分析给定字符流的标记生成器

StreamTokenizer st =newStreamTokenizer(newBufferedReader(

fileReader));

//ordinaryChar方法指定字符参数在此标记生成器中是“普通”字符。

//下面指定单引号、双引号和注释符号是普通字符

st.ordinaryChar('\'');

st.ordinaryChar('\"');

st.ordinaryChar('/');

String s;

intnumberSum =0;

intwordSum =0;

intsymbolSum =0;

inttotal =0;

//nextToken方法读取下一个Token.

//TT_EOF指示已读到流末尾的常量。

while(st.nextToken() !=StreamTokenizer.TT_EOF) {

//在调用 nextToken 方法之后,ttype字段将包含刚读取的标记的类型

switch(st.ttype) {

//TT_EOL指示已读到行末尾的常量。

caseStreamTokenizer.TT_EOL:

break;

//TT_NUMBER指示已读到一个数字标记的常量

caseStreamTokenizer.TT_NUMBER:

//如果当前标记是一个数字,nval字段将包含该数字的值

s = String.valueOf((st.nval));

System.out.println("数字有:"+s);

numberSum ++;

break;

//TT_WORD指示已读到一个文字标记的常量

caseStreamTokenizer.TT_WORD:

//如果当前标记是一个文字标记,sval字段包含一个给出该文字标记的字符的字符串

s = st.sval;

System.out.println("单词有: "+s);

wordSum ++;

break;

default:

//如果以上3中类型都不是,则为英文的标点符号

s = String.valueOf((char) st.ttype);

System.out.println("标点有: "+s);

symbolSum ++;

}

}

System.out.println("数字有 "+ numberSum+"个");

System.out.println("单词有 "+ wordSum+"个");

System.out.println("标点符号有: "+ symbolSum+"个");

total = symbolSum + numberSum +wordSum;

System.out.println("Total = "+ total);

returntotal;

}catch(Exception e) {

e.printStackTrace();

return-1;

}finally{

if(fileReader !=null) {

try{

fileReader.close();

}catch(IOException e1) {

}

}

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 一、流的概念和作用。 流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输...
    布鲁斯不吐丝阅读 10,023评论 2 95
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,353评论 0 6
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,083评论 0 62
  • 全文大概3500字,读完大概需要5分钟。 在两年前,我写过一篇职场类的文章,当时聊的是面临毕业季的选择,在一轮新的...
    乐翰阅读 1,215评论 0 2