当前位置: 首页 > news >正文

java I/O使用总结

 

转自:http://www.cnblogs.com/jerrychoi/archive/2010/03/16/1687589.html
一、基本使用总结

1. read方法是阻塞方法,也就是如果流对象中无数据可以读取时,则read方法会阻止程序继续向下运行,一直到有数据可以读取为止。

2. 由于‘/’是Java语言中的特殊字符,所以在代码内部书写文件路径时,例如代表“c:/test/java/Hello.java”时,需要书写成“c://test//java//Hello.java”或“c:/test/java/Hello.java”,这些都需要在代码中注意。

3. File类中包含了大部分和文件操作的功能方法,该类的对象可以代表一个具体的文件或文件夹。

4. 常见的字节输入流:

输入流

描述

ByteArrayInputStream

把字节数组转换为输入流

FileInputStream

从文件中读取数据

StringBufferInputStream

把字符串转换为输入流。这个类已被废弃,取而代之的是StringBufferReader

PipedInputStream

连接一个PipedOutputStream

SequenceInputStream

把几个输入流转换为一个输入流

ObjectInputStream

对象输入流

FilterInputStream

装饰器,具有扩展其他输入流的功能

 

5. 常见的字节输出流:

输出流

描述

ByteArrayOutputStream

向字节数组(即内存的缓冲区)中写数据

FileOutputStream

向文件中写数据

PipedOutputStream

向管道中输出数据,与PipedInputStream搭配使用

ObjectOutputStream

对象输出流

FilterOutputStream

装饰器,扩展其他输出流的功能

 

6. 在Java平台中,有以下两种方式能获得本地平台的字符编码类型:

a) System.getProperty(“file.encoding”);

b) Charset cs = Charset.defaultCharset(); 注:Charset类位于java.nio.charset包中。

7. Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为这些Unicode字符分配内存。Writer类能够把内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。默认情况下,Reader和Writer会在本地平台和字符编码和Unicode字符编码之间进行转换,如图所示:

 
 clip_image001

 

如果要输入或输出采用特定类型编码的字符串,可以使用InputStreamReader类和OutputStreamWriter类,在它们的构造方法中可以指定输入流或输出流的字符编码。如图下示:

 
 clip_image002

 

8. 常见的Reader类:

Reader类型

描述

CharArrayReader

适配器,把字符数组转换为Reader,从字符数组中读取字符

BufferedReader

装饰器,为其他Reader提供读缓冲区,此外,它的readLine()方法能够读入一行字符串

LineNumberReader

装饰器,为其他Reader提供读缓冲区,并且可以跟踪字符串输入流中的符号

StringReader

适配器,把字符串转换为Reader,从字符串中读取字符

PipedReader

连接一个PipedWriter

FilterReader

装饰器,扩展其他Reader的功能

PushBackReader

装饰器,能够把读到的一个字符压回到缓冲区中。通常用做编译器的扫描器,在程序中一般很少使用它

InputStreamReader

适配器,把InputStream转换为Reader,可以指定数据源的字符编码

FileReader

从文件中读取字符

 

9. 常见的Writer类:

Writer类型

描述

CharArrayWriter

适配器,把字符数组转换为Writer,向字符数组中写字符

BufferedWriter

装饰器,为其他Writer提供写缓冲区

StringWriter

适配器,把StringBuffer转换为Writer,向StringBuffer中写字符

PipedWriter

连接一个PipedReader

FilterWriter

装饰器,扩展其他Writer的功能

PrintWriter

装饰器,输出格式化数据

OutputStreamWriter

适配器,把OutputStream转换为Writer,可以指定数据源的字符编码

FileWriter

向文件中写字符

 

二、装饰流的使用

1. 比较常用的装饰流有DataInputStream/DataOutputStream和BufferedReader/BufferedWriter。装饰流不可以单独使用,必须本命实体流或装饰流进行使用。

2. 只有使用DataOutputStream流格式写入的数据,才可以使用DataInputStream进行读取,以下是DataOutputStream/DataInputStream的使用实例:

//将一定格式的数据写入test.my文件中。

//MyData.java

/**

* 模拟要存储到文件中的数据

* 该类中保存4种类型的数据

*/

public class MyData {

boolean b;

int n;

String s;

short sh[];

public MyData(){}

public MyData(boolean b,int n,String s,short sh[]){

this.b = b;

this.n = n;

this.s = s;

this.sh = sh;

}

}

//WriteFileUseDataStream.java

import java.io.DataOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

