Javaday21(messageFormat信息格式化使用)
一、messageFormat信息格式化
1 package com.chinasofti.messageFormat; 2 3 import java.text.MessageFormat; 4 5 public class MessageFormatTest { 6 public static void main(String[] args) { 7 // 创建一个字符串 其中加入占位符 {索引} 8 String str = "{0}和{1}哈哈哈哈😁"; 9 // 创建messageFormat(信息格式化)对象 参数为格式化的字符串 10 MessageFormat messageFormat = new MessageFormat(str); 11 // 使用format方法 参数是一个对象类型的可变参数 12 // 参数内写入占位符插入的信息 按照索引来写 返回出来一个格式化后的字符串 13 String format = messageFormat.format(new Object[]{"😭", "🙂"}); 14 // 输出格式化后的字符串 15 System.out.println(format); 16 } 17 }
输出结果:
二、IO
文件可以认为是相关记录或存放在一起的数据集合。
java.io.File类的对象可以表示文件和目录,在程序中一个File类对象表示一个文件或者目录,并且只能操作其属性,不能读取文件内容。
构建File文件时需要注意参数,如果参数使用的是'/'或者'\\'开头,那么系统会认为是从当前项目的盘符下寻找,如果直接写入文件名,那么系统会认为是从当前项目的根目录下寻找。
File文件可不可以描述文件夹?
可以 一个File对象描述一个文件或者目录。
Java中的相对路径有什么规则?
不是\\或者/开头的路径,在系统中会默认从当前项目的根目录下找这个文件。
当数据在逻辑上的总线上传输时,发生总线位宽大小的变化时,都需要一个缓存和流式串行传输的过程。这个工具叫做流。
- 逻辑总线由宽变窄的过程是高位宽并发传输->缓存->低位宽流式串行传输
- 逻辑总线由窄变宽的过程是低位宽流式串行传输->缓存->高位宽并发传输
- 不管如何变化,但是只要发生了逻辑总线位宽变化时均需要使用流
流的特点:
流是一串连续不断的数据集合,数据写入程序,会按照先后顺序进行传输,对于读取数据的流来说,只能先读取前面的数据,然后在读取后面的数据。
JavaI/O主要分三层:
1.流式部分:IO的主体部分。
2.非流式部分:主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类等
3.其他类:文件读取部分与安全相关的类。
Java中的使用io去进行数据读取操作时,如果无法读取到数据,那么就会造成读取数据的线程阻塞。
因此在读取数据时,要保证数据读取的数量以及顺序。
如果需要将Java中的数据缓存在内存中,那么最适宜的数据类型就是byte[],因为Java中数据类型占据的空间是byte的整数倍。
FileOutputStream继承自OutputStream抽象类,是进行文件内容写操作的最基本类工具,可以将数据输出到文件中。
InputStream:
Java的IO模型设计非常优秀,它使用Decorator模式,按功能划分Stream,我们可以动态装配这些Stream,以便获得需要的功能。例如需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream
InputStream类也是一个抽象类,提供了Java中以字节为单位的读取数据的公开接口,大部分字节输入流都是继承自该抽象类。
三、DataInput以及DataOutput
DataOutput接口规定了一组操作,用于实现一种与机器无关的方式,直接向流中输入java基本数据类型的数据和字符串。
DataOutput对基本数据类型的写入分别提供了不同的方法,方法名满足writeXXX()的规律,其中XXX即为基本类型说明符(首字母大写),如writeInt()表示向流中写入一个int型数据
写入字符串的方法为writeUTF(),该方法的功能声明将标准的UTF-8字符编码表示形式做出了稍许修改
FilterOutputStream是用来封装其他的输出流,并为他们提供额外的功能,他的实现主要包括:BufferedOutputStream,DataOutputStream和PrintStream。
BufferedOutputStream:是用来提供输出流缓冲功能。
DataOutputStream:用来装饰其他输出流,实现了DataOutput接口,将DataOutputStream和DataInputStream输入流配合起来使用,允许应用程序与机器无关的方式从底层输入流中读写基本类型的数据和字符串。
PrintStream:用来装饰其他线程,它能为其他的输出流能够方便的打印各种数据值形式。
DataInput接口规定了一组操作,用于实现一种与机器无关的方式,直接在流中读取基本数据类型的数据和字符串。
DataInput对基本数据类型的读取分别提供了不同的方法,方法名满足readXXX()的规律,其中XXX即为基本类型说明符(首字母大写),如readInt()表示从流中读取一个int型数据
读取字符串的方法为readUTF(),该方法的功能声明将标准的UTF-8字符编码表示形式做出了稍许修改,接口还提供了readLine()方法,但是在一些常用的实现中不建议使用
事实上,DataInput和DataOutput对应,即DataInput读取由DataOutput写入的数据
在数据拷贝时,nio在高并发情况下效率要比io高。
1 package com.chinasofti.iofile; 2 3 import java.io.*; 4 5 public class DataInputStream { 6 7 public static void main(String[] args) { 8 write(); 9 read(); 10 } 11 12 public static void write(){ 13 File file = new File("D:/testfile/a.txt"); 14 FileOutputStream fos = null; 15 // 使用DataOutputStream来修饰fos文件输出流 16 // 使其可以输出java基本数据类型的数据 17 DataOutputStream dos = null; 18 try { 19 fos = new FileOutputStream(file,true); 20 // 创建对象时需要传入被修饰的输出流 21 dos = new DataOutputStream(fos); 22 23 // 输出流中添加数据 24 dos.writeInt(123456); 25 dos.writeBoolean(true); 26 dos.writeUTF("嘻嘻哈哈"); 27 28 } catch (FileNotFoundException e) { 29 e.printStackTrace(); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 }finally { 33 try { 34 if (dos!=null)dos.close(); 35 if (fos!=null) fos.close(); 36 } catch (IOException e) { 37 e.printStackTrace(); 38 } 39 } 40 } 41 42 public static void read(){ 43 File file = new File("D:/testfile/a.txt"); 44 FileInputStream fos = null; 45 java.io.DataInputStream dos = null; 46 try { 47 fos = new FileInputStream(file); 48 dos = new java.io.DataInputStream(fos); 49 50 // 注意在读入的时候需要按照文件中内容的顺序去读 51 // 不然会产生读取内容和实际内容不符 52 System.out.println(dos.readInt()); 53 System.out.println(dos.readBoolean()); 54 System.out.println(dos.readUTF()); 55 } catch (FileNotFoundException e) { 56 e.printStackTrace(); 57 } catch (IOException e) { 58 e.printStackTrace(); 59 }finally { 60 try { 61 if (dos!=null)dos.close(); 62 if (fos!=null) fos.close(); 63 } catch (IOException e) { 64 e.printStackTrace(); 65 } 66 } 67 68 } 69 }
执行结果:
四、回推
回推用于输入流,以允许读取字节,然后再将他们返回(回推)到流中,PushbackInputStream类实现了这一思想,提供了一种机制,可以偷窥来自输入流的内容而不对其造成破坏。
PushbackInputStream的构造方法:
PushbackInputStream(InputStream inputStream)
PushbackInputStream(InputStream inputStream,int numBytes)
第一种形式创建的流对象允许将一个字节回推到输入流中。
第二种形式创建的流对象可以回推numBytes个字节,有一个numBytes的长度的回推缓存。
- 除了熟悉的来自InputStream的方法外,PushbackInputStream类还提供了unread()方法:
- void unread(int b)
- void unread(byte[] buffer)
- void unread(byte[] buffer,int offset,int numBytes)
- 第一种形式回推b的低字节,这会使得后续的read()调用会把这个字节再次读取出来。
- 第二种形式回推buffer中的字节。
- 第三种形式回推buffer中从offset开始的numBytes个字节。当回推缓存已满时,如果试图回推字节,就会抛出IOException异常
package com.chinasofti.iofile; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PushbackInputStream; public class PushbackInputStreamTest { public static void main(String[] args) { try { FileInputStream fileInputStream = new FileInputStream("d:/testfile/a.txt"); /* PushbackInputStream pushbackInputStream = new PushbackInputStream(fileInputStream); // byte[] bytes = new byte[fileInputStream.available()]; // fileInputStream.read(bytes); int i = 0; while ((i=pushbackInputStream.read())!=-1){ System.out.print((char)i); // 当输入进来a时 回推一个字符 然后插入z if(i=='a'){ pushbackInputStream.unread('z'); } }*/ PushbackInputStream pushbackInputStream = new PushbackInputStream(fileInputStream, 2); int i = 0; byte[] bytes = new byte[2]; // pushbackInputStream.read(bytes)一下将bytes数组填满 while ((i = pushbackInputStream.read(bytes)) != -1) { System.out.print(new String(bytes) + " "); if (new String(bytes).equals("da")) { pushbackInputStream.unread(new byte[]{'m', 'z'}); } bytes = new byte[2]; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
- PushbackInputStream对象会使得InputStream对象(用于创建PushbackInputStream对象)的mark()或reset()方法无效。对于准备使用mark()或reset()方法的任何流来说,都应当使用markSupported()方法进行检查
- 程序对应的基本输入为键盘输入,基本输出为显示器输出。Java中,System类的in和out两个成员代表了基本输入输出的抽象
- System.in:
- 基本输入,对应InputStream
- System.out:
- 基本输出,对应PrintStream