A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-10-11 16:44 编辑

  • IO流:
  • 字节流和字符流
字节流可以读取byte类型的文件,读取出来的是字节
字符流只能读取文本文件,读取出来是char类型,当读取汉字时,可以直接读取一个          汉字
  • 字节流
                          
[Java] 纯文本查看 复制代码
 →  InputStream 字节输入流         
                           →   FileInputStream 专门操作文件的字节输入流
                           →  BufferedInputStream 带有缓冲区的字节输入流, 效率高
                           →  ObjectInputStream 对象输入流
OutputStream 字节输出流   →          FileOutputStream 专门操作文件的字节输出流
  →  BufferedOutputStream 带有缓冲区的字节输出流, 效率高
  → ObjectOuptStream 对象输出流
  → PrintStream 字节打印流
  • 字符流
[Java] 纯文本查看 复制代码
Reader字符输入流            → BufferedReader 带有缓冲区的字符输入流,效率高
→ InputStreramReader 将字节流转换为字符流输入的转换输入流
                              → FileReader 专门操作文件的字符输入流


Writer 字符输出流        → BufferedWriter 带有缓冲区的字符输出流,效率高
→ InputStreamReader 将字符流转换为字节流输出的转换输出流
   → FileWriter 专门操作文件的字符输出流
  • IO流对象各自的方法
  • InputStream抽象类
➷void close(): 释放资源
➷int read(): 一次读一个字节. 读到文件末尾返回-1 (返回int也是为了代码编写方便)
➷int read(byte[]?b): 一次读一个字节数组. 读到的字节存放在参数中的字节数组中, 返回int值是本次读到的字节的个数. 读到文件末尾返回-1
  • FileInputStream
➷FileInputStream(String name): 使用文件路径创建文件字节输入流
➷FileInputStream(File file)使用File文件路径,创建对象
  • BufferedInputStream
➷BufferedInputStream(InputStream in, int size): 使用基本流创建一个缓冲字节输入流, 设置缓冲区大小 ⊱参数1:可以传FileInputStream 参数2:表示缓冲区大小,不写则是另一个构造方法
  • ObjectInputStream
➷ObjectInputStream(InputStream in)⊱传FileInputStream
➷特有方法:readObject从文件中以字节的形式读取对象
  • OutputSteram抽象类
➹int writer():一次写一个字节,读到末尾返回-1
➹int writer(byte[] byte):一次读一个字节数组
  • FileOutputStream
➹FileOutputStream(String name):同FileInputStream
➹FileOutputStream(File file):同FileInputStream
➹FileOutputStream(File file,boolean true)
➹FileOutputStream(String name,boolean true)
  • BufferedOutputStream
➹BufferedOutputStream(OutputStream out,int size):使用基本流创建一个字节输出缓     存流,设置缓冲区大小 ⊱参数1:传FileOutputStream 参数2:缓冲区大小
  • ObjectInputStream
➹特有方法:writerObject将对象以字节的形式保存到文件当中
  • PrintStream
➹PrintStream(File file):创建字节打印流,输出到一个文件
➹PrintStream(OutputStream out):创建字节打印流,输出到一个字节输出流
➹PrintStream(String fileNmae):创建字节打印流,输出到一个文件路径
♪System.setOut(PrintStream out):设置System.out的输出目的为参数的打印流
  • Reader
➷int read()
➷int read(Char[] char)
➷void close()
  • BufferedReader
➷BUfferedReader(Reader in,int size):使用基本流创建一个字符缓冲流,可以传FileReader,size缓冲区大小
➷特有方法ReadLine()一次读一行字符串,不包含换行符
  • InputStreamReader
➷InputStreamReader(InputStream in,String charsetName):使用指定的编码码表创建转换流,参数:1. 传入自己输入流用来读取文件保存的字节2.指定的编码表名称,不指定默认为:UTF-8
  • FileReader
➷FileReader(File file)
➷FileReader(String?fileName)
  • Writer
➹abstract void close()刷新缓冲区并释放资源
➹abstract void flush()
➹void write(int c):写入一个字符(int类型为了代码编写方便)
➹void write(char[] cbuf):写一个字符数组
➹abstract void write(char[] b,int off,int len)
➹void write(String str):写入一个字符串
➹void write(String str,int off,int len)
  • BufferedWriter
