Skip to content

Commit 6fa31b2

Browse files
committed
测试mybatis
1 parent 0ce4d2c commit 6fa31b2

27 files changed

Lines changed: 816 additions & 65 deletions

src/com/yale/test/io/ByteArrayInputStreamDemo.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,14 @@ public static void main(String[] args) throws IOException {
2424
System.out.println(output);//直接输出对象,调用toString()方法
2525
input.close();
2626
output.close();
27+
28+
//ByteArrayInputStream实际上是把一个byte[]数组在内存中变成一个InputStream
29+
byte[] data = {72, 101, 108, 108, 111, 33};
30+
try(InputStream inpub = new ByteArrayInputStream(data)) {
31+
int n;
32+
while ((n = inpub.read()) != -1) {
33+
System.out.println("一次读一个字节byte:" + (char)n);
34+
}
35+
}
2736
}
2837
}

src/com/yale/test/io/FileTest.java

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,50 @@
55
import java.io.File;
66
import java.io.FileInputStream;
77
import java.io.FileOutputStream;
8+
import java.io.FilenameFilter;
89
import java.io.IOException;
910
import java.io.InputStreamReader;
1011
import java.io.OutputStreamWriter;
12+
import java.nio.file.Path;
13+
import java.nio.file.Paths;
1114

1215
public class FileTest {
1316
public static void main (String[] args) throws IOException {
1417

15-
18+
/*
19+
* 注意Windows平台使用\作为路径分隔符,在Java字符串中需要用\\表示一个\。Linux平台使用/作为路径分隔符:
20+
* 可以用.表示当前目录,..表示上级目录。
21+
* File对象有3种形式表示的路径,一种是getPath(),返回构造方法传入的路径,一种是getAbsolutePath(),返回绝对路径,
22+
* 一种是getCanonicalPath,它和绝对路径类似,但是返回的是规范路径。
23+
*/
24+
25+
File wf = new File("C:\\Windows\\notepad1.exe");
26+
System.out.println("删除文件:" + wf.delete());
27+
28+
File linuxF = new File("/usr/bin/javac");
29+
30+
File ff = new File("..");
31+
System.out.println("..:" + ff.getPath());
32+
System.out.println("绝对路径:" + ff.getAbsolutePath());
33+
System.out.println("规范路径:" + ff.getCanonicalPath());
34+
35+
System.out.println("文件是否可读:" + ff.canRead());
36+
System.out.println("文件是否可写(对目录而言,是否可执行表示能否列出它包含的文件和子目录。):" + ff.canWrite());
37+
System.out.println("文件是否执行:" + ff.canExecute());
38+
System.out.println("文件字节大小:" + ff.length());
39+
40+
File f = File.createTempFile("temp-", ".txt");//创建一个临时文件
41+
f.deleteOnExit();//VM退出时自动删除
42+
System.out.println("临时文件的路径:" + f.getAbsolutePath());
43+
44+
//因为Windows和Linux的路径分隔符不同,File对象有一个静态变量用于表示当前平台的系统分隔符:
45+
System.out.println("根据当前平台打印" + File.separator);// 根据当前平台打印"\"或"/"
46+
1647
File file = new File("file.txt");
1748
System.out.println("判断路径是否是一个文件" + file.isFile());
1849

50+
51+
1952
//下面这个俩个构造方法是一个意思
2053
//File file = new File("d:\\javaio\\file.txt");
2154
//File file = new File("fd:\\javaio", "file.txt");
@@ -65,5 +98,43 @@ public static void main (String[] args) throws IOException {
6598
in.close();
6699
System.out.println(file.getAbsolutePath() + "存在");
67100
}
101+
102+
//当File对象表示一个目录时,可以使用list()和listFiles()列出目录下的文件和子目录名。listFiles()提供了一系列重载方法,可以过滤不想要的文件和目录:
103+
File flist = new File("C:\\Windows");
104+
File[] fs1 = flist.listFiles();
105+
printFiles(fs1);
106+
107+
File[] fs2 = flist.listFiles(new FilenameFilter(){
108+
@Override
109+
public boolean accept(File dir, String name){
110+
return name.endsWith(".exe");
111+
}
112+
});
113+
printFiles(fs2);
114+
115+
//Java标准库还提供了一个Path对象,它位于java.nio.file包。Path对象和File对象类似,但操作更加简单:
116+
//如果需要对目录进行复杂的拼接、遍历等操作,使用Path对象更方便。
117+
Path p1 = Paths.get(".", "project", "strudy");// 构造一个Path对象
118+
System.out.println("Paht:" + p1);
119+
Path p2 = p1.toAbsolutePath();//转换为绝对路径
120+
System.out.println(p2);
121+
Path p3 = p2.normalize();// 转换为规范路径
122+
System.out.println(p3);
123+
File fp = p3.toFile();//转换为File对象
124+
System.out.println(fp);
125+
for (Path p: Paths.get("..").toAbsolutePath()) {
126+
System.out.println("可以直接遍历p:" + p);
127+
}
128+
129+
}
130+
131+
static void printFiles(File[] files) {
132+
System.out.println("=============");
133+
if (files != null) {
134+
for (File f: files) {
135+
System.out.println(f);
136+
}
137+
}
138+
System.out.println("=============");
68139
}
69140
}

