`
unique5945
  • 浏览: 134479 次
  • 来自: 杭州
社区版块
存档分类
最新评论

看张孝祥视频学习Java IO笔记

    博客分类:
  • JAVA
阅读更多
File
1、File即可表示文件也可表示文件夹
2、在创建File对象时,若要做到系统无关可用File类的静态成员变量File.seperator,它会根据运行系统自动被解析为相应的分隔符,如widows系统以\为文件分隔符,而Linux、UNIX等则用/
3、File rootDir = new File(File.seperator);表示rootDir 指向当前目录的根目录(如E:\),此后可用File ff = new File(rootDir ,"aa"+File.seperator+"bb");在root:\a\下创建文件夹b(或文件b.txt)
4、File对象可直接调用delete()方法删除自己,但若该对象指向一个目录,仅当目录为空时才能被删除,若里面有文件,则需要构造一个递归的delete方法将目录及其子目录删除。有一个deleteOnExit()方法是用来在程序退出时删除文件对象,一般用在删除程序运行时创建的临时文件
5、list和listFiles,前者返回String[],后者返回File[]。
在list方法有个有用的重载方法String[] list(FilenameFilter f),可以把一个匿名的FilenameFilter类写成内部类,来过滤所列文件,如下例:
String[] names = f.list(new FilenameFilter(){
public boolean accept(File dir,String name){
return name.indexOf(".java")!=-1//返回所以.java文件
}
}
);

I/O
1、流的分类
a、节点流:从特定地方读写的流类
b、过滤流(装饰):使用节点流作为输入或输出,为其提供额外的功能
2、InputStream:
常用方法
abstract int read():读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。
int read(byte[] b):将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1同上。
int read(byte[] b,int off,int len):功能同上。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
long skip(long n):在输入流中跳过n个字节并返回实际跳过的字节数。
int available():返回在不发生阻塞的情况下,可读取的字节数。
void close():关闭输入流,释放相关系统资源。
void mark(in readlimit):在输入流的当前位置放置一个标记,如果读取的字节数多余readlimit设置的值,则忽略这个标记。(在InputStream中是空实现)
void reset():返回到上一个标记。(在InputStream中是空实现)
boolean markSupported():测试当前流是否支持mark和reset方法。如果支持,返回true,否则false。
InputStream——》FileInputStream
   ——》ByteArrayInputStream
   ——》FilterInputStream——————》DataInputStream
   ——》ObjectInputStream        ——》BufferedInputStream
   ——》PiledInputStream         ——》LineNumberInputStream(很少用)
   ——》SequenceInputStream      ——》PushbackInputStream(很少用)
   ——》StringBufferInputStream(Deprecated,被StringReader代替)

3、OutputStream
常用方法
abstract void write(int b)
void write(byte[] b)
void write(byte[] b,int off,int len)
参数含义和方法含义InputStream对应
void flush():刷新输出流,强制缓冲区中的输出字节被写出。(用于使用了缓存的输出流,有时候不等缓存满我们就想将缓冲区中数据写出去,则可用该方法,在OutputStream中是空实现)
void close():关闭输出流,释放相关资源。

OutputStream——》FileOutputStream
    ——》ByteArrayOutputStream
            ——》FilterOutputStream——————》DataOutputStream
    ——》ObjectOutputStream        ——》BufferedOutputStream
    ——》PiledOutputStream         ——》PrintStream

4、FileOutputStream/FileInputStream
节点流,用于从文件中读取或在文件中写入字节流,如果构造FileOutputStream时文件已经存在,则覆盖这个文件!可用文件名或File对象构造,并且重写了三个writer方法。
例子:
FileOutputStream fos = new FileOutputStream("1.txt");
fos.write("hello world".getByte());
fos.close();

FileInputStream fis = new FileInputStream("1.txt");
byte[] buf = new byte[100];
int len = fis.read(buf);
fis.close();

5、BufferedInputStream/BufferedOutputStream(BufferedInputStream实现了void reset()和boolean markSupported();BufferedOutputStream实现了void flush())
装饰流,提供缓存功能,需要由已有的输入输出流创建
例子1:
FileOutputStream fos = new FileOutputStream("1.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write("hello world".getByte());
//bos.flush();如果没有调用关闭也不调用flush,字符串就会留在缓存里而不写入到文件中,因为缓冲还没有满
bos.close(); //如果没有调用flush而是调用了close,字符串会被写到文件中,因为此时表明输入结束,无论缓存是否满都应将数据写出
多个流对象组成的复合流对象只要关闭最外面那个,里面的流对象都会自动关闭,不用每个都调用close
例子2:
FileInputStream fis = new FileInputStream("1.txt");
BufferedInputStream bis = new BufferedInputStream (fis);
byte[] buf = new byte[100];
int len = bis.read(buf);//以缓存读的方式将t.txt中的数据读入到buf中,并返回读取字节数len
System.out.println(new String(buf,0,len));//打印出读取到buf中的部分
bis.close();

6、DataInputStream/DataOutputStream
过滤流,提供了读取/写入java中基本数据的功能,需要由已有的输入输出流创建。
DataOutputStream dos = new DataOutputStream(bos);//此处以bos为基础创建DataOutputStream相当于在原有缓冲输出流的基础上在增加了写入java基本类型的功能。当然此处也能仅以fos为基础创建
byte b = 3;
int i = 78;
char ch = 'a';
float f = 4.5f;
dos.writeByte(b);
dos.writeInt(i);
dos.writeChar(ch);
dos.writeFloat(f);
dos.close();

DataInputStream dis = new DataInputStream(bis);
System.out.println(dis.readByte());
System.out.println(dis.readInt());
System.out.println(dis.readChar());
System.out.println(dis.readFloat());
dis.close(); 

7、PipedInputStream/PipedOutputStream
管道流,属于节点流,总是成对出现才有效。用于线程间通信,一个线程的PipedInputStream对象要从另一个线程的PipedOutputStream对象读取输入。
两种对象都可以用对方的对象来创建自己的对象,也可以在创建后用connect方法连接起来,以便完成输入输出任务。
例子:
class PipedStreamTest{
public static void main(String[] args){
PipedOutputStream pos = new PipedOutputStream();
PipedinputStream pis = new PipedInputStream();
try{
pos.connect(pis);//pis.connect(pos);both ok!
new Producer(pos).start();
new Consumer(pis).start();
}catch(Exception e){
e.printStackTrace();
}
}
}
class Producer extends Thread{
private PipedOutputStream pos;
public Producer(PipedOutputStream pos){
this.pos = pos;
}
public void run(){
try{
pos.writer("welcome you!".getBytes());
pos.close();
}catch(Exceptrion e){
e.printStackTrace();
}
}
}

class Consumer extends Thread{
pirvate pipedInputStream pis;
public Consumer(PipedInputStream pis){
this.pis = pis;
}
public void run(){
try{
byte[] buf = new byte[100];
int len = pis.read(buf);
System.out.println(new String(buf,0,len));
pis.close();
}catch(Exceptrion e){
e.printStackTrace();
}
}
}
运行结果:
welcome!

8、Read/Writer
Reader——》BufferedReader    ———》LinNumberReader
      ——》CharArrayReader
      ——》FilterReader      ———》PushbackReader
      ——》InputStreamReader ———》FileReader
      ——》PipedReader
      ——》StringReader
*张孝祥称没有把BufferedReader(BufferedWriter)设计成FilterReader(FilterWriter)子类是SUN公司的一个bug,真的是这样么?

*InputStreamReader充当字节流-->字符流的桥梁
Wirter——》BufferedWirter   
      ——》CharArrayWirter
      ——》FilterWirter  
      ——》OutputStreamWirter ———》FileWirter
      ——》PipedWirter
      ——》PrintWirter
      ——》StringWirter
*OutputStreamWirter 充当字符流-->字节流的桥梁

例子:
FileOutputStream fos = new FileOutputStream("1.txt");
//此处OutputStreamWriter 不是充当过滤流的角色,而是作为一个连接字节流-->字符流的桥梁
OutputStreamWriter osw = new OutputStreamWriter(fos);
//一般不会直接用OutputStreamWriter作为输出流,而会用它创建一个缓存输出流。虽然Writer类及其子类不是严格按照装饰类方式设计,但操作上与装饰类一致
BufferedWriter bw = new BufferedWriter(osw);
bw.writer("hello world!");
bw.close();

FileInputStream fis = new FileInputStream ("1.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
System.out.println(br.readLine());
br.close();

//从标准输出输出设备上读取
InputStreamReader isr1 = new InputStreamReader(System.in);
BufferedReader br1 = new BufferedReader(isr1);
String strLine;
While((strLine = br.readLine()) != null)
System.out.println(strLine);
br.close();

9、字符编码
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码):每个ASCII码与一个8位二进制数对应。其最高位是0,相应的十进制数是0-127

GB2312:中华人民共和国国家汉字信息交换用码。一个中文字符用两个字节的数字来表示,位了和ASCII码有所区别,将中文字符每一个字节的最高位置都用1来表示

GBK是GB2312的扩展码,对不常用的汉子和许多符号进行了编码。

ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集,而英文实际上只用了其中数字小于128的部分。

Unicode:对所有语言的文字进行了统一编码,对每个字符都用了2个字节来表示(即能表示65536种字符),对于英文字符采取前面加0字节的策略,实现了等长兼容。如“a”的ASCII码为0x61,Unicode就为0x00 0x61

UTF-8:Eight-bit UCS Transformation Format(UCS,Universal Character Set,通用字符集)一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节(汉字在UTF-8中是三个字节)

10、在java编程过程中需要注意的三处编码:
1)外部输入数据的编码:这与输入数据的编码有关
a、如果是用标准输入输入的数据,则是与当前操作系统的默认编码有关,例如用中文版的windows2000操作系统,起默认编码是GBK,因此若用标准输入System.in.read()读入的数据是经过GBK编码的,即读入的都是GBK的码值。
b、如果是用文件作为输入的话,如文本文件(txt、xml等),其编码与文件本身的编码有关(查看文件本身的编码可以用文本编辑器如notepad或UltraEdit等的另存为查看)。如在windowsXP操作系统中的txt文件默认用ANSI编码,若要改成别的编码可在另存为时将编码改成其他编码。
c、如果是从数据库中读取数据,则与具体数据库表的存储编码相关。

2)JVM的默认编码:这是JVM在执行解码/编码操作时默认采用的编码,可通过以下代码看到:
Porperties pps = System.getPorperties();
pps.list(System.out);//list接受一个OutputStream作为参数,此处用标准输出
在列表中的file.encoding=?项即表明当前JVM用的默认编码
若要修改默认编码可通过以下代码:
pps.put("file.encoding","ISO-8859-1");//此处将默认编码改为ISO-8859-1
在ecipse中有友好的图形化界面可设置。

3)java语言中字符串和字符类型的编码:java中的字符串和字符类型始终采用Unicode编码,任何数据想转换成字符串或字符打印的过程都叫解码,反之,将字符串和字符中的数据输入到别的载体中时叫编码。

由于上述三个编码的不统一常在编程中发生编解码乱码问题,例如:
java程序从外部输入流中(数据库、文件系统、标准输入等)中获得数据,外部数据以byte[]形式(A编码)被读入java程序内部,变成java中的String或char(若变成数值类型则不会碰到编码问题,此处不考虑这种情况),此时外部数据若没有特殊指定,就会按照jvm默认的编码被解码成unicode的String或char,如果默认的编码格式是A则相安无事,若不是,则解码后存在String对象或char变量中的字符已是乱码,若再转由输出流输出必然是乱码。

11、RandomAccessFile
RandomAccessFIile类同时实现了DataInput和DataOutput接口,提供了对文件随机存取的功能,利用这个类可以在文件的任何位置读取或写入数据。
RadndomAccessFile类提供了一个文件指针,用来标志要进行读写操作的下以数据的位置。
写入数据有三个方法:
writeByte(String s):写入一个字节,一般用户西文字符的输入,因为它写入一个字符(因为String可以视为char[],它以char为单位写入)的前半个字节,舍弃后半个字节,因为西文字符后半字节为空。因为当输入字符中有西文字符时不建议使用
writeChar(String s):写入整个字符信息
writeUTF(String s):按UTF-8编码写入信息,如西文字符输入两个字节的编码,中文字符则为三个字节。这个方法会在输入数据的前两个字节里记录共输入几个字节字符,因此读取时比较有方便,对应也有一个String readUTF()方法。
RandomAccessFile的构造方法:
RandomAccessFile(File file, String mode) 、RandomAccessFile(String name, String mode) 。mode为存储格式,可以为"r"、"rw"、"rws、"rwd"
例子:

class RandomFileTest{
public static void main(String[] args)throws Exception{
Studend s1 = new Student(1,"zhangsan",98.5);
Studend s2 = new Student(2,"lisi",95.5);
Studend s3 = new Student(3,"wangwu",78.5);
RandomAccessFile raf = new
}
}
分享到:
评论

相关推荐

    张孝祥JAVA学习笔记

    张孝祥课程学习笔记,包括JAVA基础,JAVA高级,JavaScript全部的笔记,适合初学者。

    张孝祥java基础加强视频教程笔记

    【Java基础加强】张孝祥的Java教学视频涵盖了Java编程语言的基础到进阶知识,旨在帮助学习者巩固和提升Java编程技能。以下是根据教程笔记整理的一些关键知识点: 1. **Java简介**:Java是一种跨平台的面向对象的...

    笔记_张孝祥_Java多线程与并发库高级应用

    张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。

    《张孝祥JAVA视频教程》完整版[RMVB]

    第一部分 ed2k://|file|[张孝祥JAVA视频教程!(1-5课)].lesson01.[XiDong.Net].rmvb|555980477|1954514FA6C5757740064027D85826C1|h=EDKWEPSDDPS42...是一套完整版的java学习视频,也是一套值得学习的视频课程。

    -张孝祥java视频教程56集

    java 教程 下载 -张孝祥java视频教程56集

    张孝祥整理的JAVA面试题宝典下载

    这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的朋友在笔试时更好地赢得笔试和面试。由于这套面试题涉及的范围很泛,很广,很杂,至少需要一个月的时间才能消化和...

    张孝祥Java视频教程__源代码

    【描述】"张孝祥Java视频教程源代码"表明此资源是配合张孝祥的Java教学视频使用的,提供了实际操作中的源代码,使得学习者可以对照视频内容进行编程练习,加深对Java语法和编程技巧的掌握。 【标签】"张孝祥"代表了...

    张孝祥老师讲解java的多线程的配套ppt

    张孝祥老师讲解java的多线程的配套ppt,很实用的

    张孝祥整理的JAVA面试题宝典

    张孝祥整理的JAVA面试题宝典,无疑为准备Java面试的求职者提供了一份宝贵的参考资料。下面,我们将深入探讨其中可能涉及的一些关键知识点。 1. **基础语法**:面试通常会从Java的基础开始,包括数据类型(原始与...

    java基础学习总结笔记

    本文档是基于毕向东老师的java基础视频和张孝祥老师的高薪技术视频和银行管理系统以及交通灯管理系统的视频所做的笔记。 知识主要包括:Java基础常识、如何安装Java工具、Java语言的基础组成、Java面向对象、Java多...

    传智播客张孝祥Java邮件开发学习笔记

    在本学习笔记中,博主孙风涛详细记录了张孝祥讲师主讲的《Java邮件开发》课程,涵盖了电子邮件基础知识、邮件协议、JavaMail API的使用、邮件内容的组织、编码及发送过程,以及在Web应用中集成邮件功能的实践。...

    张孝祥Java就业培训教程电子书(超星版)

    总而言之,《张孝祥Java就业培训教程电子书(超星版)》是一本覆盖全面、深入实用的Java学习资料,无论是对初学者还是有一定经验的开发者,都能从中受益匪浅,为自己的Java开发职业生涯奠定坚实的基础。通过学习这本书...

    张孝祥高清Java视频教程下载

    张孝祥的高清Java教程,下载的是百度云盘中的链接和提取码,可以用百度云根据提供的链接和密码下载教程。

    张孝祥等八份JAVA面试资料总汇

    【JAVA面试】相关的知识点涵盖了Java语言...以上内容是基于"张孝祥等八份JAVA面试资料总汇"中的主要知识点,涵盖了Java程序员面试的大部分领域。通过深入学习和实践,能够为面试者提供坚实的技术基础和应对面试的自信。

    Java视频教程[张孝祥]种子

    总之,"Java视频教程[张孝祥]"是一套全面且实用的Java学习资源,无论你是零基础的编程新手,还是希望进一步提升Java技能的开发者,都能从中受益。13G多的内容包含了大量的视频材料,足以保证学习的深度和广度。如果...

    张孝祥Java邮件开发详解

    本教程“张孝祥Java邮件开发详解”深入探讨了如何使用Java来实现邮件的发送功能,涵盖了从基础概念到高级特性的全方位讲解。 首先,Java Mail API是Java中用于处理邮件的核心库,它提供了丰富的类和接口,使得...

    张孝祥Java多线程与并发库高级应用笔记

    张孝祥的这套视频教程旨在深化Java线程技术的学习,帮助已有一定基础的开发者进一步提升技能。它并非面向完全的初学者,学习过程可能较为艰难,需反复研习方能深入理解。一旦掌握,学员将对Java线程技术有更为卓越的...

    张孝祥正在整理Java.doc张孝祥正在整理Java.doc

    12. **IO流**:Java的输入输出流体系提供了读写文件、网络通信的能力,包括字节流和字符流两大类。 13. **多线程**:Java内置对多线程的支持,通过Thread类或实现Runnable接口可以创建和管理线程。 14. **网络编程...

    张孝祥java视频教材种子(全)

    张孝祥java视频教材,本教材从基础到深入!包含全部java技术!教材下载完毕后共15G,属本人经典收藏!

Global site tag (gtag.js) - Google Analytics