/**

* 使用DataOutputStream书写具有一定格式的文件

*/

public class WriteFileUseDataStream {

public static void main(String[] args){

short[] sh = {1,3,134,12};

MyData data = new MyData(true,100,"Java语言",sh);

//写入文件

writeFile(data);

}

/**

* 将MyData对象按照一定格式写入文件中

@param data 数据对象

*/

public static void writeFile(MyData data){

FileOutputStream fos = null;

DataOutputStream dos = null;

try{

//建立文件流

fos = new FileOutputStream("test.my");

//建立数据输出流,流的嵌套

dos = new DataOutputStream(fos);

//依次写入数据

dos.writeBoolean(data.b);

dos.writeInt(data.n);

dos.writeUTF(data.s);

//写入数组

int len = data.sh.length;

dos.writeInt(len); //数组长度

//依次写入每个数组元素

for(int i=0;i<len;++i)

dos.writeShort(data.sh[i]);

}catch(Exception e){

e.printStackTrace();

}finally{

try {

dos.close();

fos.close();

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

//ReadFileUseDataStream.java

import java.io.DataInputStream;

import java.io.FileInputStream;

/**

* 使用DataInputStream读取自定义格式的文件

*/

public class ReadFileUseDataStream {

public static void main(String[] args) {

MyData data = readFile();

System.out.println(data.b);

System.out.println(data.n);

System.out.println(data.s);

int len = data.sh.length;

for(int i=0;i<len;++i)

System.out.println(data.sh[i]);

}

/**

* 从文件test.my中读取数据,并使用读取到的数据初始化data对象

@return 读取到的对象内容

*/

public static MyData readFile(){

MyData data = new MyData();

FileInputStream fis = null;

DataInputStream dis = null;

try{

//建立文件流

fis = new FileInputStream("test.my");

//建立数据输入流,流的嵌套

dis = new DataInputStream(fis);

//依次读取数据,并赋值给data对象

data.b = dis.readBoolean();

data.n = dis.readInt();

data.s = dis.readUTF();

int len = dis.readInt();

data.sh = new short[len];

for(int i=0;i<len;++i)

data.sh[i] = dis.readShort();

}catch(Exception e){

e.printStackTrace();

}finally{

try{

dis.close();

fis.close();

}catch(Exception e){

e.printStackTrace();

}

}

return data;

}

}

 

3. IO类的最主要的桥接流有两个:InputStreamReader和OutputStreamWriter。前者实现将InputStream及其子类的对象转换为Reader体系类的对象,实现将字节输入流转换为字符输入流;后者实现将OutputStream及其子类的对象转换为Writer体系类的对象,实现将字节输入流转换为字符输入流。需要注意的是,字符流无法转换为字节流。

4. IO类中有一组提高 读写效率的类,包括BufferedInputStream/BufferedOutputStream、BufferedReader/BufferedWriter。使用示例如下,该代码实现的功能是如果回显用户输入,当用户输入quit时程序退出。:

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class ReadConsoleWithBuffer {

public static void main(String[] args) {

BufferedReader br = null;

String s = null;

try{

//使用流的嵌套构造缓冲流

br = new BufferedReader(new InputStreamReader(System.in));

do{

//输出提示信息

System.out.println("请输入:");

//按行读取输入

s = br.readLine();

//输出用户输入

System.out.println(s);

}while(!s.equals("quit"));

}catch(Exception e){

e.printStackTrace();

}finally{

try{

br.close();

}catch(Exception e){

e.printStackTrace();

}

}

}

}

 

三、标准I/O

1. java.lang.System类提供了三个静态变量:

a) System.in:为InputStream类型,代表标准输入流,默认的数据源为键盘。

b) System.out:为PrintStream类型,代表标准输出流,默认的数据源为控制台。

c) System.err:为PrintStream类型,代表标准错误输出流,默认的数据源是控制台。

2. System类提供了一些用于重定向流的静态方法:

a) setIn(InputStream in):对标准输入流重定向。

b) setout(PrintStream out):对标准输出流重定向。

c) setErr(PrintStream out):对标准错误输出流重定向。

四、对象的序列化和反序列化

1. 只有实现了java.io.Serializable接口的类的对象才能被序列化和反序列化。JDK类库中的有些类(比如String类、包装类和Date类等)都实现了Serializable接口。

2. 对象的序列化包括以下步骤:

a) 创建一个对象输出流,它可以包装一个其他类型的输出流。

b) 通过对象输出流的writeObject()方法写对象。

