JAVA笔记15 其他流
高效字符流
// BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
//
// 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
BufferedReader bfr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bfw = new BufferedWriter(new FileWriter("aa.txt"));
char[] chars = new char[1024];
int len = 0;
while ((len=bfr.read(chars)) != -1) {
bfw.write(chars, 0, len);
bfw.flush();
}
bfr.close();
bfw.close();
}
}
//BufferedReader 他有一个特有的方法,readLine() 一次读取一行内容
//bfr.readLine()
// bfw.write("\r\n");
//bfw.newLine(); //写一个换行符
//读取一行,写出一行来复制
String line=null;
while ((line=bfr.readLine())!=null){
bfw.write(line);
bfw.newLine(); //写出一个换行符,具有平台兼容性
bfw.flush();
}
bfr.close();
bfw.close();
Scanner
//InputStream in = System.in; //in 关联的是键盘
//Scanner scanner = new Scanner(in);
//Scanner(File source)
//构造一个新的 Scanner,它生成的值是从指定文件扫描的。
//
//Scanner(InputStream source)
//构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。
Scanner scanner = new Scanner(new File("username.txt"));
while (scanner.hasNextLine()){
String s = scanner.nextLine();
System.out.println(s);
}
System.out.println("---------------------------");
Scanner scanner2 = new Scanner(new FileInputStream("username.txt"));
while (scanner2.hasNextLine()) {
String s = scanner2.nextLine();
System.out.println(s);
}
}
}
内存操作流
//内存操作流,不关联任何文件,只是内存中对数据进行读写
//a:
//操作字节数组
//ByteArrayOutputStream
//ByteArrayInputStream
//此流关闭无效,所以无需关闭
//b:
//操作字符数组
// CharArrayWrite
//CharArrayReader
//c:
//操作字符串
//StringWriter
//StringReader
//ByteArrayOutputStream
//此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray () 和 toString () 获取数据。
//
//关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write("横眉冷对千夫指".getBytes());
out.write("俯首甘为孺子牛".getBytes());
//取出缓冲区中的数据
byte[] allBytes = out.toByteArray();
String s = new String(allBytes);
System.out.println(s);
// String s = out.toString();
// System.out.println(s);
//
out.close(); //此流无需关闭
//
// out.write("abc".getBytes());
//
// String s2 = out.toString();
// System.out.println(s2);
ByteArrayInputStream in= new ByteArrayInputStream(allBytes);
byte[] bytes=new byte[1024*8];
int len = in.read(bytes);
String s1 = new String(bytes, 0, len);
System.out.println(s1);
}
}
数据输入输出流
//数据输入输出流的特点,就是能够读写基本数据类型
// DataInputStream
// DataOutputStream
//writeData();
//怎么写的就怎么读,顺序不要乱
DataInputStream in = new DataInputStream(new FileInputStream("a.txt"));
boolean b = in.readBoolean();
double v = in.readDouble();
int i = in.readInt();
String s = in.readUTF();
System.out.println(b);
System.out.println(v);
System.out.println(i);
System.out.println(s);
in.close();
}
private static void writeData() throws IOException {
DataOutputStream out = new DataOutputStream(new FileOutputStream("a.txt"));
out.writeBoolean(true);
out.writeDouble(3.14);
out.writeInt(100);
out.writeUTF("你好世界");
out.close();
}
}
字节打印流与字符打印流
//打印流:只操作目的地,不关联源文件
// PrintStream 字节打印流
PrintStream printStream = new PrintStream(new FileOutputStream("b.txt"));
printStream.write("字节打印流".getBytes());
printStream.print(true);
printStream.println(100);
printStream.close();
PrintStream out = System.out;
out.write("abc".getBytes());
out.println(3.14);
System.out.println("abc");
}
}
//参数2:true 自动刷新
//如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作
PrintWriter writer = new PrintWriter(new FileOutputStream("c.txt"),true);
//writer.write("字符打印流");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.flush();
writer.close();
}
}
键盘录入的第二种方式
public class 键盘录入的第二种方式 {
public static void main(String[] args) throws IOException {
//Scanner scanner = new Scanner(System.in);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true){
System.out.println("请输入数据");
String s = reader.readLine();
//自定义一个结束标记
if("886".equals(s)){
break;
}
System.out.println(s);
}
}
}
序列化
//序列化:把对象保存到,硬盘上
//反序列化:把对象读取到内存中
//ObjectOutputStream 序列化流
// ObjectInputStream 反序列化流
//1.把一个对象,序列化的硬盘上,有个要求,要求该类实现一个Serializable接口,然后该类的对象,才能正常序列化
//2.再实现了Serializable接口之后,最好再写一个 public static final long serialVersionUID = 42L;
//writeObj();
readObj();
}
private static void readObj() throws IOException, ClassNotFoundException {
ObjectInputStream objin = new ObjectInputStream(new FileInputStream("student.txt"));
Object obj = objin.readObject();
Student student= (Student) obj;
System.out.println(student.getName());
System.out.println(student.getAge());
}
private static void writeObj() throws IOException {
Student student = new Student("zhangsan",23);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("student.txt"));
out.writeObject(student);
out.close();
}
}
// Properties 属性集合,经常用它来读写配置文件 属于双列集合
Properties properties = new Properties();//他规定了键值 是String类型
//properties.put("aaa","bbb");
//Object aaa = properties.get("aaa");
//System.out.println(aaa);
//用它特有的方法,来存储键值
properties.setProperty("陈羽凡","白百合");
String value = properties.getProperty("陈羽凡");
System.out.println(value);
//参数2,默认值,如果键没有找到对应的值,就返回默认值
String property = properties.getProperty("陈羽凡", "李小璐");
System.out.println(property);
}
}