src/com/yale/test/io/file/Copy.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public static void copyHandle(InputStream in, OutputStream output) throws IOExce
5757
int temp = 0;//读取到的数据长度
5858
do {
5959
temp = in.read();//一次读一个字节,效率极低,工作中绝对不用
60+
61+
//这个方法会写入一个字节到输出流。要注意的是,虽然传入的是int参数,但只会写入一个字节,即只写入int最低8位表示字节的部分(相当于b & 0xff)。
6062
output.write(temp);
6163
} while(temp != -1);
6264
long end = System.currentTimeMillis();

src/com/yale/test/io/file/FileInputStreamDeom.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import java.io.IOException;
77
import java.io.InputStream;
88

9+
/*
10+
* 如果数据源不是文本,就只能使用InputStream,如果数据源是文本,使用Reader更方便一些。Writer和OutputStream是类似的。
11+
*/
912
public class FileInputStreamDeom {
1013

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

src/com/yale/test/io/file/FileOutputStreamDemo.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ public static void main(String[] args) throws IOException {
3333
String msg = "www.mldn.cn";
3434
os.write(msg.getBytes());//将msg转换为字节,写入文件
3535
//flush会把内容,立马写到硬盘里面去,如果你开发servlet,往浏览器里面输出东西,你不能调用flush方法,因为你flush的时候,代码还不知道把内容写往哪里,浏览器不是你本地文件
36+
/*
37+
* 要特别注意:OutputStream还提供了一个flush()方法,它的目的是将缓冲区的内容真正输出到目的地。
38+
* 为什么要有flush()?因为向磁盘、网络写入数据的时候,出于效率的考虑,操作系统并不是输出一个字节就立刻写入到文件或者发送到网络,而是把输出的字节先放到内存的一个缓冲区里(本质上就是一个byte[]数组),等到缓冲区写满了,再一次性写入文件或者网络。对于很多IO设备来说,一次写一个字节和一次写1000个字节,花费的时间几乎是完全一样的,所以OutputStream有个flush()方法,能强制把缓冲区内容输出。
39+
* 通常情况下,我们不需要调用这个flush()方法,因为缓冲区写满了OutputStream会自动调用它,并且,在调用close()方法关闭OutputStream之前,也会自动调用flush()方法。
40+
* 但是,在某些情况下,我们必须手动调用flush()方法。举个栗子:
41+
* 小明正在开发一款在线聊天软件,当用户输入一句话后,就通过OutputStream的write()方法写入网络流。小明测试的时候发现,发送方输入后,接收方根本收不到任何信息,怎么肥四?
42+
* 原因就在于写入网络流是先写入内存缓冲区,等缓冲区满了才会一次性发送到网络。如果缓冲区大小是4K,则发送方要敲几千个字符后,操作系统才会把缓冲区的内容发送出去,这个时候,接收方会一次性收到大量消息。
43+
* 解决办法就是每输入一句话后,立刻调用flush(),不管当前缓冲区是否已满,强迫操作系统把缓冲区的内容立刻发送出去。
44+
* 实际上,InputStream也有缓冲区。例如,从FileInputStream读取一个字节时,操作系统往往会一次性读取若干字节到缓冲区,并维护一个指针指向未读的缓冲区。然后,每次我们调用int read()读取下一个字节时,可以直接返回缓冲区的下一个字节,避免每次读一个字节都导致IO操作。当缓冲区全部读完后继续调用read(),则会触发操作系统的下一次读取并再次填满缓冲区。
45+
*/
3646
os.flush();//即使下面的代码报错,也能把内容写到硬盘里面
3747
//int sdf = 1/0;
3848
msg = "www.mldn.cn\r\n";//换行

src/com/yale/test/io/file/ReaderDemo.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import java.io.IOException;
77
import java.io.Reader;
88

9+
/*
10+
* 如果数据源不是文本,就只能使用InputStream,如果数据源是文本,使用Reader更方便一些。Writer和OutputStream是类似的。
11+
*/
912
public class ReaderDemo {
1013
public static void main(String[] args) throws IOException {
1114
File file = new File("d:" + File.separator + "JavaDemo" + File.separator + "Writer.txt");

src/com/yale/test/io/file/TestAutoCloseable.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package com.yale.test.io.file;
22

3+
import java.io.FileInputStream;
4+
import java.io.FileNotFoundException;
5+
import java.io.FileOutputStream;
6+
import java.io.IOException;
7+
import java.io.InputStream;
8+
import java.io.OutputStream;
9+
310
class Message implements AutoCloseable{
411
public Message() {
512
System.out.println("AutoCloseable接口是JDK1.7才有的接口");
@@ -17,10 +24,25 @@ public void close() throws Exception {
1724
public class TestAutoCloseable {
1825

1926
public static void main(String[] args) {
27+
/*
28+
* 编译器只看try(resource = ...)中的对象是否实现了java.lang.AutoCloseable接口,如果实现了,就自动加上finally语句并调用close()方法。
29+
* InputStream和OutputStream都实现了这个接口,因此,都可以用在try(resource)中。
30+
*/
2031
try (Message msg = new Message()){//必须在try语句里面定义对象
2132
msg.print();
2233
} catch (Exception e) {
2334
e.printStackTrace();
2435
}
36+
37+
// 同时操作多个AutoCloseable资源时,在try(resource) { ... }语句中可以同时写出多个资源,用;隔开。例如,同时读写两个文件:
38+
try (InputStream input = new FileInputStream("input.txt");
39+
OutputStream output = new FileOutputStream("output.txt"))
40+
{
41+
input.read(); // transferTo的作用是?
42+
} catch (FileNotFoundException e) {
43+
e.printStackTrace();
44+
} catch (IOException e) {
45+
e.printStackTrace();
46+
}
2547
}
2648
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.yale.test.io.file;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.FileNotFoundException;
6+
import java.io.FileOutputStream;
7+
import java.io.IOException;
8+
import java.util.zip.ZipEntry;
9+
import java.util.zip.ZipInputStream;
10+
import java.util.zip.ZipOutputStream;
11+
12+
/*
13+
* ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容:
14+
* ┌───────────────────┐
15+
│ InputStream │
16+
└───────────────────┘
17+
18+
19+
┌───────────────────┐
20+
│ FilterInputStream │
21+
└───────────────────┘
22+
23+
24+
┌───────────────────┐
25+
│InflaterInputStream│
26+
└───────────────────┘
27+
28+
29+
┌───────────────────┐
30+
│ ZipInputStream │
31+
└───────────────────┘
32+
33+
34+
┌───────────────────┐
35+
│ JarInputStream │
36+
└───────────────────┘
37+
38+
另一个JarInputStream是从ZipInputStream派生,它增加的主要功能是直接读取jar文件里面的MANIFEST.MF文件。
39+
因为本质上jar包就是zip包,只是额外附加了一些固定的描述文件。
40+
*
41+
*/
42+
public class ZipInputStreamDemo {
43+
44+
public static void main(String[] args) {
45+
/*
46+
* 读取zip包
47+
* 我们要创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束。
48+
* 一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,直到返回-1:
49+
*/
50+
try(ZipInputStream zip = new ZipInputStream(new FileInputStream(""))) {
51+
ZipEntry entry = null;
52+
while ((entry = zip.getNextEntry()) != null) {
53+
String name = entry.getName();
54+
if (!entry.isDirectory()) {
55+
int n;
56+
while ((n = zip.read()) != -1) {
57+
58+
}
59+
}
60+
}
61+
} catch (FileNotFoundException e) {
62+
e.printStackTrace();
63+
} catch (IOException e) {
64+
e.printStackTrace();
65+
}
66+
67+
/*
68+
* 读取zip包
69+
* 我们来看看ZipInputStream的基本用法。
70+
* 我们要创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束。
71+
* 一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,直到返回-1:
72+
* 下面的代码没有考虑文件的目录结构。如果要实现目录层次结构,new ZipEntry(name)传入的name要用相对路径。
73+
*/
74+
try(ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(""))){
75+
File[] files = new File("").listFiles();
76+
for (File file: files) {
77+
zip.putNextEntry(new ZipEntry(file.getName()));
78+
//zip.write(getFileDataAsBytes(file));
79+
zip.closeEntry();
80+
}
81+
} catch (FileNotFoundException e) {
82+
e.printStackTrace();
83+
} catch (IOException e) {
84+
e.printStackTrace();
85+
}
86+
}
87+
}

src/com/yale/test/io/imooc/BufferedReaderDemo.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
public class BufferedReaderDemo {
1313

1414
public static void main(String[] args) throws IOException {
15+
/*
16+
* 注意到在叠加多个FilterInputStream,我们只需要持有最外层的InputStream,并且,当最外层的InputStream关闭时(在try(resource)块的结束处自动关闭),
17+
* 内层的InputStream的close()方法也会被自动调用,并最终调用到最核心的“基础”InputStream,因此不存在资源泄露。
18+
*/
1519
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("d:" + File.separator + "JavaDemo" + File.separator + "info2.txt")));
1620
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:" + File.separator + "JavaDemo" + File.separator + "info3.txt")));
1721

src/com/yale/test/io/imooc/FileOutputStreamDemo.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@
44
import java.io.FileOutputStream;
55
import java.io.IOException;
66

7+
/*
8+
* 如果数据源不是文本,就只能使用InputStream,如果数据源是文本,使用Reader更方便一些。Writer和OutputStream是类似的。
9+
* 同步和异步
10+
* 同步IO是指,读写IO时代码必须等待数据返回后才继续执行后续代码,它的优点是代码编写简单,缺点是CPU执行效率低。
11+
* 而异步IO是指,读写IO时仅发出请求,然后立刻执行后续代码,它的优点是CPU执行效率高,缺点是代码编写复杂。
12+
* Java标准库的包java.io提供了同步IO,而java.nio则是异步IO。上面我们讨论的InputStream、OutputStream、Reader和Writer都是同步IO的抽象类,对应的具体实现类,以文件为例,有FileInputStream、FileOutputStream、FileReader和FileWriter。
13+
* 本节我们只讨论Java的同步IO,即输入/输出流的IO模型。
14+
* Java的IO标准库提供的InputStream根据来源可以包括:
15+
FileInputStream:从文件读取数据,是最终数据源;
16+
ServletInputStream:从HTTP请求读取数据,是最终数据源;
17+
Socket.getInputStream():从TCP连接读取数据,是最终数据源;
18+
GZIPInputStream
19+
*/
720
public class FileOutputStreamDemo {
821

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

0 commit comments

Comments
 (0)