3. 对象的反序列化包括以下步骤:

a) 创建一个对象输入流,它可以包装一个其他类型的输入流。

b) 通过对象输入流的readObject()方法读取对象。

4. 必须保证向对象输出流写对象的顺序与从对象输入流读对象的顺序一致。

5. 通过,对象中的所有属性都会被序列化,对于一些比较敏感的信息(比如用户的口令),应该禁止对这种属性进行序列化。解决的办法是把这些属性用transient修饰,这样它就不会参与序列化及反序列化过程。

6. 如果希望进一步控制序列化及反序列化的方式,可以在类中提供一个readObject()和writeObject()方法,当ObjectOutputStream/ObjectInputStream对一个对象进行序列化和反序列化时,如果该对象具有writeObject()或readObject()方法时,就会执行这一方法,否则就按默认方式序列化和反序列化。在writeObject()方法中可以调用ObjectOutputStream的defaultWriteObject()方法,使得对象输出流执行默认序列化操作;在readObject()方法中可以调用ObjectInputStream的defaultReadObject()方法,使得对象输入流执行默认反序列化操作。以下是示例代码:

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

public class User implements Serializable{

private String name;

private transient String password;

public User(String name,String password){

this.name = name;

this.password = password;

}

public String toString(){

return name+" "+password;

}

/**

* 加密数组,将buff数组中的每个字节的每一位取反

* 例如13的二进制形式为00001101,取反后为11110010

*/

private byte[] change(byte[] buff){

for(int i=0;i<buff.length;++i){

int b = 0;

for(int j=0;j<8;++j){

int bit = (buff[i]>>j & 1) == 0 ? 1 : 0;

b += (1<<j)*bit;

}

buff[i] = (byte)b;

}

return buff;

}

private void writeObject(ObjectOutputStream stream) throws IOException{

stream.defaultWriteObject(); //先按默认方式序列化

stream.writeObject(change(password.getBytes()));

}

private void readObject(ObjectInputStream stream) throws IOException,ClassNotFoundException{

stream.defaultReadObject(); //先按默认方式反序列化

byte[] buff = (byte[])stream.readObject();

password = new String(change(buff));

}

public static void main(String[] args) throws Exception {

User user = new User("Tom","123456");

System.out.println("Before Serializable:"+user);

ByteArrayOutputStream buf = new ByteArrayOutputStream();

//把User对象序列化到一个字节缓存中

ObjectOutputStream o = new ObjectOutputStream(buf);

o.writeObject(user);

//从字节缓存中反序列化User对象

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));

user = (User)in.readObject();

System.out.println("After Serializable:"+user);

}

}

ps:一些常用的例子 转自: http://www.iteye.com/topic/600665

例一:InputStream读取文件的应用:

Java代码    收藏代码
  1. import java.io.FileInputStream;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. public class TestJavaIo {  
  6.   
  7.     public static void main(String[] args) {  
  8.         int b=0;  
  9.         long num=0;  
  10.         InputStream in=null;  
  11.         try {  
  12.             in=new FileInputStream("D:/a.txt");  
  13.         } catch (FileNotFoundException e) {  
  14.             System.out.println("文件找不到");  
  15.             System.exit(-1);  
  16.         }  
  17.         try{  
  18.             while((b=in.read()) !=-1){       //b读取是字符的AI码
  19.                 System.out.println((char)b);  
  20.                 num++;  
  21.             }  
  22.             in.close();  
  23.             System.out.println();  
  24.             System.out.println("共读取了" + num + "个字节");  
  25.               
  26.             }catch(IOException e){  
  27.                 System.out.println("文件读取错误");  
  28.                 System.exit(-1);  
  29.             }  
  30.         }  
  31.     }  

 

例二:FileReader的应用:

