Java 第十一周总结
第十一周的作业。
目录
1.本章学习总结
2.Java Q&A
3.码云上代码提交记录及PTA实验总结
4.课后阅读
1.本章学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容。
- File既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。如果它指的是一个文件集,我们就可以对此集合调用list()方法,这个方法会返回一个字符串数组。
- 通过继承,任何自InputStream或Reader派生而来的类都含有名为read()的基本方法,用于读取单个字节或者字节数组。同样任何自OutputStream或Writer派生而来的类都含有名为write()的基本方法,用于写单个字节或者字节数组。
- 与输入有关的所有类都应该从InputStream继承,而与输出有关的所有类都应该从OutputStream继承。
- 通过叠合多个对象来提供多种不同功能的组合,这就是装饰器的设计模式。
- 与InputStream和OutputStream面向字节IO不同的是,Reader和Writer是兼容Unicode与面向字符的IO。
- RandomAccessFile适用于由大小已知的记录组成的文件,所以我们可以使用seek()进行记录的读取或者修改。
- I/O流的典型使用方式:
- BufferedReader用于缓冲输入文件,通过减少实际对磁盘的读写来提高速度。
- 格式化的输入可以使用DataInputStream,available()方法可以查看还有多少可供存取的字符。虽然PrintWriter也可以对数据进行格式化,但是为了输出一个可供另一个流恢复的数据,用DataOutputStream写入数据,用DataInputStream恢复数据更好。
2.Java Q&A
将Student对象(属性:int id, String name,int age,double grade)写入文件student.data、从文件读出显示。
1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读)
1.1 生成的三个学生对象,使用PrintWriter的println方法写入student.txt,每行一个学生,学生的每个属性之间用|作为分隔。使用Scanner或者BufferedReader将student.txt的数据读出。(截图关键代码,出现学号)
1.2 生成文件大小多少?分析该文件大小
生成文件大小:48字节
属性 | 字节数 |
---|---|
num | 1 |
name | 4 |
age | 2 |
score | 4 |
分隔符(共三个) | 3 |
行末尾 | 2 |
一行 | 16 |
1.3 如果调用PrintWriter的println方法,但在后面不close。文件大小是多少?为什么?
0字节
因为数据写到缓冲区上,原来有close()方法自动调用flush()来刷新,但是现在没有close()了,所以数据在缓冲区上直接丢失了。
2.缓冲流
2.1 使用PrintWriter往文件里写入1千万行(随便什么内容都行),然后对比使用BufferedReader与使用Scanner从该文件中读取数据的速度(只读取,不输出),使用哪种方法快?请详细分析原因?提示:可以使用junit4对比运行时间
用BufferedReader更快,因为使用缓冲可以减少IO次数,可以防止每次读取时都得进行实际的读操作。其实Scanner也有缓冲区,但是相比于BufferedReader要小不少。
2.2 将PrintWriter换成BufferedWriter,观察写入文件的速度是否有提升。记录两者的运行时间。试分析原因
有提升,同样是因为BufferedWriter使用了缓冲技术
3. 字符编码
3.1 现有EncodeTest.txt 文件,该文件使用UTF-8编码。使用FileReader与BufferedReader将EncodeTest.txt的文本读入并输出。是否有乱码?为什么会有乱码?如何解决?(截图关键代码,出现学号)
有乱码,因为FileReader并没有实现父类中带字符集参数的构造函数,只能按系统默认的字符集来解码。
这样解决:
3.2 编写一个方法convertGBK2UTF8(String src, String dst),可以将以GBK编码的源文件src转换成以UTF8编码的目的文件dst。
4. 字节流与二进制文件:DataInputStream、 DataOutputStream、ObjectInputStream
4.1 参考DataStream目录,尝试将三个学生对象的数据写入文件,然后从文件读出并显示。(截图关键代码,出现学号)
4.2 生成的文件有多大?分析该文件大小。将该文件大小和题目1生成的文件对比是大了还是小了,为什么?
51字节:一个int4字节,一个double8字节,名字都只有3个字符,再加上正文结束标识符(两个字符),每个名字有5个字符,一个字符一字节,每个名字5个字节。一个学生17个字节,一共三名学生,51字节。
4.3 使用wxMEdit的16进制模式(或者其他文本编辑器的16进制模式)打开student.data,分析数据在文件中是如何存储的。
分析数据是这样存储的:
0000 000c -> 12
4055 c000 0000 0000 -> 87.50
0003 7177 65 -> qwe
00 0000 0a -> 10
40 52e0 0000 0000 00 -> 75.5
00 0366 6666 -> fff
0000 0008 -> 8
404f 0000 0000 0000 -> 62.0
0003 6376 62 -> cvb
4.4 使用ObjectInputStream(读), ObjectOutputStream(写)读写学生。(截图关键代码,出现学号) //参考ObjectStreamTest目录
5. Scanner基本概念组装对象
编写public static List readStudents(String fileName);从fileName指定的文本文件中读取所有学生,并将其放入到一个List中。应该使用那些IO相关的类?说说你的选择理由。
首先使用BufferedReader,使用缓冲技术,让读写更高效!
然后因为要读UTF-8格式的文件,所以需要用到InputStreamReader,然后输入流由FileInputStream提供支持。
当然使用Scanner也不错的。
6.RandomAccessFile
6.1 使用RandomAccessFile实现题目1.1。(截图关键代码,出现学号)
6.2 分析文件大小
72字节
属性 | 字节数 |
---|---|
num | 4 |
name(两个中文字符) | 6 |
字符串结尾 | 2 |
age | 4 |
score | 8 |
一行 | 24 |
7.文件操作
编写一个程序,可以根据指定目录和文件名,搜索该目录及子目录下的所有文件,如果没有找到指定文件名,则显示无匹配,否则将所有找到的文件名与文件夹名显示出来
7.1 编写public static void findFile(String path,String filename)函数,以path指定的路径为根目录,在其目录与子目录下查找所有和filename相同的文件名,一旦找到就马上输出到控制台。(截图关键代码,出现学号)
7.2 加分点:使用队列、使用图形界面、使用Java NIO.2完成(任选1)
DFS改成BFS,EZ:
7.3 选做:实现删掉指定目录及其子目录下的所有空文件夹
(见题4.3)
稍作改动就可以删了
7.4 选做:将指定目录及子目录下的所有.java文件,转化成UTF-8编码格式,并测试。
8. 正则表达式
8.1 如何判断一个给定的字符串是否是10进制数字格式?尝试编程进行验证。(截图关键代码,出现学号)
题目是这个意思吗= =,但是应该用个比较厉害的,比如
8.2 选做:修改HrefMatch.java,尝试匹配网页中的数字字符串、匹配网页中的图片字符串。
String patternDigitString = "[+-]?[0-9]+";
倒数第二张图:
8.3 选做(较难):进一步改造上面的程序,获得图片的链接,如IMG src="images/mail1.gif",然后经过处理,生成该图片的实际链接地址http://cec.jmu.edu.com/images/mail1.gif。最后将生成的若干地址,放入一个队列。编写方法,可以依照该队列的所有图片地址,一次将图片下载下来。
3.码云上代码提交记录
题目集:多线程(4-4到4-10)
3.1 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
4. 课外阅读
4.1 尝试翻译Lesson: Basic I/O中的Summary
概要
该java.io包中包含很多类可以使你的程序用来读取和写入数据。大多数类实现顺序访问流。顺序访问流可以分为两类:读写字节和读写Unicode字符。每个顺序访问流都具有各自的特性,例如读取或写入一个文件,当 读写的时候筛选数据,或序列化一个对象。
java.nio.file包为文件和文件系统I/O提供广泛支持。这是一个非常全面的API,但关键切入点如下:
- Path类有几个操作路径的方法。
- Files类有文件操作方法,如移动,复制,删除,也有用于检索和设置文件属性的方法。
- FileSystem类有各种用于获取有关文件系统的信息的方法。
关于NIO.2的更多信息可以在java.net的OpenJDK:NIO项目网页中被找到。该网站包括很多NIO.2的本教程没有提及的功能,如多播,异步I/O,并创建自己的文件系统。
4.2 尝试完成Questions and Exercise
Questions
What class and method would you use to read a few pieces of data that are at known positions near the end of a large file?
想用RandomAccessFile来实现,但是标答说newByteChannel会更好,还没研究过,有时间看看,这都是nio的东西。When invoking format, what is the best way to indicate a new line?
%n是相对于\n更好的选择,因为后者不具有平台独立性。下面关于NIO的我都是先搬过来,后面再深入了解。
How would you determine the MIME type of a file?
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。MIME_百度百科
Files中的probeContentType()方法用来判断。What method(s) would you use to determine whether a file is a symbolic link?
symbolic link符号链接,又称为软链接,是作为另一个文件的引用。软链接对于应用来说是透明的,对于软链接的操作都会被重新定向到链接的目标文件中去。软连接的删除对于指向的文件没有任何影响,但是如果指向的文件被删除之后,软链接便会失效。Files类重有isSymbolicLink()来判断一个文件是否是一个符号链接。
Exercises
Exercise 1. Write an example that counts the number of times a particular character, such as e, appears in a file. The character can be specified at the command line. You can use xanadu.txt as the input file.
String line = null;
while ((line = bufferedReader.readLine()) != null) {
for (int i = 0; i < line.length(); i++) {
if (line.charAt(i) == lookFor) {
cnt++;
}
}
}
System.out.println(cnt);
bufferedReader.close();
Exercise 2. The file datafile begins with a single long that tells you the offset of a single int piece of data within the same file. Write a program that gets the int piece of data. What is the int data?
文件损坏了……
4.3 字符集与编码
4.4 Java正则表达式的语法与示例
匹配验证:
//编译正则表达式
Pattern pattern = Pattern.compile(regex)
//CASE_INSENSITIVE表示对大小写不敏感
Matcher matcher = pattern.matcher(str);
// 字符串是否与正则表达式相匹配
return matcher.matches;
//()返回一个boolean值,表示是否匹配
字符串中查询字符或者字符串:
matcher.find()用来查找主串当中是否有包含我们需要的字符串,如果有包含,我们就可以调用matcher.start()和matcher.end()来获取该匹配字符串的开始和结尾。
看的不过瘾的请点下面
回到顶部
又是做的很糙的一次,笑容尬住