➹FileWriter(File file)
➹FileWrite(String fileName)
➹FileWrite(FIle file,boolean append)
➹FileWrite(String fileName,boolean append)
  • OutputStreamWriter
➹OutputStreamWriter(OutputStrem out):使用默认编码表创建转换流
➹OutputStreamWriter(OutputStream out,String charsetName)::charsetName-编码表名称
  • FileWriter
➹FileWriter(File file)
➹FileWriter(String fileName)
➹FileWriter(File file,boolean append)
➹FIleWriter(String fileName,boolean appedn)
  • 文件路径分割符
windows:\r\n
Linux:\n
mac:\r
文件路径分割符:File.pathSeparator
File.pathSeparatorChar
文件名称分割符:File.separator
File.separatorChar

  • 编码表:
字符编码主要是GBK  一个字符占两个字节
UTF-8(系统默认) 一个字符占三个字节
  • 文件复制实例:
[Java] 纯文本查看 复制代码
FileInputStream files=new FileInputStream("day20_code\\小岳岳.jpg");
        FileOutputStream file = new FileOutputStream("day20_code\\假小岳岳.jpg");
        byte[] byt = new byte[1024];
        int len=0;
        while ((len = files.read(byt)) != -1) {
            file.write(byt,0,len);
        }

  • 将字节流转化为字符缓冲流
BufferedReader bu=new BufferedReader(new InputStreamReader(InputStream));
  • 在服务器和客户端通信时,出现阻塞状态的原因和解法
比如在客户端写入,在服务器写出
在客户端写,但是没有写-1,服务端写出循环中无法退出
在客户端写命令下,写对象.shutdownOutput关闭写,并写入-1
  • 序列化问题:
✘NotSerializableException没有序列化异常
类通过实现java.io.Serializable接口以启用其序列化。未实现接口的类将无法使用任        何状态的序列化和反序列化
✘改变原class文件中成员变量后出现InvalidClassException异常
private static final long serialVersionUID=12
♣静态不能被序列化,序列化后的都是对象
♣ transient瞬态也不能被序列化
  • Properties:
  • 方法:
∷void load(InputStream inst)读取保存在文件上的键值对
∷void load(Reader reader)
∷void store(OutputStream out,String comments)comments注释,用来解释说明保存的文件是做什么用的,不能使用中文会乱码
∷void store(Writer writer,String comments)把临时数据,持久化写入到硬盘中存储
∷Object setProperty(String key,String value)调用Hashtable的方法put
∷String getProperties(String key)通过key找vaule,此方法相当于map集合中get(Key)
∷set<String> StringPropertNames()返回属性列表中键集,其中该键及其对应的值都是字符串,此方法与map集合中keySet方法相同
  • 练习代码
[Java] 纯文本查看 复制代码
Properties p = new Properties();
        FileReader file=null;
        try {
            file= new FileReader("day20_code\\prop.properties");
            p.load(file);
            Set<String> strings=p.stringPropertyNames();
            for(String key:strings){
                String value = p.getProperty(key);
                System.out.println(key+"="+value);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (file != null) {
                try {
                    file.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

  • JDK7、JDK9TryCatch:
  • try(定义流对象,定义流对象.....){}catch(){}
  • A a=new A();
B b=new B();
try(a,b){}catch(){}

  • 网络编程
  • 本地Ip
127.0.0.1或localhost
  • 端口号:
是一个逻辑接口,我们无法直接看到,可以使用一些软件查看端口号
当我们使用网络软件已打开,那么操作系统会为网络软件分配一个随机的端口号
或者网路软件在打开的时候和系统要指定的端口号
端口号是又两个字节组成,取值范围在0-65535之间 0-1024不建议使用
  • UDP和TCP:
UDP:
        1.无连接的不可靠协议
        2.以包发送,64k一个包
        3.速度快效率高,容易丢包
TCP:
        1.有连接的可靠协议
        2.传输数据没有大小限制
        3.速度慢效率低,安全性高
  • 解决文件重名问题:
拼接的文件名, 改为: 域名+毫秒值+随机数 的方式
  • 客户端对象Socket
1.getOutputStream()获取网络字节输出流OutputStreram对象
2.getInputStream()获取网络字节输入流对象
  • 服务器对象ServerSocket:
1.accept()获取到请求的客户端对象



IO流.pdf

387.22 KB, 下载次数: 47

9-11天笔记.pdf

181.13 KB, 下载次数: 33

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马