Java代码    收藏代码
  1. import java.io.FileNotFoundException;  
  2. import java.io.FileReader;  
  3. import java.io.IOException;  
  4. public class TestFileReader {  
  5.   
  6.     public static void main(String[] args) {  
  7.         FileReader fr=null;  
  8.         int c=0;  
  9.         int ln=0;  
  10.         try {  
  11.             fr=new FileReader("D:/a.txt");  
  12.             while((c=fr.read())!=-1){  
  13.                 System.out.println((char)c);  
  14.                 ln++;  
  15.             }   
  16.             fr.close();  
  17.               
  18.            //主要这里的ln的值,当有中文字符时,一个中文字符还是算一个,  
  19.             //但InputStream时就一个中文就两个,由此可以看出Reader和Input的区别
  20.             System.out.println("共有:"+ln+"个字符");  
  21.         } catch (FileNotFoundException e) {  
  22.             e.printStackTrace();  
  23.         }catch (IOException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.   
  28. }  

 

 

例三:BufferedReader与BufferWriter的应用:

 

Java代码    收藏代码
  1. import java.io.BufferedReader;  
  2. import java.io.BufferedWriter;  
  3. import java.io.FileReader;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6.   
  7. public class TestBufferedReader {  
  8.   
  9.     public static void main(String[] args) {  
  10.         try {  
  11.             //BuffererReader等就像在原来的字节流的基础上套一个更大的水管,  
  12.             //让出水量更大读取的速度更快。
  13.             BufferedWriter bw=new BufferedWriter(new FileWriter("D:/aa.txt"));  
  14.             BufferedReader br=new BufferedReader(new FileReader("D://aa.txt"));  
  15.             String s=null;  
  16.             for(int i=0;i<=100;i++){  
  17.                 s=String.valueOf(10+(long)(Math.random()*30));  
  18.                 bw.write(s);  
  19.                 bw.newLine(); //创建一个换行的标记 
  20.                   
  21.             }  
  22.             bw.flush();      //刷新缓冲区域。
  23.             while((s=br.readLine())!=null){   //readLine 就是水管的一个应用吧
  24.                 System.out.println(s);  
  25.             }  
  26.             bw.close();  
  27.             br.close();  
  28.         } catch (IOException e) {  
  29.             System.out.println("写入错误");  
  30.         }  
  31.     }  
  32.   
  33. }  

 

 例四:DataStream的应用:

Java代码    收藏代码
  1. import java.io.ByteArrayInputStream;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6.   
  7. public class TestDataStream {  
  8.   
  9.     public static void main(String[] args) {  
  10.         ByteArrayOutputStream bos=new ByteArrayOutputStream();  
  11.         DataOutputStream dos=new DataOutputStream(bos);  
  12.         try {  
  13. //            dos.writeFloat((float) Math.random());  
  14. //          dos.writeLong((long) Math.random());  
  15. //          dos.writeDouble((double) Math.random());  
  16. //          dos.writeChar((char) Math.random());
  17.               
  18.             dos.writeShort((short) Math.random());  
  19.             dos.writeBoolean(true);  
  20.             //注意ByteArrayInputStream的构造方法是参数要是一个数组  
  21.             ByteArrayInputStream bais=new ByteArrayInputStream(bos.toByteArray());  
  22.               
  23.             DataInputStream dis=new DataInputStream(bais);  
  24.             System.out.println(dis.available());  
  25.             //System.out.println(dis.readDouble());  
  26. //            System.out.println(dis.readInt());  
  27. //          System.out.println(dis.readFloat());  
  28. //          System.out.println(dis.readDouble());  
  29. //          System.out.println(dis.readChar());
  30.             System.out.println(dis.readShort());  
  31.               
  32.             System.out.println(dis.readBoolean());  
  33.             bos.close();  
  34.             bais.close();  
  35.               
  36.         } catch (IOException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.     }  
  40.   
  41. }  

 

 例五:ObjectStream的应用

Java代码    收藏代码
  1. import java.io.FileInputStream;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.ObjectInputStream;  
  6. import java.io.ObjectOutputStream;  
  7. import java.io.Serializable;  
  8.   
  9. public class TestObjectStream {  
  10.   
  11.     public static void main(String[] args) {  
  12.           
  13.         T t=new T();  
  14.         t.k=10;  
  15.           
  16.         try {  
  17.             FileOutputStream fos=new FileOutputStream("D:/testObjectIo.bak");  
  18.             ObjectOutputStream oos=new ObjectOutputStream(fos);  
  19.             oos.writeObject(t);  
  20.             oos.flush();  
  21.             oos.close();  
  22.               
  23.             FileInputStream fis=new FileInputStream("D:/testObjectIo.bak");  
  24.             ObjectInputStream bis=new ObjectInputStream(fis);  
  25.             T tReader= (T) bis.readObject();  
  26.             System.out.println(tReader.i + " " +tReader.j + " "+tReader.d + " " + tReader.k);  
  27.               
  28.         } catch (FileNotFoundException e) {  
  29.             e.printStackTrace();  
  30.         }catch(IOException e1){  
  31.             e1.printStackTrace();  
  32.         }catch(ClassNotFoundException e2){  
  33.             e2.printStackTrace();  
  34.         }  
  35.     }  
  36.       
  37. }  
  38.   
  39. class T implements Serializable{  
  40.     int i=2;  
  41.     int j=4;  
  42.     double d=2.5;  
  43.     transient int k=15;  
  44. //   int k=15;  
  45. }  

 

 

 

 例六:文件的目录复制

 

 

Java代码    收藏代码
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8.   
  9.   
  10. public class JavaIoCopyFile {  
  11.   
  12.     public static void main(String[] args) {  
  13.           
  14.         File sourceFile=new File("D:/test");  
  15.         File targetFile=new File("F:/jstl");  
  16.         copy(sourceFile,targetFile);  
  17.           
  18.     }  
  19.   
  20.     private static void copy(File sourceFile, File targetFile) {  
  21.         File tarpath=new File(targetFile,sourceFile.getName());  
  22.         if(sourceFile.isDirectory()){  
  23.             tarpath.mkdir();  
  24.             File[] dir=sourceFile.listFiles();  
  25.             for(int i=0;i<dir.length;i++){  
  26.                 copy(dir[i],tarpath);  
  27.             }  
  28.         }else{  
  29.             try {  
  30.                 InputStream is=new FileInputStream(sourceFile);  
  31.                 OutputStream os=new FileOutputStream(tarpath);  
  32.                   
  33.                 byte[] buf=new byte[1024];  
  34.                 int len=0;  
  35.                 while((len= is.read(buf))!=-1){  
  36.                     os.write(buf);  
  37.                 }  
  38.                 System.out.println("复制完成");  
  39.                 is.close();  
  40.                 os.close();  
  41.                   
  42.             } catch (FileNotFoundException e) {  
  43.                 e.printStackTrace();  
  44.             }catch(IOException e1){  
  45.                 e1.printStackTrace();  
  46.             }  
  47.         }  
  48.     }  
  49.       
  50.       
  51.   
  52. }  

(三)Java IO 的一般使用原则 :  

一、按数据来源(去向)分类:

1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )

4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )

5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )

二、按是否格式化输出分:

1 、要格式化输出: PrintStream, PrintWriter

三、按是否要缓冲分:

1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )

四、按数据格式分:

1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类

五、按输入输出分:

1 、输入: Reader, InputStream 类型的子类

2 、输出: Writer, OutputStream 类型的子类

六、特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):

首先,考虑最原始的数据格式是什么: 原则四

第二,是输入还是输出:原则五

第三,是否需要转换流:原则六第 1 点

第四,数据来源(去向)是什么:原则一

第五,是否要缓冲:原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)

第六,是否要格式化输出:原则二

 

相关文章:

  • Symbol not found for architecture arm64 错误
  • java socket编程总结
  • 抉择
  • 浅出Java Socket 编程
  • Chapter 1 First Sight——36
  • Mysql笔记【3】-SQL约束
  • Comparable与Comparator的区别
  • java异常分类
  • [51nod1610]路径计数
  • Effective Java 笔记(一)
  • Linux 下配置 Python IDE——Emacs
  • java面试题总结
  • mybatis中写sql语句时需要转义的字符
  • apache的作用和tomcat的区别
  • 微信公众号token验证失败的一些总结
  • [case10]使用RSQL实现端到端的动态查询
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CentOS 7 修改主机名
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Java 最常见的 200+ 面试题:面试必备
  • Java到底能干嘛?
  • jquery cookie
  • Lucene解析 - 基本概念
  • Magento 1.x 中文订单打印乱码
  • Markdown 语法简单说明
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python爬虫--- 1.3 BS4库的解析器
  • React Native移动开发实战-3-实现页面间的数据传递
  • React Transition Group -- Transition 组件
  • React中的“虫洞”——Context
  • scala基础语法(二)
  • Vue 重置组件到初始状态
  • 飞驰在Mesos的涡轮引擎上
  • 简单数学运算程序(不定期更新)
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 我的zsh配置, 2019最新方案
  • 学习HTTP相关知识笔记
  • 【云吞铺子】性能抖动剖析(二)
  • scrapy中间件源码分析及常用中间件大全
  • ​flutter 代码混淆
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​ubuntu下安装kvm虚拟机
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #14vue3生成表单并跳转到外部地址的方式
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (2)(2.10) LTM telemetry
  • (30)数组元素和与数字和的绝对差
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (论文阅读40-45)图像描述1
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)基于IDEA的JAVA基础12
  • (转)树状数组